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

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

From: Magnus Hagander <magnus_at_hagander.net>
Date: Tue, 2 Oct 2012 12:51:14 +0200

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').

>>> 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.

-- 
 Magnus Hagander
 Me: http://www.hagander.net/
 Work: http://www.redpill-linpro.com/
_______________________________________________
http://www.foss-sthlm.se/
http://cool.haxx.se/cgi-bin/mailman/listinfo/foss-sthlm
Received on 2012-10-02