Subject: Re: Fråga: sql-fråga till flera parallella Postrgesdatabaser

Re: Fråga: sql-fråga till flera parallella Postrgesdatabaser

From: Anders Wallenquist <aw_at_kreawit.se>
Date: Tue, 02 Oct 2012 13:15:55 +0200

2012-10-02 12:51, Magnus Hagander skrev:
> 2012/10/2 Anders Wallenquist <aw_at_kreawit.se>:
>> 2012-10-02 11:44, Magnus Hagander skrev:
>>
>>> 2012/10/2 Anders Wallenquist <anders.wallenquist_at_vertel.se>:
>>>> Kanske är detta listan för detta: jag vill ansluta dovecot/postfix för
>>>> att
>>>> ställa autenticering och leveransfrågor till postgress. Så långt allt
>>>> väl,
>>>> finns bra dokumentation. Men jag vill dessutom ställa dessa frågor till
>>>> ett
>>>> tiotal eller fler databaser med samma tabellstruktur. Användarid är unikt
>>>> mellan databaserna men frågan måste ställas till flera.
>>> Betyder det att datan är shardad, så att olika användare finns på
>>> olika noder? Den viktiga frågan då är om det är deterministisk
>>> sharding, eller om du faktiskt måste titta på alla noder. Är det
>>> deterministisk sharding kan t.ex. pl/proxy vara precis det du behöver.
>>
>> deterministisk sharding är ett nytt begrepp för mig. Jag har flera databaser
> Finns risk att jag hittade på det själv :)
> Poängen är att shardingen är baserat på en deterministisk funktion.
> Alltså att du enbart utifrån den information som finns in din query
> kan räkna fram vilken shard den ligger på, utan att behöva gå till en
> uppslagningstabell.
>
>
>> med en "admin" och ett företag för varje databas, varje admin kan lägga upp
>> obegränsat med användare i "sin" databas som därmed utgör en original-källa
>> och en unik domän. Ändringar som sker om respektive användare i den lokala
>> databasen är det som gäller och som dovecot/postfix skall prenumerera på.
> Låter som en distribution i teorin kan vara på hash:en av domänet?
>
>
>>>> 1) Går det att låta postfix (dovecot) ställa frågan till flera källor, i
>>>> bästa fall lista källorna dynamiskt? Har bara använt en källa i taget
>>>> hitills, men det ser ut som om man skulle kunna lista flera.
>>> inte rakt av, men du kan göra bra saker i kombination med pgbouncer.
>>> Om du t.ex. returnerar ett DNS-record med multipla IPn till pgbouncer
>>> kommer den köra round-robin load balancing över dem. Ett annat
>>> populärt alternativ är att kombinera pgbouncer med haproxy. Båda
>>> fungerar mycket bra.
>>>
>>> Det förutsätter att du har samma data i alla databaser. Har du inte
>>> det, utan den är shardad, så skulle jag rekommendera en titt på
>>> pl/proxy.
>>
>> Det låter mer som om datat är shardad, orsaken att det finns flera databaser
>> är inte redundans utan att varje databas representerar en egen domän.
> Ok.
>
>
>> PL/Proxy is a database partitioning system implemented as a PL language.
>> Main
>> idea is that proxy functions are created with same signature as the remote
>> functions to be called, so only destination info needs to be specified
>> inside
>> proxy function bodies.
>>
>> Det jag läser om PL/Proxy och Cluster på
>> http://wiki.postgresql.org/wiki/Clustering handlar mer om HA och
>> lastfördelning.
> Det beror nog på att du tittar på Clustering :)
>
>
>> Jag är mer ute efter att kunna ställa frågan
>>
>> select passwd from *.users where username = "kalle_at_example.com"
>>
>> där * representerar databas1.users, databas2.users, example_com.users etc
>> och "kalle_at_example.com" finns i en av databaserna.
> Det fixar PL/Proxy, förutsatt att du kan skriva om alla dina queries
> till funktionsanrop. E.g. SELECT get_password('kalle_at_example.com').

Har du några exempel på hur en sådan funktion skulle kunna se ut
(tittade även på dblink, tack william) men klurade inte ut syntaxen så
att min postgress-instans accepterade koden?

/Anders

>
>
>>>> 2) Formulera en fet SQL-fråga som ställer frågorna i flera databaser
>>>> eller
>>>> gömma detta i en view?
>>> Bara om du använder pl/proxy i det fallet - för du måste ju ha noden
>>> med själva vyn uppe.
>>>
>> Det är helt ok om jag ställer frågan mot en funktion i stället för en
>> tabell:
>>
>> select passwd from all_users() where username = "kalle_at_example.com"
>>
>> och lägga vyn/funktionen i en master-databas. Det viktiga är att jag snurrar
>> igenom en lista med databaser och ställer samma fråga mot var och en,
>> alternativt är nöjd vid första träff / konkatenerar alla svar (nu skall det
>> inte finnas dubletter i praktiken). Antingen är det en explicit lista eller
>> baserat på ägare/rättigheter.
> Vill du ha den på alla noder kan du använda RUN ON ALL. Det tappar du
> förstås performance på, men om du inte kan definiera vilka noder varje
> shard ska gå på så ska det fungera.
>
>
>> En alternativ lösning är att skriva ett fristående program och låta
>> dovecot/postfix ropa på det om det är möjligt.
> Det går definitivt med postfix, men jag kan dovecot för dåligt för att
> veta om den klarar det.
>

_______________________________________________
http://www.foss-sthlm.se/
http://cool.haxx.se/cgi-bin/mailman/listinfo/foss-sthlm
Received on 2012-10-02