Automatisieren des Failovers in PostgreSQL 9.1

18

Wie richtet man zwei identische Server für das automatische Failover in PostgreSQL 9.1 ein?

OS

Centos 5
PostgreSQL 9.1 aus dem Quellcode kompiliert
Das Benutzerkonto postgres ist auf beiden Computern vorhanden und verfügt über einen SSH-Schlüssel ohne Kennwort, um eine Verbindung zu beiden Computern herzustellen.

Mein aktuelles Setup:

Master Server Konfiguration:

postgresql.conf:

listen_address = '*'
wal_level = hot_standby
max_wal_senders = 3
checkpoint_segments = 16    
wal_keep_segments = 8 
archive_mode = on    
archive_command = 'cp "%p" /opt/pgsql91/archive/"%f"'  

pg_hba.conf:

 host  replication   all   10.0.66.1/32      trust
 host  replication   all   10.0.66.2/32      trust

Standby-Server

postgresql.conf und pg_hba.conf sind identisch mit der Konfiguration auf dem Master-Server.

recovery.conf:

 standby_mode = 'on'
 primary_conninfo = 'host=10.0.66.1'
 trigger_file = '/opt/pgsql91/data/trigger.txt'

Dank hzRoot verstehe ich jetzt, wie ich den Server von Standby auf Master umstellen kann.

Mit den folgenden Befehlen kann ich den neuen Slave mit dem neuen Master synchronisieren und dann die Replikationssicherung ausführen.

Auf dem neuen Master (10.0.66.2)

  1. su - postgres
  2. Berühren Sie trigger.txt in / opt / pgsql91 / data /.
  3. recovery.conf wird zu recovery.done
  4. psql -c "; SELECT pg_start_backup ('backup', true)";
  5. rsync -a -v -e ssh / opt / pgsql91 / data / 10.0.66.1:/opt/pgsql91/data/ --exclude postmaster.pid
  6. psql -c "; SELECT pg_stop_backup ()";

Auf den neuen Sklaven (10.0.66.1)

  1. Erstellen Sie die recovery.conf: cp recovery.done to recovery.conf
  2. vi recovery.conf IP-Adresse ändern: primary_conninfo = 'host = 10.0.66.2'
  3. starte postgresql

Also meine Fragen sind jetzt:

  1. Ist dies der richtige Weg, um die Rollen zu wechseln?
  2. Hat jemand diesen Prozess automatisiert, wenn ja, was haben Sie getan?
  3. Wenn die synchrone Replikation aktiviert ist, stellte ich fest, dass der neue Masterserver keine Transaktionen festschreibt, da er auf die Antwort des Slaves wartet. Es gibt jedoch keinen Slave, da der andere Server, der alte Master, ausgefallen ist. Ist dies korrekt oder muss ich die synchrone Replikation vorübergehend deaktivieren, während der neue Slave inaktiv ist?
Craig Efrein
quelle
1. Ja, richtig 2. Vielleicht ist es besser, diesen Prozess nicht zu automatisieren. 3. Sie brauchen also mindestens 2 Sklaven und 1 Master. denn wie gesagt synchronisieren. Für die Replikation sind mindestens 2 Knoten erforderlich, um die Commits-Synchronisierung zu übertragen. Wenn es nur einen Master-Knoten gibt, können Sie kein Commit durchführen.
sftsz
Die Schritte 4, 5 und 6 sind auf dem neuen Master nicht erforderlich, da Sie zunächst replizieren. Zweitens: Was wäre, wenn der Master gestorben und offline wäre? Sie könnten keine Verbindung zu ihm herstellen. Die Schritte 4, 5 und 6 werden normalerweise auf einem neuen Slave-Knoten ausgeführt, der dem Replikationspool beitritt.
Eric
@Eric Während ich damit spielte, sind die Schritte 4,5,6 erforderlich, um den alten Meister wieder in den Arbeitszustand zu versetzen. Wenn Sie den Standby-Modus sofort als neuen Primärmodus festlegen, wird ein neuer WAL-Eintrag erstellt, sodass dieser 1 Eintrag vor dem alten Master liegt. Das Starten des alten Masters im Standby-Modus warf Fehler auf mich, sodass ich Schritte 4,5,6 auf dem alten Master ausführen musste, um ihn mit dem neuen Master zu synchronisieren (mithilfe von pg_basebackup, das das gesamte xlog vom neuen Master streamen kann - ersetzt die Schritte 4,5,6 in postgres> = 9,1 (glaube ich). Habe ich Recht oder habe ich etwas falsch gemacht und das sollte nicht nötig sein?
Dalibor Filus

Antworten:

8

Check out repmrg :

repmgr ist eine Reihe von Open-Source-Tools, mit denen Datenbankadministratoren und Systemadministratoren einen Cluster von PostgreSQL-Datenbanken verwalten können.

Durch die Nutzung der in PostgreSQL 9 eingeführten Hot Standby-Funktion vereinfacht repmgr das Einrichten und Verwalten von Datenbanken mit hohen Anforderungen an Verfügbarkeit und Skalierbarkeit erheblich.

repmgr vereinfacht die Verwaltung und das tägliche Management, steigert die Produktivität und senkt die Gesamtkosten eines PostgreSQL-Clusters durch:

  • Überwachen des Replikationsprozesses; Ermöglichen, dass DBAs hohe Werte ausgeben
  • Verfügbarkeitsoperationen wie Umschaltungen und Ausfälle.

Es macht zwei Dinge:

  1. repmgr: Befehlsprogramm, das Aufgaben in Ihrem Cluster ausführt und dann beendet
  2. repmgrd: Verwaltungs- und Überwachungsdämon, der den Cluster überwacht und Remote-Aktionen automatisieren kann.

Bei einem automatischen Failover erledigt repmgrd den Trick und ist kein SPOF in Ihrem Netzwerk wie pgPool. Es ist jedoch weiterhin wichtig, alle Deamons zu überwachen und nach einem Fehler wieder zu starten.

Version 2.0 wird veröffentlicht, einschließlich RPMs.

Frank Heikens
quelle
Hallo Frank, danke für deine Antwort. Ich habe noch nichts von repmrg gehört und werde es auf jeden Fall versuchen.
Craig Efrein
Hallo nochmal frank, danke für den repmgr, es war genau das was ich gesucht habe. Ich muss es heute endlich ausprobieren.
Craig Efrein
4

In Ihrer Datei recovery.conf sollten Sie eine Zeile einfügen, die postgres anweist, ein Failover von Master zu Slave durchzuführen. Sie sollten hinzufügen

trigger_file = '/any/file/to/trigger'

Wenn Sie diese Datei auf dem angegebenen Pfad erstellen. Knoten werden sich ändern. (Datei enthält nichts, es ist nur ein Auslöser)

Weitere Informationen zur Streaming-Replikation finden Sie hier

Auf der anderen Seite wird es möglich sein, es mit ein paar Tricks automatisch zu erstellen, aber die Verwendung von Überwachungstools und das Erstellen von Failover-Handbüchern sind besser.

sftsz
quelle
Danke für die Antwort. Es kann ein paar Tage dauern, bis ich es testen kann, aber ich werde auf jeden Fall auf Sie zurückkommen.
Craig Efrein
Ich gebe Ihnen +1 für die Antwort von trigger_file, was mir geholfen hat, den Prozess erheblich zu rationalisieren. Es ist nicht die vollständige Antwort, wie der Prozess vollständig automatisiert werden kann. Eine andere Sache, die mir aufgefallen ist, ist, dass Transaktionen nicht abgeschlossen werden konnten, während der Master inaktiv war, da er auf die Bestätigung durch den Master wartete. Dies wurde durch asynchrone Replikation
behoben
Das ist ziemlich genial. Ich habe viele Kritikpunkte bezüglich der mangelnden Flexibilität der PostgreSQL-Replikationsimplementierung, aber dies ist eine großartige, einfache Möglichkeit, ein Failover durchzuführen.
Aaron Brown
1
Es übernimmt jedoch die Master-Rolle, auch wenn der Master selbst noch ausgeführt wird (Sie haben also zwei Master). Dies wird von postgres selbst nicht automatisiert.
Dalibor Filus
0

Hat jemand darüber nachgedacht, pgpool-II dafür zu verwenden?

http://pgpool.projects.postgresql.org/contrib_docs/simple_sr_setting/index.html

Ich richte die Replikation für PostgreSQL ein. Es scheint, dass der schwierige Teil passiert, wenn der alte Meister zurückkommt.

Nach dem, was ich gelesen habe, scheint pgpool das meiste davon automatisieren zu können. Ich bin mir jedoch nicht sicher, ob die bereits in PostgreSQL 9.1 vorhandenen Replikationsfunktionen genutzt werden.

Paulo SantAnna
quelle
1
pgPool ist ein Single Point of Failure, man verliert alles, wenn es ausfällt.
Frank Heikens
1
Vielen Dank für Ihre Antwort. Ich habe PGPool II mit gemischten Ergebnissen sowohl unter CentOS als auch unter Debian ausprobiert und schließlich aufgegeben.
Craig Efrein
1
Warum nicht pgpool II mit HAproxy verwenden? Mit einem Herzschlag und schwebenden IP-Listening?
Mikiemorales
Aus historischen Gründen läuft pgpool-ii derzeit auch nicht unter Windows.
26.