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.