Postgres-Cluster?

Hallo zusammen,

ich möchte gerne unsere derzeitige PostgreSQL-Umgebung aktualisieren. Vielleicht hat jemand Verbesserungsvorschläge?

Ist-Zustand:

  • eine Postgres-DB für interne und externe Applikationen

  • täglich 3.5 Mio. externe Transaktionen (RW) in eine bestimmte Tabelle

  • interne Applikationen führen nur lesende (RO) Abfragen auf diese Tabelle aus

  • wegen der Größe wird die Tabelle in Monatsscheiben aufgeteilt

  • Sicherungsverfahren durch COPY/rsync

  • keine Hotstandby



    Soll-Zustand:

  • Entlastung der DB durch die Trennung interner und externer Abfragen (Monatsscheiben für interne Applikationen auf eine zweite DB)

  • Hotstandby-/Cluster-Funktionalität


Hier mein Grobkonzept:

ext. App.
   |
   |
  NODE1                      <--heartbeat-->  NODE2
  DB1(postgresql1/aktiv)     ---DRBD------->  DB1(postgresql1/inaktiv)       
                |
                |
                ---slony rep---
                              |
  DB2(postgresql2/inaktiv)    --------------> DB2(postgresql2/aktiv)
                     ^                          | |
                     |                          | |
                     ---------- COPY ------------ |
                                                  |
                                                int. App.

- DB1 ist die DB für die externe Applikation.
- DB2 ist die DB für die interne Applikation.
- DB1 und DB2 sind unterschiedliche Prozesse. DB1 läuft auf Port 5432, DB2 auf 5431.
- Auf dem NODE1 ist nur DB1 aktiv, auf dem NODE2 nur DB2.                                    
- Failover mittels heartbeat. DB1 wird gestartet, DB2 gestoppt.         
- Sollte ein NODE ausfallen, werden beide DBs auf dem aktiven NODE gestartet.
- DB1 wird durch zwei DRBD-Partitionen (drbd0-/var/lib/pgsql; drbd1-/var/lib/pgsql/pg_xlog) 
  von NODE1 auf NODE2 gesynct
- Die von der externen Applikation aktuelle Monats-Tabelle wird per Slony auf DB2/NODE2 repliziert.
- DB2 wird per COPY/dump gesichert.

Kann man das so machen? Oder würdet ihr an irgendeiner Stelle anders vorgehen?

Ich könnte für die zweite DB auch eine weitere DRBD-Partition erstellen. Dann wäre es vielleicht übersichtlicher. Dann würde die Synchronisation so aussehen:

Anstatt das...:

NODE1             NODE2
DB1   --DRBD--->  DB1
 |
 -------SLONY-->  DB2
                   |
DB2   <--COPY-------



diese Variante:

NODE1             NODE2
DB1   --DRBD--->  DB1
DB2   <---DRBD--  DB2

Das wäre jedoch mit dem Nachteil verbunden, dass schreibende Transaktionen auf DB2 auch DB1 (wegen Synchronisation) belasten. Vorteil, ganz klar: ich habe beidseitig eine Hotstandby. Für interne sowie auch externe Applikationen.

Vielen Dank und viele Grüße,

pingufreak

p.s. ich hoffe ich habe das verständlich zusammengefasst?

hi,

hab mir das jetzt drei mal durchgelesen (liegt nicht an dir :wink: ). wird auf jeden fall was größeres. praktisch hab ich sowas mit postgres noch nicht gemacht (bin ja noch nicht so lange dabei) aber rein aus theoretischer sicht schaut es gut aus.

wenn du hot-stand-by brauchst und der (imo bei entsprechenden platten/raid systemen geringen) performanceverlust verkraftbar ist, würde ich an deiner stelle die zweite möglichkeit nehmen.

die frage ist halt, wie wichtig ist die datenbank. wenn eine ausfallzeit von 5 - 30 minuten verkraftbar sind und sich das auch in der nächsten zeit nicht ändert, dann verwend die erste version.

was mich auf jeden fall interessiert ist, wenn du fertig bist zum einen wie du es gemacht hast und wie es funktioniert. bin ja net neugierig :wink:

cu tb.

Hi Xandrian,

ich tendiere mittlerweile auch eher zur zweiten Variante. Falls es von der Performance nicht reicht, kann ich immernoch schnellere Platten oder bessere Hardware mit einbauen. Hauptsache die Sicherheit geht vor.

Ich habe jetzt die zweite Variante als Testsystem mit zwei alten Windows-Clients aufgesetzt.

Das funktioniert auch ganz gut. Wenn du willst, kann ich gerne mal die kompletten Configs hier posten?!?

Viele Grüße,

pingufreak

hi,

klar her damit :wink: dann hab ich - und natürlich auch andere - wenn sie sowas nachbauen wollen ein einfacheres spiel.

cu tb.

Hi,

ich hatte das jetzt so gemacht, dass heartbeat die zweite DB stoppt, bevor die erste gestartet wird (also resource-skript kopiert und stop gegen start getauscht). Jedoch ist das ein bisschen blöd, da heartbeat nicht DB1 hochfährt, wenn DB2 nicht gestartet ist, bzw. wenn das stop-skript für DB2 fehlschlägt.

Ich bin am überlegen, die zweite DB immer manuell einzuhängen. Das ist in dem Fall einfacherer und auch sicherer. Aber vielleicht fällt mir noch was besseres ein. Mal gucken.

Ich poste die Konfigurationen die Tage, wenn ich sicher bin, dass alles 100%ig ok ist :slight_smile: .

Viele Grüße,

pingufreak

hab hier ein tar.bz2 für dich! :slight_smile: kanns nur nich ins forum laden… :frowning:

hi,

datei ist jetzt verfügbar: http://muell.tobias-bauer.de/pgforum000002.tar.bz2

viel spaß damit.

cu tb.