Eine eigenständige Instanz in einen Patroni-Cluster überführen
Dieser Abschnitt beschreibt, wie eine eigenständige PostgreSQL-Instanz in einen Patroni-Cluster überführt wird.
Zur Bereitstellung eines Patroni-Clusters ohne bestehende PostgreSQL-Instanz siehe Ausführen und Konfigurieren .
Vorgehen
Nachfolgend stehen die Schritte zur Übernahme eines bestehenden Postgres-Clusters in die Verwaltung durch Patroni. Dabei wird vorausgesetzt, dass alle Knoten des bestehenden Clusters aktuell laufen und die Postgres-Konfiguration während der Migration nicht geändert werden soll. Die Schritte:
-
Die Postgres-Benutzer wie im Abschnitt authentication der Patroni-Konfiguration beschrieben anlegen. Der folgende Codeblock enthält SQL-Beispiele zum Anlegen der Benutzer; Benutzernamen und Passwörter müssen an die eigene Umgebung angepasst werden. Sind die entsprechenden Benutzer bereits vorhanden, kann dieser Schritt entfallen.
-
Die folgenden Schritte auf allen Postgres-Knoten ausführen. Zuerst alle Schritte auf einem Knoten abschließen, bevor mit dem nächsten fortgefahren wird. Mit dem Primärknoten beginnen, anschließend die einzelnen Standby-Knoten bearbeiten:
- Wird Postgres über systemd betrieben, die systemd-Unit für Postgres deaktivieren. Dies ist erforderlich, weil Patroni das Starten und Stoppen des Postgres-Daemons übernimmt.
- Eine YAML-Konfigurationsdatei für Patroni erstellen. Dafür können die Werkzeuge zur Erzeugung und Validierung der Patroni-Konfiguration
verwendet werden.
- Hinweis (nur für den Primärknoten): Werden Replikationsslots zur Replikation zwischen Clustermitgliedern verwendet, wird empfohlen,
use_slotszu aktivieren und die bestehenden Replikationsslots über den Konfigurationseintragslotsals permanent zu konfigurieren. Bei aktiviertemuse_slotserstellt Patroni automatisch Replikationsslots für die Replikation zwischen Mitgliedern und entfernt Slots, die es nicht erkennt. Permanente Slots sorgen hier dafür, dass die bestehenden Slots während der Migration zu Patroni erhalten bleiben. Einzelheiten stehen unter Dynamische Konfiguration .
- Hinweis (nur für den Primärknoten): Werden Replikationsslots zur Replikation zwischen Clustermitgliedern verwendet, wird empfohlen,
- Patroni über die systemd-Service-Unit
patronistarten. Es erkennt automatisch, dass Postgres bereits läuft, und beginnt mit der Überwachung der Instanz.
-
Den Startvorgang von Postgres an Patroni übergeben. Dazu müssen die Clustermitglieder mit dem Befehl patronictl restart cluster-name member-name neu gestartet werden. Für eine möglichst kurze Ausfallzeit kann dieser Schritt aufgeteilt werden:
- Die Standby-Knoten sofort neu starten.
- Den Neustart des Primärknotens für ein Wartungsfenster planen.
-
Wurden in Schritt
2.2.permanente Slots konfiguriert, sollten sie mit dem Befehl patronictl edit-config cluster-name aus der Konfigurationslotsentfernt werden, sobald dierestart_lsnder von Patroni angelegten Slots dierestart_lsnder ursprünglichen Slots für die jeweiligen Mitglieder eingeholt hat. Durch das Entfernen aus der Konfigurationslotskann Patroni die ursprünglichen Slots aus dem Cluster löschen, sobald sie nicht mehr benötigt werden. Die folgende Beispielabfrage zeigt dierestart_lsnzweier Slots zum Vergleich:
Upgrade auf eine neue PostgreSQL-Hauptversion
Ein Upgrade auf eine neue Hauptversion mit pg_upgrade erfolgt nach folgendem Verfahren:
- Patroni stoppen.
- Die PostgreSQL-Binärdateien aktualisieren und pg_upgrade auf dem Primärknoten ausführen.
- patroni.yml aktualisieren.
- Den initialize-Schlüssel aus dem DCS entfernen oder den vollständigen Clusterzustand im DCS löschen. Letzteres lässt sich mit patronictl remove cluster-name erreichen. Dies ist nötig, weil der neue PostgreSQL-Cluster mit initdb initialisiert wird und dadurch eine neue PostgreSQL-Systemkennung erhält.
- Wurde der Clusterzustand im vorherigen Schritt gelöscht, kann patroni.dynamic.json aus dem alten in das neue Datenverzeichnis kopiert werden. So lassen sich einige zuvor gesetzte PostgreSQL-Parameter beibehalten.
- Patroni auf dem Primärknoten starten.
- Auf den Standby-Knoten die PostgreSQL-Binärdateien und patroni.yml aktualisieren sowie data_dir leeren.
- Patroni auf den Standby-Knoten starten und warten, bis die Replikation abgeschlossen ist.
PostgreSQL unterstützt die Ausführung von pg_upgrade auf Standby-Knoten nicht. Mit entsprechender Sachkenntnis kann anstelle des Leerens von data_dir auf den Standby-Knoten das unter https://www.postgresql.org/docs/current/pgupgrade.html beschriebene rsync-Verfahren versucht werden. Am sichersten ist es jedoch, die Daten von Patroni replizieren zu lassen.
Häufig gestellte Fragen
-
Beim Start meldet Patroni, dass es sich nicht an den PostgreSQL-Port binden kann.
listen_addressesundportinpostgresql.confsowiepostgresql.listeninpatroni.ymlüberprüfen. Auchpg_hba.confsollte diesen Zugriff erlauben. -
Nachdem Patroni zum Neustart des Knotens aufgefordert wurde, zeigt PostgreSQL die Fehlermeldung
could not open configuration file "/etc/postgresql/10/main/pg_hba.conf": No such file or directoryan.Je nach Verwaltung der PostgreSQL-Konfiguration kann dies verschiedene Ursachen haben. Wurde
postgresql.config_dirangegeben, erzeugt Patroni diepg_hba.confanhand der Einstellungen im Abschnitt bootstrap nur bei der Initialisierung eines neuen Clusters. In diesem Szenario warPGDATAnicht leer, daher fand keine Initialisierung statt. Diese Datei muss bereits vorher vorhanden sein.