PostgreSQL-Failover - Welche Tools sollte ich verwenden?

8

Hier ist das Szenario:

Es gibt zwei Maschinen, auf denen CentOS 6.2 ausgeführt wird - Maschine0 und Maschine1

In beiden ist PostgreSQL 9.1 installiert.

Einer von ihnen sollte als Mastersystem aktiv sein und durch asynchrone Streaming-Replikation auf dem anderen Computer sollte der Standby-Modus Änderungen vom Mastersystem in die Datenbank kopieren.

Angenommen, Maschine0 ist der Master und Maschine1 ist der Standby am Anfang.

Wenn der Master (z. B. machine0) ausfällt (ein Fehler bedeutet hier, dass der Postgresql-Server abstürzt), sollte der Standby vom Master übernommen werden und der neue Master werden.

Bei Maschine1 übernimmt der neue Master alle Datenbankoperationen. Wenn der Postgresql-Server in Maschine0 wieder online ist, sollte er in den Standby-Modus versetzt werden. Beginnen Sie mit der Synchronisierung ab dem Punkt, an dem er den Kontakt zu Maschine1 verloren hat, und kopieren Sie alle Änderungen in die Datenbank. Bleiben Sie im Standby-Modus.

Wenn Maschine1 ausfällt, wiederholt sich der gesamte Zyklus.

Wenn der Standby-Modus fehlschlägt und wieder online ist, sollte er vom Master lesen und Daten synchronisieren.

Ich bin verwirrt darüber, welche Tools ich zum Einrichten verwenden muss, da ich verstehe, dass PostgreSQL standardmäßig nicht mit einem Failover geliefert wird.

Wenn mich jemand mit Threads / Seiten verknüpfen kann, die beschreiben, wie ich das mache, was ich versuche, bin ich wirklich dankbar.

Wingedrhino
quelle
Ich habe Probleme mit UCARP, wenn ich VIP nicht pingen kann
Haben Sie eine Lösung, um UCARP mit CentOs zu konfigurieren
Ich weiß nicht, ob es Ihnen gelungen ist, was Sie wollten, aber hier sind ein paar Schritt-für-Schritt-Anleitungen für das, was Sie wollen: howtoforge.com/… library.linode.com/linux-ha/… Ich hoffe, dies hilft.
Dragan Matic

Antworten:

5

Wenn Sie an synchroner DB-Replikation und Failover interessiert sind, habe ich einen Vorschlag. Sie können zwei Tools verwenden:

  • DRBD (Disk Replicated Block Device) bietet eine Replikation auf Festplattenebene (synchron) zwischen Festplatten auf zwei verschiedenen Servern. Die Festplattenänderungen werden über das Netzwerk repliziert. Es ist am besten, ein Crossover-Kabel an eth2 für die Netzwerkkarten mit dem Netzblock 192.168.xx zu verwenden.

  • ucarp ermöglicht die DBVIP-Verwaltung und das Failover zwischen zwei verschiedenen Servern.

Sie können sie in Verbindung wie folgt verwenden:

  • DBServer1 hat die IP 10.1.2.30
  • DBServer2 hat IP 10.1.2.40
  • DB VIP ist 10.1.2.70

Richten Sie ucarp auf zwei verschiedenen Servern so ein, dass jede ucarp-Instanz über eine virtuelle Router-ID mit der anderen kommuniziert

DBServer1 wird haben

/usr/local/sbin/ucarp -v 200 -p sometagname --interface=eth2 -a 10.1.2.70 -s 10.1.2.30 -b 3 -r 5 --upscript=/usr/local/sbin/vip-up.sh --downscript=/usr/local/sbin/vip-down.sh --neutral -z -B

DBServer2 wird haben

/usr/local/sbin/ucarp -v 200 -p sometagname --interface=eth2 -a 10.1.2.70 -s 10.1.2.40 -b 4 -r 5 --upscript=/usr/local/sbin/vip-up.sh --downscript=/usr/local/sbin/vip-down.sh --neutral -z -B

Was ist der Grund, warum -b (Broadcasts) 3 auf einem Server und 4 auf dem anderen ist? Wenn beide Server neu gestartet werden, bringt der Server mit dem niedrigsten -b zuerst ucarp. Was -r betrifft, ist dies das Totverhältnis. Somit wird DBServer1 in 15 Sekunden (3X5) und DBServer2 in 20 Sekunden (4X5) gestartet.

Angenommen, DBServer1 stürzt ab. ucarp auf DBServer2 sucht 20 Sekunden lang nach einem Handshake von ucarp auf DBServer1. Wenn nichts erkannt wird, übernimmt das Skript vip-up.sh auf DBServer2 die Kontrolle über DBVIP.

OK, all dies ist nur für das Failover und die DBVIP-Verwaltung vorgesehen. Was ist mit der PostgreSQL-Datenbank? Überraschenderweise läuft PostgreSQL jeweils nur auf einem Server. Wer DBVIP hat, sollte DRBD im Primärzustand haben. Dies knüpft wieder an das Vip-Up-Skript an. Wie schreibt man es?

Hier ist das Skript /usr/local/sbin/vip-down.sh (konzeptionell)

#! /bin/sh
exec 2> /dev/null
/sbin/drbdadm disconnect drbd0
/sbin/drbdadm  primary drbd0 &&
/bin/mount postgres-data-folder /mnt/drbd0
/sbin/ip addr add 10.1.2.70/24 dev eth2
/sbin/service postgres start &&
/usr/local/sbin/vipmon.sh &
touch /tmp/vip-up

Hier ist das Skript /usr/local/sbin/vip-down.sh (konzeptionell)

#! /bin/sh
exec 2> /dev/null
/sbin/service postgres stop
/bin/umount -l  /dev/drbd0
/sbin/drbdadm secondary drbd0
/sbin/ip addr del 10.1.2.70/24 dev eth2
/bin/rm /tmp/vip-up
/usr/bin/killall -9 ucarp
/usr/local/sbin/vip-down.sh
kill `ps auxww | grep vipmon | awk '{print $2}'`

Sie müssen lediglich pg_hba.conf einrichten, um sicherzustellen, dass alle Benutzer über 10.1.2.70 kommen

Im Wesentlichen führt vip-up diese Sequenz durch

  • Lassen Sie DRBD in die Grundschule gehen
  • Hängen Sie den Postgres-Datenordner in / dev / drbd0 ein
  • Startup postgres
  • Starten Sie den Vipmon-Prozess

Im Gegensatz dazu führt vip-down diese Sequenz durch

  • Postgres herunterfahren
  • unount / dev / drbd0
  • Lassen Sie DRBD sekundär werden

Was ist mit vipmon.sh? Sie können ein Skript erstellen, um in einer unbestimmten Schleife den Status von postgres (es wird ausgeführt) zu überprüfen und das DRBD-Gerät zu überprüfen (können Sie trotzdem in den Ordner mit den Postdaten schreiben).

Mit diesem Setup haben Sie Postgres auf der DRBD-Primärdatenbank und eine Kopie des Postgres-Datenordners auf Festplattenebene auf dem anderen DBServer (der DRBD-Sekundärseite). postgres läuft nicht auf dem DRBD Secondary.

Wenn ein Failover auftritt, benötigen Sie nur Zeit, damit ucarp erkennt, dass es sicher ist, die Postgres-Daten bereitzustellen, Postgres zu starten und das Vipmon-Skript zu aktivieren.

Das Besondere an diesem Setup ist, dass der DBServer, der zu DRBD Primary wird, im Falle eines Failovers eine Kopie des Servers auf 100% Festplattenebene haben sollte, von dem aus Sie einen Fehler gemacht haben. Das Starten von Postgres sollte Sie daher auf einen konsistenten Zustand bringen. Die Transaktionsprotokolle (in pg_xlog) sollten aktuell sein (abzüglich der Unterbrechung aufgrund eines Failovers).

Ich hoffe diese Vorschläge helfen. Obwohl ich ein MySQL-DBA bin, verwende ich MySQL und DRBD regelmäßig beim Webhosting-Unternehmen meines Arbeitgebers. Ich habe MySQL / DRBD auf die oben beschriebene Weise installiert. Ich habe dies einmal für einen Client mit PostgreSQL / DRBD gemacht. Es funktioniert großartig. Es ist Open Source. Sie müssen nur die erforderliche Sorgfalt beim Erlernen von DRBD und ucarp anwenden. Dies würde das erneute Verbinden von DRBD nach einem Failover, das Behandeln eines Split-Brain-Szenarios, bei dem beide DB-Server primär werden, und ähnliche Dinge umfassen.

RolandoMySQLDBA
quelle
UPDATE: Ein kurzer Besuch auf der Website von DRBD und etwas Lesen hat meine obige Frage beantwortet. Und das von Ihnen erwähnte Setup scheint das perfekte Werkzeug zu sein. Ich werde es immer noch zu schätzen wissen, wenn Sie mich mit ein paar netten Lektionen / Tutorials zu den oben genannten Themen verknüpfen, da ich beabsichtige, es über das Wochenende zu lernen :)
wingedrhino
Hallo, dies wird nicht berücksichtigt, wenn nur der Postgres-Server (Dienst) ausfällt. Der Computer ist noch aktiv und verfügt über die virtuelle IP-Adresse, der Dienst wird jedoch nicht auf diesem Computer ausgeführt.
GypsyCosmonaut