Zum Inhalt springen

Dies ist die mehrseitige Druckansicht dieses Abschnitts. .

Zur normalen Ansicht dieser Seite zurückkehren.

Patroni 4.1.5 Dokumentation

Überblick über die Patroni-Dokumentation zur Hochverfügbarkeit von PostgreSQL.
Warnung

Betrieb von Patroni auf Systemen mit begrenztem Arbeitsspeicher und Python 3.11+

Wenn Sie Patroni auf einem System mit strengen Speichergrenzen betreiben, beispielsweise mit vm.overcommit_memory=2 (für PostgreSQL empfohlen), und Python 3.11 oder neuer verwenden, kann unerwartetes Verhalten auftreten:

  • Patroni scheint ordnungsgemäß zu funktionieren
  • PostgreSQL läuft weiter
  • Die REST API von Patroni reagiert nicht mehr
  • Das Betriebssystem meldet, dass Patroni auf dem REST API-Port lauscht
  • Die Patroni-Protokolle erscheinen normal; einmalig können jedoch folgende Meldungen auftreten: Exception ignored in thread started by: <object repr() failed>, MemoryError
  • Die Kernel-Protokolle können Meldungen wie not enough memory for the allocation enthalten

Dieses Verhalten wird durch einen Fehler in Python 3.11+ verursacht. Bei strengen Speichergrenzen kann der Start eines neuen Threads auf unbestimmte Zeit hängen bleiben, wenn nicht genügend freier Arbeitsspeicher verfügbar ist.

Neuere Patroni-Versionen (4.1.1+, 4.0.8+) verringern die Auswirkungen dieses Problems, indem sie alle erforderlichen Threads früh beim Start erzeugen, bevor das System unter Speicherdruck gerät.

Weitere Empfehlungen (Linux, glibc)

Beim Betrieb mit vm.overcommit_memory=2 (für PostgreSQL empfohlen) empfehlen wir außerdem, Patroni mit den folgenden Umgebungsvariablen zu starten:

  • MALLOC_ARENA_MAX=1 - verringert den von glibc für Anwendungen mit mehreren Threads reservierten virtuellen Speicher
  • PG_MALLOC_ARENA_MAX= - setzt den Wert von MALLOC_ARENA_MAX für PostgreSQL-Prozesse zurück, die Patroni startet.

Zusätzlich können Sie folgende Patroni-Konfigurationsparameter anpassen:

  • thread_stack_size - Stackgröße der von Patroni gestarteten Threads. Ein niedrigerer Wert verringert den Speicherbedarf des Patroni-Prozesses. Der von Patroni vorgegebene Standardwert ist 512kB. Erhöhen Sie thread_stack_size, wenn Patroni aufgrund von Stackproblemen abstürzt; andernfalls reicht der Standardwert aus.
  • thread_pool_size - Größe des Threadpools, den Patroni für asynchrone Aufgaben und die REST API-Kommunikation mit anderen Mitgliedern bei der Leader-Wahl oder bei Failsafe-Prüfungen verwendet. Der Standardwert ist 5 und reicht für Cluster mit drei Knoten aus.
  • restapi.thread_pool_size - Größe des Threadpools zur Bearbeitung von REST API-Anfragen. Der Standardwert ist 5 und erlaubt bis zu fünf parallele REST API-Anfragen. Anfragen mit SQL-Abfragen werden jedoch praktisch nacheinander verarbeitet, da nur eine Datenbankverbindung verwendet wird. Eine Erhöhung dieses Wertes bringt daher üblicherweise keinen Vorteil.

Patroni ist eine Vorlage für PostgreSQL-Lösungen zur Hochverfügbarkeit (HA) auf Basis von Python. Für eine möglichst breite Einsetzbarkeit unterstützt Patroni verschiedene verteilte Konfigurationsspeicher wie ZooKeeper , etcd , Consul oder Kubernetes . Datenbankentwickler, DBAs, DevOps-Fachleute und SREs, die PostgreSQL mit HA schnell in Rechenzentren oder anderswo bereitstellen möchten, finden darin hoffentlich ein hilfreiches Werkzeug.

Wir nennen Patroni eine „Vorlage“, weil es keineswegs ein universelles oder sofort einsatzbereites Replikationssystem ist. Es hat seine Besonderheiten und Einschränkungen. Setzen Sie es mit Bedacht ein. Es gibt viele Möglichkeiten, PostgreSQL hochverfügbar zu betreiben; eine Übersicht bietet die PostgreSQL-Dokumentation .

Derzeit unterstützte PostgreSQL-Versionen: 9.3 bis 18.

Hinweis für Citus-Anwender: Ab Version 3.0 integriert sich Patroni gut mit der Postgres-Datenbankerweiterung Citus . Weitere Informationen zur gemeinsamen Nutzung der Patroni-Hochverfügbarkeit mit einem verteilten Citus-Cluster finden Sie auf der Seite zur Citus-Unterstützung in der Patroni-Dokumentation.

Hinweis für Kubernetes-Anwender: Patroni kann direkt auf Kubernetes laufen. Lesen Sie dazu das Kapitel Kubernetes der Patroni-Dokumentation.

Bild

1 - Einführung

Einführung in Patroni, Schnelleinstieg und grundlegende Hochverfügbarkeitskonzepte.

Patroni ist eine Vorlage für PostgreSQL-Lösungen zur Hochverfügbarkeit (HA) auf Basis von Python. Es entstand als Fork von Governor , einem Projekt von Compose, und enthält zahlreiche neue Funktionen.

Weitere Hintergrundinformationen:


Entwicklungsstand

Patroni wird aktiv weiterentwickelt und nimmt Beiträge entgegen. Weitere Einzelheiten stehen im Abschnitt Mitwirken weiter unten.

Informationen zu neuen Versionen veröffentlichen wir hier .


Technische Voraussetzungen und Installation

Anleitungen zur Installation und zum Upgrade von Patroni auf verschiedenen Plattformen stehen hier .


Anzahl der PostgreSQL-Knoten planen

Patroni-/PostgreSQL-Knoten sind von den DCS-Knoten unabhängig (außer wenn Patroni RAFT selbst implementiert). Daher gibt es keine Mindestanzahl an Knoten. Ein Cluster aus einem Primärserver und einem Standby kann problemlos betrieben werden. Weitere Standby-Knoten können später hinzugefügt werden.

Cluster mit 2 Knoten (Primärserver + Standby) sind üblich und bieten automatisches Failover mit Hochverfügbarkeit. Während eines Failovers besteht vorübergehend keine Redundanz, bis der ausgefallene Knoten wieder beitritt.

DCS-Anforderungen: Der DCS (etcd, ZooKeeper, Consul) muss für zuverlässigen Konsens und Fehlertoleranz mit 3 oder 5 Knoten betrieben werden. Ein einzelner DCS-Cluster kann Informationen für Hunderte oder Tausende Patroni-Cluster speichern, die unterschiedliche namespace/scope-Kombinationen verwenden.


Ausführen und Konfigurieren

Der folgende Abschnitt setzt voraus, dass das Patroni-Repository von https://github.com/patroni/patroni geklont wurde. Insbesondere werden die Beispielkonfigurationen postgres0.yml und postgres1.yml benötigt. Wurde Patroni mit pip installiert, können diese Dateien aus dem Git-Repository bezogen werden; ./patroni.py ist dann unten durch den Befehl patroni zu ersetzen.

Die folgenden Befehle verwenden die etcd-v2-API und erfordern eine etcd-Version mit Unterstützung für --enable-v2, etwa etcd 3.5. Bei etcd 3.6 oder neuer stattdessen die etcd3-Konfiguration von Patroni verwenden, da etcd 3.6 die Unterstützung der v2-API entfernt hat .

Zum Einstieg die folgenden Befehle in verschiedenen Terminals ausführen:

> etcd --data-dir=data/etcd --enable-v2=true
> ./patroni.py postgres0.yml
> ./patroni.py postgres1.yml

Daraufhin startet ein hochverfügbarer Cluster. Verschiedene Einstellungen in den YAML-Dateien ausprobieren, um ihre Auswirkungen auf das Clusterverhalten zu beobachten. Einzelne Komponenten beenden, um das Verhalten des Systems zu testen.

Weitere Dateien postgres*.yml hinzufügen, um einen noch größeren Cluster zu erstellen.

Patroni stellt eine HAProxy -Konfiguration bereit, die der Anwendung einen einzelnen Endpunkt für Verbindungen zum Cluster-Leader bietet. Zur Einrichtung folgende Befehle ausführen:

> haproxy -f haproxy.cfg

> psql --host 127.0.0.1 --port 5000 postgres

YAML-Konfiguration

Ausführliche Informationen zu den Einstellungen für etcd, Consul und ZooKeeper stehen hier . Ein Beispiel enthält postgres0.yml .


Konfiguration über Umgebungsvariablen

Ausführliche Informationen zum Festlegen und Überschreiben von Einstellungen über Umgebungsvariablen stehen hier .


Replikationsmöglichkeiten

Patroni verwendet die Streaming-Replikation von Postgres, die standardmäßig asynchron arbeitet. In der asynchronen Replikationskonfiguration von Patroni lässt sich maximum_lag_on_failover setzen. Diese Einstellung verhindert die Hochstufung eines Followers bei einem Failover, wenn er mehr als die festgelegte Anzahl Bytes hinter dem Leader liegt. Ihr Wert sollte je nach geschäftlichen Anforderungen erhöht oder verringert werden. Für stärkere Garantien zur Dauerhaftigkeit kann auch synchrone Replikation verwendet werden. Einzelheiten stehen in der Dokumentation zu Replikationsmodi .


Anwendungen sollten keine Superuser verwenden

Für Verbindungen aus Anwendungen immer einen Benutzer ohne Superuser-Rechte verwenden. Patroni benötigt Datenbankzugriff, um ordnungsgemäß zu funktionieren. Verwendet eine Anwendung einen Superuser, kann sie möglicherweise den gesamten Verbindungspool belegen, einschließlich der über superuser_reserved_connections für Superuser reservierten Verbindungen. Kann Patroni wegen eines vollen Verbindungspools nicht auf den Primärserver zugreifen, führt dies zu unerwünschtem Verhalten.


Die HA-Lösung testen

Das Testen einer HA-Lösung ist zeitaufwendig und umfasst viele Einflussgrößen. Dies gilt besonders für eine plattformübergreifende Anwendung. Dafür wird ein geschulter Systemadministrator oder Berater benötigt. Die Dokumentation kann dies nicht im Detail abdecken.

Folgende Teile der Infrastruktur sollten auf jeden Fall getestet werden:

  • Netzwerk (sowohl das dem System vorgelagerte Netzwerk als auch die NICs physischodervirtuellphysisch oder virtuellselbst)
  • Datenträger-IO
  • Dateilimits (nofile unter Linux)
  • RAM. Auch bei deaktiviertem oomkiller kann fehlender Arbeitsspeicher Probleme verursachen.
  • CPU
  • Ressourcenkonkurrenz bei der Virtualisierung (Überbelegung des Hypervisors)
  • Sämtliche cgroup-Beschränkungen (wahrscheinlich im Zusammenhang mit den obigen Punkten)
  • kill -9 für einen beliebigen postgres-Prozess (außer postmaster!). Dies simuliert einen Segmentation Fault recht gut.

Ein postmaster-Prozess sollte dagegen nicht mit kill -9 beendet werden, da das Beenden des Prozesses allein die zugrunde liegenden Bedingungen eines Ressourcenmangels oder anderer Infrastrukturfehler nicht nachbildet. Besteht die Sorge, dass die Infrastruktur unsicher ist und ein Angreifer kill -9 ausführen könnte, kann kein HA-Verfahren das beheben. Der Angreifer würde den Prozess einfach erneut beenden oder auf andere Weise Schaden anrichten.

2 - Installation

Installation und Upgrade von Patroni auf den unterstützten Plattformen.


Voraussetzungen unter Mac OS

Zum Installieren der Voraussetzungen auf einem Mac folgenden Befehl ausführen:

brew install postgresql etcd haproxy libyaml python


Psycopg

Seit psycopg2-2.8 wird die Binärversion von psycopg2 nicht mehr standardmäßig installiert. Für die Installation aus dem Quellcode werden ein C-Compiler sowie die Entwicklungspakete für Postgres und Python benötigt. Da sich in Python keine Abhängigkeit in der Form psycopg2 OR psycopg2-binary angeben lässt, muss die Installationsart selbst gewählt werden.

Es stehen mehrere Möglichkeiten zur Verfügung:

  1. Den Paketmanager der Distribution verwenden.
sudo apt-get install python3-psycopg2  # install psycopg2 module on Debian/Ubuntu
sudo yum install python3-psycopg2      # install psycopg2 on RedHat/Fedora/CentOS
  1. Bei der Installation von Patroni mit pip eines der Pakete psycopg3, psycopg2 oder psycopg2-binary in der Liste der Abhängigkeiten angeben.


Allgemeine Installation mit pip

Patroni lässt sich mit pip installieren:

pip install patroni[dependencies]

Dabei kann dependencies leer sein oder aus einem oder mehreren der folgenden Einträge bestehen:

etcd oder etcd3
Modul python-etcd, um etcd als verteilten Konfigurationsspeicher (DCS) zu verwenden

consul
Modul py-consul, um Consul als DCS zu verwenden

zookeeper
Modul kazoo, um ZooKeeper als DCS zu verwenden

exhibitor
Modul kazoo, um Exhibitor als DCS zu verwenden (dieselben Abhängigkeiten wie für ZooKeeper)

kubernetes
Modul kubernetes , um Kubernetes als DCS in Patroni zu verwenden

raft
Modul pysyncobj, um die Python-Implementierung von Raft als DCS zu verwenden

aws
boto3, um AWS-Callbacks zu verwenden

jsonlogger
Modul python-json-logger, um die Protokollierung im JSON-Format zu aktivieren

systemd
systemd-python, um die sd_notify-Integration zu verwenden

all
Alle oben genannten Abhängigkeiten (außer der psycopg-Familie)

psycopg3
Modul psycopg[binary]>=3.0.0

psycopg2
Modul psycopg2>=2.5.4

psycopg2-binary
Modul psycopg2-binary

Um Patroni zusammen mit psycopg3, den Abhängigkeiten für etcd als DCS und den AWS-Callbacks zu installieren, lautet der Befehl beispielsweise:

pip install patroni[psycopg3,etcd3,aws]

Externe Werkzeuge, die in Skripten zur Replikaterstellung oder benutzerdefinierten Cluster-Initialisierung aufgerufen werden (z. B. WAL-E), sollten unabhängig von Patroni installiert werden.


Paketinstallation unter Linux

Für das verwendete Betriebssystem sind möglicherweise Patroni-Pakete verfügbar. Die Postgres-Community erstellt solche Pakete für:

  • RHEL, RockyLinux, AlmaLinux;
  • Debian und Ubuntu;
  • SUSE Enterprise Linux.

Es gibt auch Pakete für direkte Abhängigkeiten von Patroni, etwa Python-Module, die möglicherweise nicht in den offiziellen Paketquellen des Betriebssystems enthalten sind.

Weitere Informationen stehen in der Dokumentation des PGDG-Repositorys .

Bei einem auf RedHat Enterprise Linux basierenden Betriebssystem werden möglicherweise zusätzlich Pakete aus EPEL benötigt; siehe die Dokumentation des EPEL-Repositorys .

Nach dem Einrichten des PGDG-Repositorys für das Betriebssystem kann Patroni installiert werden.

Hinweis

Die Patroni-Pakete werden von der Postgres-Community gepflegt, nicht von den Patroni-Entwicklern. Bei Unterstützungsbedarf zunächst im Postgres-Slack nachfragen.

Installation auf Debian-basierten Distributionen

Nach dem Einrichten des PGDG-Repositorys, siehe oben , Patroni mit apt installieren:

apt-get install patroni

Installation auf RedHat-basierten Distributionen

Nach dem Einrichten des PGDG-Repositorys, siehe oben , Patroni mit etcd als DCS unter RHEL 9 (und davon abgeleiteten Distributionen) über dnf installieren:

dnf install patroni patroni-etcd

Bietet die RedHat-basierte Distribution keine etcd-Pakete an, kann etcd aus PGDG installiert werden. Auf den für den DCS vorgesehenen Knoten folgende Befehle ausführen:

dnf install 'dnf-command(config-manager)'
dnf config-manager --enable pgdg-rhel9-extras
dnf install etcd

Falls erforderlich, die RHEL-Version im Repository durch 8 ersetzen, sodass sich pgdg-rhel8-extras ergibt. Auch auf RockyLinux, AlmaLinux, Oracle Linux usw. lautet der Repository-Name pgdg-rhelN-extras.

Installation unter SUSE Enterprise Linux

Für einige Abhängigkeiten müssen möglicherweise die SUSE-PackageHub-Repositorys aktiviert werden. Siehe die Dokumentation von SUSE PackageHub .

Unter SLES 15 kann Patroni nach dem Einrichten des PGDG-Repositorys, siehe oben , wie folgt installiert werden:

zypper install patroni patroni-etcd

Mit aktiviertem SUSE-PackageHub-Repository lässt sich auch etcd installieren:

SUSEConnect -p PackageHub/15.5/x86_64
zypper install etcd

Upgrade

Ein Upgrade von Patroni ist sehr einfach: Die Softwareinstallation aktualisieren und den Patroni-Daemon auf jedem Knoten im Cluster neu starten.

Der Neustart des Patroni-Daemons führt jedoch zu einem Neustart der Postgres-Datenbank. Dies kann unter bestimmten Umständen ein Failover des Primärservers auslösen. Deshalb wird empfohlen, den Cluster bis zum Abschluss des Patroni-Daemon-Neustarts in den Wartungsmodus zu versetzen.

Dazu auf einem der Patroni-Knoten folgenden Befehl ausführen:

patronictl pause --wait

Anschließend auf jedem Clusterknoten das für das Betriebssystem erforderliche Paketupgrade durchführen:

apt-get update && apt-get install patroni

Den Patroni-Daemon-Prozess auf jedem Knoten neu starten:

systemctl restart patroni

Abschließend die Postgres-Überwachung durch Patroni wieder aufnehmen und damit den Wartungsmodus beenden:

patronictl resume --wait

Der Cluster ist nun mit der neuen Patroni-Version wieder voll betriebsbereit.

3 - Patroni-Konfiguration

Konfigurationsmodell, Vorrangregeln und Validierungswerkzeuge von Patroni.

Es gibt 3 Arten der Patroni-Konfiguration:

  • Globale dynamische Konfiguration .
    Diese Optionen werden im DCS (verteilter Konfigurationsspeicher) gespeichert und auf allen Clusterknoten angewendet. Die dynamische Konfiguration kann jederzeit mit dem Werkzeug patronictl_edit_config oder der REST API von Patroni festgelegt werden. Gehören die geänderten Optionen nicht zur Startkonfiguration, werden sie asynchron (beim nächsten Aufwachen der Verarbeitungsschleife) auf jedem Knoten angewendet; dessen Konfiguration wird anschließend neu geladen. Erfordert ein Knoten einen Neustart, um die Konfiguration anzuwenden (wenn sich Werte von PostgreSQL-Parametern mit dem Kontext postmaster geändert haben), wird dies durch das spezielle Flag pending_restart im JSON members.data gekennzeichnet. Zusätzlich zeigt der Knotenstatus "restart_pending": true an.

  • Lokale Konfigurationsdatei (patroni.yml).
    Diese Optionen werden in der Konfigurationsdatei definiert und haben Vorrang vor der dynamischen Konfiguration. patroni.yml kann zur Laufzeit geändert und neu geladen werden (ohne Patroni neu zu starten), indem SIGHUP an den Patroni-Prozess gesendet, die REST-API-Anfrage POST /reload gestellt oder patronictl_reload ausgeführt wird. Die lokale Konfiguration kann entweder aus einer einzelnen YAML-Datei oder einem Verzeichnis bestehen. Bei einem Verzeichnis werden alle darin enthaltenen YAML-Dateien nacheinander in sortierter Reihenfolge geladen. Ist ein Schlüssel in mehreren Dateien definiert, hat sein Vorkommen in der letzten Datei Vorrang.

  • Umgebungskonfiguration .
    Einige „lokale“ Konfigurationsparameter können über Umgebungsvariablen festgelegt oder überschrieben werden. Die Umgebungskonfiguration ist sehr nützlich in dynamischen Umgebungen, in denen einige Parameter nicht im Voraus bekannt sind (beispielsweise lässt sich beim Betrieb in docker die externe IP-Adresse nicht im Voraus kennen).


Wichtige Regeln

Von Patroni gesteuerte PostgreSQL-Parameter

Einige PostgreSQL-Parameter müssen auf dem Primärserver und den Replikaten dieselben Werte haben. Für diese Parameter haben Werte aus den lokalen Patroni-Konfigurationsdateien oder aus Umgebungsvariablen keine Wirkung. Um ihre Werte zu ändern oder festzulegen, muss die gemeinsame Konfiguration im DCS geändert werden. Die folgende Liste enthält diese Parameter mit ihren Standard- und Mindestwerten:

  • max_connections: Standardwert 100, Mindestwert 25
  • max_locks_per_transaction: Standardwert 64, Mindestwert 32
  • max_worker_processes: Standardwert 8, Mindestwert 2
  • max_prepared_transactions: Standardwert 0, Mindestwert 0
  • wal_level: Standardwert hot_standby, zulässige Werte: hot_standby, replica, logical
  • track_commit_timestamp: Standardwert off

Für die folgenden Parameter verlangt PostgreSQL keine gleichen Werte auf dem Primärserver und allen Replikaten. Da ein Replikat jedoch jederzeit zum Primärserver werden kann, sind unterschiedliche Werte kaum sinnvoll; daher erlaubt Patroni das Festlegen ihrer Werte ausschließlich über die dynamische Konfiguration .

  • max_wal_senders: Standardwert 10, Mindestwert 3
  • max_replication_slots: Standardwert 10, Mindestwert 4
  • wal_keep_segments: Standardwert 8, Mindestwert 1
  • wal_keep_size: Standardwert 128MB, Mindestwert 16MB
  • wal_log_hints: on

Diese Parameter werden auf sinnvolle Werte beziehungsweise die Einhaltung eines Mindestwerts geprüft.

Patroni steuert außerdem einige weitere Postgres-Parameter:

  • listen_addresses - wird aus postgresql.listen oder der Umgebungsvariablen PATRONI_POSTGRESQL_LISTEN gesetzt
  • port - wird aus postgresql.listen oder der Umgebungsvariablen PATRONI_POSTGRESQL_LISTEN gesetzt
  • cluster_name - wird aus scope oder der Umgebungsvariablen PATRONI_SCOPE gesetzt
  • hot_standby: on

Zur Sicherheit werden die Parameter aus den obigen Listen in postgresql.conf geschrieben und als Argumentliste an postgres übergeben. Dadurch haben sie die höchste Priorität (ausgenommen wal_keep_segments und wal_keep_size), noch vor ALTER SYSTEM .

Einige Parameter wie postgresql.listen und postgresql.data_dir können nur lokal festgelegt werden, also in der Patroni-Konfigurationsdatei oder über eine Konfigurationsvariable . In den meisten Fällen überschreibt die lokale Konfiguration die dynamische Konfiguration.

Beim Anwenden lokaler oder dynamischer Konfigurationsoptionen werden folgende Schritte ausgeführt:

  • Der Knoten prüft zunächst, ob eine Datei postgresql.base.conf vorhanden oder der Parameter custom_conf gesetzt ist.
  • Ist custom_conf gesetzt, dient die dort angegebene Datei als Basiskonfiguration; postgresql.base.conf und postgresql.conf werden ignoriert.
  • Ist custom_conf nicht gesetzt und existiert postgresql.base.conf, enthält diese Datei die umbenannte „ursprüngliche“ Konfiguration und dient als Basiskonfiguration.
  • Ist weder custom_conf gesetzt noch postgresql.base.conf vorhanden, wird die ursprüngliche postgresql.conf in postgresql.base.conf umbenannt und als Basiskonfiguration verwendet.
  • Die dynamischen Optionen werden (mit den obigen Ausnahmen) in postgresql.conf geschrieben. In postgresql.conf wird außerdem ein include für die Basiskonfiguration gesetzt (entweder postgresql.base.conf oder die Datei aus custom_conf). So lassen sich neue Optionen anwenden, ohne die Konfigurationsdatei erneut einzulesen, um das Vorhandensein des include zu prüfen.
  • Einige Parameter, die für die Clusterverwaltung durch Patroni wesentlich sind, werden über die Befehlszeile überschrieben.
  • Wird eine Option geändert, die einen Neustart erfordert (hierfür sollten der Kontext in pg_settings und die tatsächlichen Werte dieser Optionen betrachtet werden), wird auf diesem Knoten das Flag pending_restart gesetzt. Dieses Flag wird bei jedem Neustart zurückgesetzt.

Die Parameter werden in der folgenden Reihenfolge angewendet (Laufzeitparameter haben die höchste Priorität):

  1. Parameter aus der Datei postgresql.base.conf laden (oder aus einer custom_conf-Datei, falls gesetzt)
  2. Parameter aus der Datei postgresql.conf laden
  3. Parameter aus der Datei postgresql.auto.conf laden
  4. Laufzeitparameter über -o --name=value

Dies ermöglicht die Konfiguration aller Knoten (2) sowie eines bestimmten Knotens mit ALTER SYSTEM (3) und stellt sicher, dass für den Betrieb von Patroni wesentliche Parameter durchgesetzt werden (4). Zugleich bleibt Raum für Konfigurationswerkzeuge, die postgresql.conf direkt ohne Beteiligung von Patroni verwalten (1).

PostgreSQL-Parameter mit Einfluss auf den gemeinsam genutzten Speicher

PostgreSQL hat einige Parameter, die die Größe des von ihnen verwendeten gemeinsam genutzten Speichers bestimmen:

  • max_connections
  • max_prepared_transactions
  • max_locks_per_transaction
  • max_wal_senders
  • max_worker_processes

Änderungen dieser Parameter werden erst nach einem PostgreSQL-Neustart wirksam. Ihre Strukturen im gemeinsam genutzten Speicher dürfen auf den Standby-Knoten nicht kleiner sein als auf dem Primärserver.

Wie bereits erläutert, erlaubt Patroni Änderungen ihrer Werte nur über die dynamische Konfiguration . Dies umfasst üblicherweise:

  1. Änderungen mit patronictl_edit_config anwenden (oder über den REST-API-Endpunkt /config)
  2. Knoten mit patronictl_restart neu starten (oder über den REST-API-Endpunkt /restart)

Hinweis: PostgreSQL-Knoten sollten mit dem Befehl patronictl_restart oder über den REST-API-Endpunkt /restart neu gestartet werden. Der Versuch, PostgreSQL durch einen Neustart des Patroni-Daemons neu zu starten, etwa mit systemctl restart patroni, kann beim Neustart des Primärservers ein Failover im Cluster auslösen.

Da diese Einstellungen den gemeinsam genutzten Speicher steuern, ist beim Neustart der Knoten zusätzliche Sorgfalt erforderlich:

  • Wenn der Wert einer dieser Einstellungen erhöht werden soll:

    1. Zuerst alle Standbys neu starten
    2. Danach den Primärserver neu starten
  • Wenn der Wert einer dieser Einstellungen verringert werden soll:

    1. Zuerst den Primärserver neu starten
    2. Danach alle Standbys neu starten

Hinweis: Wenn nach einer Verringerung einer dieser Einstellungen alle Knoten auf einmal neu gestartet werden, ignoriert Patroni die Änderung und startet den Standby mit dem ursprünglichen Wert neu. Daher müssen die Standbys später erneut neu gestartet werden. So verhindert Patroni eine endlose Absturzschleife des Standbys: PostgreSQL beendet sich mit einer FATAL-Meldung, wenn einer dieser Parameter auf einen niedrigeren Wert gesetzt wird als den, den pg_controldata auf dem Standby-Knoten ausweist. Die Einstellung kann auf dem Standby also erst verringert werden, wenn dessen pg_controldata hinsichtlich dieser Änderungen auf dem Primärserver aktuell ist.

Weitere Informationen dazu enthält die Administrationsübersicht von PostgreSQL .

Patroni-Konfigurationsparameter

Auch die folgenden Patroni-Konfigurationsoptionen können nur dynamisch geändert werden:

  • ttl: 30
  • loop_wait: 10
  • retry_timeout: 10
  • maximum_lag_on_failover: 1048576
  • max_timelines_history: 0
  • check_timeline: false
  • postgresql.use_slots: true

Bei einer Änderung dieser Optionen liest Patroni den entsprechenden Abschnitt der im DCS gespeicherten Konfiguration und ändert seine Laufzeitwerte.

Patroni-Knoten schreiben den Zustand der DCS-Optionen bei jeder Konfigurationsänderung in die Datei patroni.dynamic.json im Postgres-Datenverzeichnis. Nur der Leader darf diese Optionen aus der gespeicherten Datei wiederherstellen, wenn sie im DCS vollständig fehlen oder ungültig sind.


Konfiguration erzeugen und validieren

Patroni bietet Befehlszeilenschnittstellen zum Erzeugen und Validieren einer lokalen Patroni-Konfiguration . Mit dem ausführbaren Programm patroni lässt sich:

  • Eine lokale Patroni-Beispielkonfiguration erstellen;
  • Eine Patroni-Konfigurationsdatei für die lokal laufende PostgreSQL-Instanz erstellen (etwa als Vorbereitung für die Patroni-Integration );
  • Eine angegebene Patroni-Konfigurationsdatei validieren.

Patroni-Beispielkonfiguration

patroni --generate-sample-config [configfile]

Beschreibung

Erzeugt eine Patroni-Beispielkonfigurationsdatei im Format yaml. Parameterwerte werden über die Umgebungskonfiguration festgelegt. Sind sie dort nicht gesetzt, werden die Standardwerte von Patroni verwendet oder die Zeichenfolge #FIXME für Werte, die der Benutzer später festlegen sollte.

Einige Standardwerte werden anhand der lokalen Umgebung bestimmt:

  • postgresql.listen: die von getaddrinfo aufgelöste IP-Adresse zum Hostnamen des aktuellen Rechners, den gethostname zurückgibt, und der Standardport 5432.
  • postgresql.connect_address: die von getaddrinfo aufgelöste IP-Adresse zum Hostnamen des aktuellen Rechners, den gethostname zurückgibt, und der Standardport 5432.
  • postgresql.authentication.rewind: wird nur definiert, wenn die PostgreSQL-Version anhand der Programmdatei ermittelt werden kann und mindestens 11 ist.
  • restapi.listen: die von getaddrinfo aufgelöste IP-Adresse zum Hostnamen des aktuellen Rechners, den gethostname zurückgibt, und der Standardport 8008.
  • restapi.connect_address: die von getaddrinfo aufgelöste IP-Adresse zum Hostnamen des aktuellen Rechners, den gethostname zurückgibt, und der Standardport 8008.

Parameter

configfile - vollständiger Pfad zur Konfigurationsdatei, in der das Ergebnis gespeichert wird. Fehlt die Angabe, wird das Ergebnis an stdout ausgegeben.

Patroni-Konfiguration für eine laufende Instanz

patroni --generate-config [--dsn DSN] [configfile]

Beschreibung

Erzeugt eine Patroni-Konfiguration im Format yaml für die lokal laufende PostgreSQL-Instanz. Für die Verbindung zu PostgreSQL wird entweder der angegebene DSN (hat Vorrang) oder die PostgreSQL-Umgebungsvariablen verwendet. Ist kein Passwort angegeben, sollte es auf Aufforderung eingegeben werden.

Alle nicht internen GUCs der Quellinstanz von Postgres dienen als Quelle für die folgenden Patroni-Konfigurationsparameter, unabhängig davon, ob sie über eine Konfigurationsdatei, die postmaster-Befehlszeile oder Umgebungsvariablen gesetzt wurden:

  • scope: Wert des GUC cluster_name;
  • postgresql.listen: Werte der GUCs listen_addresses und port;
  • postgresql.data_dir: Wert des GUC data_directory;
  • postgresql.parameters: Werte der GUCs archive_command, restore_command, archive_cleanup_command, recovery_end_command, ssl_passphrase_command, hba_file, ident_file, config_file;
  • bootstrap.dcs: alle anderen ermittelten PostgreSQL-GUCs.

Wird scope, postgresql.listen oder postgresql.data_dir nicht aus den Postgres-GUCs gesetzt, wird der jeweilige Wert aus der Umgebungskonfiguration verwendet.

Weitere Regeln zur Bestimmung der Werte:

  • name: Wert der Umgebungsvariablen PATRONI_NAME, falls gesetzt, andernfalls der Hostname des aktuellen Rechners.
  • postgresql.bin_dir: Pfad zu den Postgres-Programmdateien, ermittelt aus der laufenden Instanz.
  • postgresql.connect_address: die von getaddrinfo aufgelöste IP-Adresse zum Hostnamen des aktuellen Rechners, den gethostname zurückgibt, und der für die Verbindung zur Instanz verwendete Port oder der Wert des GUC port.
  • postgresql.authentication.superuser: die für die Verbindung zur Instanz verwendete Konfiguration;
  • postgresql.pg_hba: die aus der hba_file der Quellinstanz gelesenen Zeilen.
  • postgresql.pg_ident: die aus der ident_file der Quellinstanz gelesenen Zeilen.
  • restapi.listen: die von getaddrinfo aufgelöste IP-Adresse zum Hostnamen des aktuellen Rechners, den gethostname zurückgibt, und der Standardport 8008.
  • restapi.connect_address: die von getaddrinfo aufgelöste IP-Adresse zum Hostnamen des aktuellen Rechners, den gethostname zurückgibt, und der Standardport 8008.

Weitere über die Umgebungskonfiguration definierte Parameter werden ebenfalls in die Konfiguration aufgenommen.

Parameter

configfile
Vollständiger Pfad zur Konfigurationsdatei, in der das Ergebnis gespeichert wird. Fehlt die Angabe, wird das Ergebnis an stdout ausgegeben.

dsn
Optionale DSN-Zeichenfolge für die lokale PostgreSQL-Instanz, aus der die GUC-Werte ermittelt werden sollen.

Patroni-Konfiguration validieren

patroni --validate-config [configfile] [--ignore-listen-port | -i]

Beschreibung

Validiert die angegebene Patroni-Konfiguration und gibt Informationen zu fehlgeschlagenen Prüfungen aus.

Parameter

configfile
Vollständiger Pfad zur zu prüfenden Konfigurationsdatei. Ist er nicht angegeben oder existiert die Datei nicht, wird versucht, die Konfiguration aus der Umgebungsvariablen PATRONI_CONFIGURATION oder, falls diese nicht gesetzt ist, aus den Patroni-Umgebungsvariablen zu lesen.

--ignore-listen-port | -i
Optionales Flag, um bei der Validierung von configfile Bindungsfehler für bereits belegte listen-Ports zu ignorieren.

--print | -p
Optionales Flag, um die lokale Konfiguration (einschließlich der durch die Umgebungskonfiguration überschriebenen Werte) nach erfolgreicher Validierung auszugeben.

3.1 - Dynamische Konfigurationseinstellungen

Im DCS gespeicherte dynamische Konfigurationseinstellungen, die clusterweit angewendet werden.

Die dynamische Konfiguration wird im DCS (verteilter Konfigurationsspeicher) gespeichert und auf allen Clusterknoten angewendet.

Zum Ändern der dynamischen Konfiguration kann entweder das Werkzeug patronictl_edit_config oder die REST API von Patroni verwendet werden.

  • loop_wait: Anzahl der Sekunden, die die Schleife schläft. Standardwert: 10, kleinster zulässiger Wert: 1
  • ttl: TTL für den Erwerb der Leader-Sperre (in Sekunden). Sie entspricht der Zeitspanne bis zum Beginn eines automatischen Failovers. Standardwert: 30, kleinster zulässiger Wert: 20
  • retry_timeout: Zeitüberschreitung für Wiederholungsversuche bei DCS- und PostgreSQL-Operationen (in Sekunden). Kürzer andauernde DCS- oder Netzwerkprobleme führen nicht dazu, dass Patroni den Leader herabstuft. Standardwert: 10, kleinster zulässiger Wert: 3
Warnung

Beim Ändern von loop_wait, retry_timeout oder ttl muss folgende Regel eingehalten werden:

loop_wait + 2 * retry_timeout <= ttl
  • maximum_lag_on_failover: maximaler Rückstand eines Followers in Bytes, mit dem er noch an der Leader-Wahl teilnehmen darf.
  • primary_race_backoff: verschiebt die Leader-Wahl auf Standbys um primary_race_backoff Sekunden, wenn die WAL-Replikation vom Primärserver noch voranschreitet. Dies minimiert unnötige Failovers durch ein kurzzeitig nicht reagierendes Patroni. Standardwert: 0 (deaktiviert).
  • maximum_lag_on_syncnode: maximaler Rückstand eines synchronen Followers in Bytes, bevor er als fehlerhafter Kandidat gilt und durch einen fehlerfreien asynchronen Follower ersetzt wird. Bei mehr als einem Follower verwendet Patroni die höchste Replikat-LSN, andernfalls die aktuelle WAL-LSN des Leaders. Der Standardwert ist -1. Bei einem Wert von 0 oder weniger tauscht Patroni einen fehlerhaften synchronen Follower nicht aus. Den Wert ausreichend hoch wählen, damit Patroni bei hohem Transaktionsaufkommen synchrone Follower nicht häufig austauscht.
  • max_timelines_history: maximale Anzahl der im DCS gespeicherten Einträge des Timeline-Verlaufs. Standardwert: 0. Bei 0 wird der vollständige Verlauf im DCS gespeichert.
  • primary_start_timeout: Zeit, die ein Primärserver zur Erholung von Fehlern erhält, bevor ein Failover ausgelöst wird (in Sekunden). Der Standardwert beträgt 300 Sekunden. Bei 0 erfolgt das Failover nach Möglichkeit sofort nach Erkennung eines Absturzes. Bei asynchroner Replikation kann ein Failover zum Verlust von Transaktionen führen. Im schlimmsten Fall beträgt die Failover-Zeit bei Ausfall des Primärservers: loop_wait + primary_start_timeout + loop_wait. Ist primary_start_timeout jedoch null, beträgt sie nur loop_wait. Den Wert entsprechend der Abwägung zwischen Dauerhaftigkeit und Verfügbarkeit festlegen.
  • primary_stop_timeout: Anzahl der Sekunden, die Patroni beim Stoppen von Postgres warten darf; wirkt nur bei aktiviertem synchronous_mode. Ist der Wert auf > 0 gesetzt und synchronous_mode aktiviert, sendet Patroni SIGKILL an den postmaster, wenn der Stoppvorgang länger als primary_stop_timeout dauert. Den Wert entsprechend der Abwägung zwischen Dauerhaftigkeit und Verfügbarkeit festlegen. Ist der Parameter nicht gesetzt oder auf <= 0 gesetzt, wird primary_stop_timeout nicht angewendet.
  • synchronous_mode: aktiviert den synchronen Replikationsmodus. Mögliche Werte: off, on, quorum. In diesem Modus verwaltet der Leader synchronous_standby_names; nur der zuletzt bekannte Leader oder eines der synchronen Replikate darf an der Leader-Wahl teilnehmen. Der synchrone Modus gewährleistet, dass erfolgreich festgeschriebene Transaktionen bei einem Failover nicht verloren gehen. Dafür entfällt die Schreibverfügbarkeit, wenn Patroni die Dauerhaftigkeit der Transaktionen nicht sicherstellen kann. Einzelheiten enthält die Dokumentation der Replikationsmodi .
  • synchronous_mode_strict: verhindert das Deaktivieren der synchronen Replikation, wenn keine synchronen Replikate verfügbar sind, und blockiert dadurch alle Schreibzugriffe von Clients auf den Primärserver. Im prioritätsbasierten synchronen Modus (synchronous_mode: on) setzt Patroni 4.1.5 synchronous_standby_names auf *, wenn kein geeignetes synchrones Replikat verfügbar ist. Einzelheiten enthält die Dokumentation der Replikationsmodi .
  • synchronous_node_count: bei aktiviertem synchronous_mode verwaltet Patroni mit diesem Parameter die genaue Anzahl synchroner Standby-Instanzen und passt beim Hinzukommen und Ausscheiden von Mitgliedern den Zustand im DCS und den PostgreSQL-Parameter synchronous_standby_names an. Ist der Wert höher als die Anzahl geeigneter Knoten, wird er automatisch angepasst. Standardwert: 1.
  • failsafe_mode: aktiviert den DCS-Failsafe-Modus . Standardwert: false.
  • postgresql:
    • use_pg_rewind: bestimmt, ob pg_rewind verwendet wird. Standardwert: false. Der Cluster muss mit data page checksums (Option --data-checksums für initdb) initialisiert worden sein und/oder wal_log_hints muss auf on gesetzt sein, andernfalls funktioniert pg_rewind nicht.
    • use_slots: bestimmt, ob Replikationsslots verwendet werden. Standardwert unter PostgreSQL 9.4+: true.
    • recovery_conf: zusätzliche Konfigurationseinstellungen, die beim Konfigurieren eines Followers in recovery.conf geschrieben werden. Ab PostgreSQL 12 gibt es keine recovery.conf mehr; dieser Abschnitt kann dennoch weiter verwendet werden, da Patroni dies transparent handhabt.
    • parameters: Konfigurationsparameter (GUCs) für Postgres im Format {max_connections: 100, wal_level: "replica", max_wal_senders: 10, wal_log_hints: "on"}. Viele davon sind für die Replikation erforderlich.
    • parameters_primary: (optional) rollenspezifische Parameterüberschreibungen für primary. Diese Werte werden mit den grundlegenden parameters zusammengeführt und überschreiben sie.
    • parameters_replica: (optional) rollenspezifische Parameterüberschreibungen für replica. Diese Werte werden mit den grundlegenden parameters zusammengeführt und überschreiben sie.
    • parameters_standby_leader: (optional) rollenspezifische Parameterüberschreibungen für standby_leader. Diese Werte werden mit den grundlegenden parameters zusammengeführt und überschreiben sie.
    • pg_hba: Liste der Zeilen, aus denen Patroni pg_hba.conf erzeugt. Patroni ignoriert diesen Parameter, wenn der PostgreSQL-Parameter hba_file auf einen anderen Wert als den Standardwert gesetzt ist.
      • - host all all 0.0.0.0/0 md5
      • - host replication replicator 127.0.0.1/32 md5: Eine solche Zeile ist für die Replikation erforderlich.
    • pg_hba_primary: (optional) rollenspezifische pg_hba-Einträge für primary. Sie ersetzen pg_hba vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_hba verwendet.
    • pg_hba_replica: (optional) rollenspezifische pg_hba-Einträge für replica. Sie ersetzen pg_hba vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_hba verwendet.
    • pg_hba_standby_leader: (optional) rollenspezifische pg_hba-Einträge für standby_leader. Sie ersetzen pg_hba vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_hba verwendet.
    • pg_ident: Liste der Zeilen, aus denen Patroni pg_ident.conf erzeugt. Patroni ignoriert diesen Parameter, wenn der PostgreSQL-Parameter ident_file auf einen anderen Wert als den Standardwert gesetzt ist.
      • - mapname1 systemname1 pguser1
      • - mapname1 systemname2 pguser2
    • pg_ident_primary: (optional) rollenspezifische pg_ident-Einträge für primary. Sie ersetzen pg_ident vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_ident verwendet.
    • pg_ident_replica: (optional) rollenspezifische pg_ident-Einträge für replica. Sie ersetzen pg_ident vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_ident verwendet.
    • pg_ident_standby_leader: (optional) rollenspezifische pg_ident-Einträge für standby_leader. Sie ersetzen pg_ident vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_ident verwendet.
  • standby_cluster: ist dieser Abschnitt definiert, soll ein Standby-Cluster initialisiert werden.
    • host: Adresse des entfernten Knotens
    • port: Port des entfernten Knotens
    • primary_slot_name: auf dem entfernten Knoten für die Replikation zu verwendender Slot. Dieser Parameter ist optional; der Standardwert wird aus dem Instanznamen abgeleitet (siehe Funktion slot_name_from_member_name).
    • create_replica_methods: geordnete Liste der Methoden, mit denen ein Standby-Leader vom entfernten Primärserver initialisiert werden kann. Sie kann sich von der in postgresql_settings definierten Liste unterscheiden.
    • restore_command: Befehl zur Wiederherstellung von WAL-Einträgen des entfernten Primärservers auf den Knoten eines Standby-Clusters. Er kann sich von der in postgresql_settings definierten Liste unterscheiden.
    • archive_cleanup_command: Bereinigungsbefehl für den Standby-Leader
    • recovery_min_apply_delay: Wartezeit vor dem tatsächlichen Anwenden von WAL-Einträgen auf einem Standby-Leader
  • member_slots_ttl: Aufbewahrungszeit physischer Replikationsslots für heruntergefahrene Replikate. Standardwert: 30min. Bei 0 bleibt das bisherige Verhalten erhalten (der Slot wird sofort entfernt, wenn der Mitgliedsschlüssel im DCS abläuft). Die Funktion wird erst ab PostgreSQL 11 unterstützt.
  • slots: definiert permanente Replikationsslots. Diese Slots bleiben bei einem Switchover/Failover erhalten. Nicht vorhandene permanente Slots werden von Patroni erstellt. Ab PostgreSQL 11 werden permanente physische Slots auf allen Knoten angelegt und ihre Position alle loop_wait Sekunden vorgerückt. Bei PostgreSQL-Versionen vor 11 werden permanente physische Replikationsslots nur auf dem aktuellen Primärserver verwaltet. Logische Slots werden mit einem Neustart vom Primärserver auf einen Standby kopiert; anschließend wird ihre Position bei Bedarf alle loop_wait Sekunden vorgerückt. Das Kopieren der Dateien logischer Slots erfolgt über eine libpq-Verbindung mit den Zugangsdaten für rewind oder den Superuser (siehe Abschnitt postgresql.authentication). Die Position eines logischen Slots auf dem Replikat kann immer etwas hinter der des bisherigen Primärservers liegen. Daher sollte die Anwendung darauf vorbereitet sein, dass einige Nachrichten nach einem Failover erneut empfangen werden können. Am einfachsten lässt sich dies durch Verfolgen von confirmed_flush_lsn handhaben. Permanente Replikationsslots erfordern, dass postgresql.use_slots auf true gesetzt ist. Sind permanente logische Replikationsslots definiert, aktiviert Patroni automatisch hot_standby_feedback. Da das Failover logischer Replikationsslots unter PostgreSQL 9.6 und älter unsicher ist und PostgreSQL 10 einige wichtige Funktionen fehlen, wird diese Funktion nur unter PostgreSQL 11+ unterstützt.
    • my_slot_name: Name des permanenten Replikationsslots. Entspricht der Name des permanenten Slots dem Namen des aktuellen Knotens, wird er auf diesem Knoten nicht erstellt. Wird ein permanenter physischer Replikationsslot hinzugefügt, dessen Name dem eines Patroni-Mitglieds entspricht, stellt Patroni sicher, dass der erstellte Slot auch dann nicht entfernt wird, wenn das zugehörige Mitglied nicht mehr reagiert. Normalerweise würde Patroni den Slot in dieser Situation entfernen. Das kann nützlich sein, etwa wenn die von Mitgliedern verwendeten Replikationsslots während vorübergehender Ausfälle erhalten bleiben sollen oder bestehende Mitglieder in einen neuen Patroni-Cluster übernommen werden (siehe Eine eigenständige Instanz in einen Patroni-Cluster überführen ). Betreiber sollten jedoch darauf achten, solche Namensüberschneidungen nicht im DCS zu belassen, wenn der Slot nicht mehr benötigt wird, da sie den normalen Betrieb von Patroni beeinflussen.
      • type: Slot-Typ. Möglich sind physical oder logical. Bei einem logischen Slot müssen zusätzlich database und plugin definiert werden. Bei einem physischen Slot kann optional cluster_type definiert werden.
      • database: Name der Datenbank, in der logische Slots erstellt werden sollen.
      • plugin: Name des Plugins für den logischen Slot.
      • cluster_type: Clustertyp (primary oder standby), auf dem der Slot ausschließlich erstellt werden soll. Andernfalls wird er nicht erstellt beziehungsweise ein bereits vorhandener Slot gelöscht.
  • ignore_slots: Liste von Gruppen von Replikationsslot-Eigenschaften; Patroni soll Slots ignorieren, die diesen Eigenschaften entsprechen. Diese Konfiguration/Funktion ist nützlich, wenn einige Replikationsslots außerhalb von Patroni verwaltet werden. Jede passende Teilmenge von Eigenschaften führt dazu, dass ein Slot ignoriert wird.
    • name: Name des Replikationsslots.
    • type: Slot-Typ. Möglich sind physical oder logical. Bei einem logischen Slot können zusätzlich database und/oder plugin definiert werden.
    • database: Datenbankname (beim Abgleich eines logical-Slots).
    • plugin: Plugin für logische Dekodierung (beim Abgleich eines logical-Slots).

Hinweis: slots ist eine Hashmap, ignore_slots dagegen ein Array. Beispiel:

slots:
  permanent_logical_slot_name:
    type: logical
    database: my_db
    plugin: test_decoding
  permanent_physical_slot_name:
    type: physical
  ...
ignore_slots:
  - name: ignored_logical_slot_name
    type: logical
    database: my_db
    plugin: test_decoding
  - name: ignored_physical_slot_name
    type: physical
  ...

Hinweis: Unter PostgreSQL v11 oder neuer verwaltet Patroni physische Replikationsslots auf allen Knoten, die potenziell Leader werden können. Replikatknoten halten dadurch WAL-Segmente vor, die andere Knoten möglicherweise benötigen. Ist ein Knoten nicht verfügbar und läuft sein Mitgliedsschlüssel im DCS ab, wird der zugehörige Replikationsslot nach member_slots_ttl entfernt (Standardwert 30min). Die Aufbewahrungszeit kann je nach Bedarf erhöht oder verringert werden. Bei einer statischen Clustertopologie (feste Anzahl von Knoten, deren Namen sich nie ändern) können alternativ permanente physische Replikationsslots mit den Namen der Knoten konfiguriert werden. So werden Slots nicht entfernt und WAL-Dateien nicht wiederverwendet, während ein Replikat vorübergehend ausgefallen ist:

slots:
  node_name1:
    type: physical
  node_name2:
    type: physical
  node_name3:
    type: physical
  ...
Warnung

Permanente Replikationsslots werden nur von primary/standby_leader zu Replikatknoten synchronisiert. Anwendungen sollen sie daher ausschließlich auf dem Leader-Knoten verwenden. Ihre Verwendung auf Replikatknoten führt zu unbegrenztem Wachstum von pg_wal auf allen anderen Knoten des Clusters. Ausgenommen sind physische Slots, deren Namen den Patroni-Mitgliedsnamen entsprechen (von Patroni erstellt und verwaltet). Diese werden zwischen allen Knoten synchronisiert, da sie für die Replikation untereinander verwendet werden.

Warnung

Das Tag nostream auf einem Standby deaktiviert das Kopieren und Synchronisieren permanenter logischer Replikationsslots auf dem Knoten selbst sowie auf all seinen etwaigen kaskadierenden Replikaten.

3.2 - YAML-Konfigurationseinstellungen

Vollständige Referenz der Optionen und Abschnitte der Patroni-YAML-Konfiguration.


Global/Allgemein

  • thread_pool_size: Größe des Threadpools, mit dem Patroni asynchrone Aufgaben ausführt und während der Leader-Wahl oder bei Failsafe-Prüfungen über die REST API mit anderen Mitgliedern kommuniziert. Mindestwert: 5, Standardwert: 5.
  • thread_stack_size: legt die Stackgröße für von Patroni gestartete Threads fest. Der Wert muss an 64kB ausgerichtet sein. Mindestwert: 64kB, Standardwert (von Patroni gesetzt): 512kB.
  • name: Name des Hosts. Er muss im Cluster eindeutig sein.
  • namespace: Pfad im Konfigurationsspeicher, unter dem Patroni Informationen über den Cluster speichert. Standardwert: “/service”
  • scope: Clustername


Protokollierung

  • type: legt das Protokollformat fest. Mögliche Werte sind plain und json. Für das Format json muss jsonlogger installiert sein. Der Standardwert ist plain.
  • level: legt die allgemeine Protokollierungsstufe fest. Standardwert: INFO (siehe Dokumentation der Python-Protokollierung )
  • traceback_level: legt die Stufe fest, auf der Tracebacks sichtbar sind. Standardwert: ERROR. Auf DEBUG setzen, wenn Tracebacks nur bei aktiviertem log.level=DEBUG sichtbar sein sollen.
  • format: legt die Formatzeichenfolge für Protokolle fest. Beim Protokolltyp plain sollte das Format eine Zeichenfolge sein. Verfügbare Attribute stehen unter LogRecord-Attribute . Beim Protokolltyp json kann das Format neben einer Zeichenfolge auch eine Liste sein. Jeder Listeneintrag sollte einem LogRecord-Attribut entsprechen. Dabei wird nur der Feldname benötigt; %( und ) sollten weggelassen werden. Um ein Protokollfeld unter einem anderen Schlüsselnamen auszugeben, ein Dictionary verwenden: Der Schlüssel bezeichnet das Protokollfeld, der Wert den im Protokoll auszugebenden Feldnamen. Standardwert: %(asctime)s %(levelname)s: %(message)s
  • dateformat: legt die Formatzeichenfolge für Datum und Uhrzeit fest (siehe Dokumentation zu formatTime() ).
  • static_fields: fügt dem Protokoll zusätzliche Felder hinzu. Diese Option ist nur verfügbar, wenn der Protokolltyp auf json gesetzt ist.
  • max_queue_size: Patroni verwendet eine zweistufige Protokollierung. Protokolleinträge werden in eine Warteschlange im Arbeitsspeicher geschrieben; ein separater Thread entnimmt sie und schreibt sie nach stderr oder in eine Datei. Die interne Warteschlange ist standardmäßig auf 1000 Einträge begrenzt, was für die Protokolle der letzten 1h20m ausreicht.
  • dir: Verzeichnis für die Anwendungsprotokolle. Es muss existieren und für den Benutzer, der Patroni ausführt, beschreibbar sein. Ist dieser Wert gesetzt, bewahrt die Anwendung standardmäßig 4 Protokolldateien mit jeweils 25MB auf. Diese Aufbewahrungswerte lassen sich mit file_num und file_size anpassen (siehe unten).
  • mode: Berechtigungen für Protokolldateien (z. B. 0644). Ohne Angabe werden die Berechtigungen anhand des aktuellen umask-Werts gesetzt.
  • file_num: Anzahl der aufzubewahrenden Anwendungsprotokolle.
  • file_size: Größe der Datei patroni.log (in Bytes), bei der eine Protokollrotation ausgelöst wird.
  • loggers: dieser Abschnitt ermöglicht das Neufestlegen der Protokollierungsstufe je Python-Modul
    • patroni.postmaster: WARNING
    • urllib3: DEBUG
  • deduplicate_heartbeat_logs: bei true werden aufeinanderfolgende identische Heartbeat-Protokolleinträge nicht ausgegeben. Standardwert: false.
Warnung

Der Ausführungszeitpunkt der HA-Schleife kann bei der Diagnose von Failovers aufgrund erschöpfter Ressourcen und ähnlicher Probleme sehr wertvoll sein. Ist deduplicate_heartbeat_logs auf true gesetzt, wird für die Ausführung der HA-Schleife kein Protokolleintrag erzeugt (außer bei einem Leader-Wechsel). Diese möglicherweise nützliche Information steht dann in den Protokollen nicht zur Verfügung.

Das folgende Beispiel konfiguriert Patroni für die Protokollierung im JSON-Format.

log:
   type: json
   format:
      - message
      - module
      - asctime: '@timestamp'
      - levelname: level
   static_fields:
      app: patroni


Bootstrap-Konfiguration

Hinweis

Sobald Patroni den Cluster erstmals initialisiert und die Einstellungen im DCS gespeichert hat, haben spätere Änderungen am Abschnitt bootstrap.dcs der YAML-Konfiguration keine Wirkung mehr! Zum Ändern dieser Einstellungen entweder patronictl_edit_config oder die REST API von Patroni verwenden.

  • bootstrap:
    • dcs: dieser Abschnitt wird nach der Initialisierung des neuen Clusters in /<namespace>/<scope>/config des angegebenen Konfigurationsspeichers geschrieben. Er enthält die globale dynamische Konfiguration des Clusters. Unter bootstrap.dcs können alle unter Dynamische Konfigurationseinstellungen beschriebenen Parameter angegeben werden. Nachdem Patroni den neuen Cluster initialisiert hat (Bootstrap), schreibt es diesen Abschnitt in /<namespace>/<scope>/config des Konfigurationsspeichers.

    • method: benutzerdefiniertes Skript zur Initialisierung dieses Clusters.

      Einzelheiten enthält die Dokumentation benutzerdefinierter Bootstrap-Methoden . Bei Angabe von initdb wird der standardmäßige Befehl initdb verwendet. initdb wird auch aufgerufen, wenn die Konfigurationsdatei keinen Parameter method enthält.

    • initdb: (optional) Liste der an initdb zu übergebenden Optionen.

      • - data-checksums: muss aktiviert sein, wenn pg_rewind unter 9.3 benötigt wird.
      • - encoding: UTF8: Standardzeichencodierung für neue Datenbanken.
      • - locale: UTF8: Standard-Locale für neue Datenbanken.
    • post_bootstrap oder post_init: Zusätzliches Skript, das nach der Initialisierung des Clusters ausgeführt wird. Es erhält eine Verbindungs-URL (mit dem Cluster-Superuser als Benutzername). Die Variable PGPASSFILE wird auf den Pfad der pgpass-Datei gesetzt.


Citus

Aktiviert die Integration von Patroni mit Citus . Ist sie konfiguriert, übernimmt Patroni die Registrierung der Citus-Worker-Knoten beim Coordinator. Weitere Informationen zur Citus-Unterstützung stehen hier .

  • group: Citus-Gruppen-ID als Ganzzahl. Für den Coordinator 0 verwenden, für Worker 1, 2 usw.
  • database: Datenbank, in der die Erweiterung citus erstellt werden sollte. Sie muss auf dem Coordinator und allen Workern identisch sein. Derzeit wird nur eine Datenbank unterstützt.


Consul

Die meisten Parameter sind optional, aber host oder url muss angegeben werden.

  • host: host:port des lokalen Consul-Agenten.
  • url: URL des lokalen Consul-Agenten im Format: http(s)://host:port
  • port: (optional) Consul-Port
  • scheme: (optional) http oder https, Standardwert http
  • token: (optional) ACL-Token
  • verify: (optional) bestimmt, ob das SSL-Zertifikat bei HTTPS-Anfragen geprüft wird
  • cacert: (optional) CA-Zertifikat. Falls vorhanden, wird die Validierung aktiviert.
  • cert: (optional) Datei mit dem Clientzertifikat
  • key: (optional) Datei mit dem Clientschlüssel. Kann leer sein, wenn der Schlüssel Bestandteil von cert ist.
  • dc: (optional) Rechenzentrum, mit dem kommuniziert werden soll. Standardmäßig wird das Rechenzentrum des Hosts verwendet.
  • consistency: (optional) wählt den Konsistenzmodus von Consul. Mögliche Werte: default, consistent oder stale (Einzelheiten in der Consul-API-Referenz )
  • checks: (optional) Liste der für die Sitzung verwendeten Consul Health Checks. Standardmäßig wird eine leere Liste verwendet.
  • register_service: (optional) bestimmt, ob ein Dienst registriert wird, dessen Name durch den Parameter scope festgelegt ist und der je nach Knotenrolle das Tag master, primary, replica oder standby-leader erhält. Standardwert false
  • service_tags: (optional) zusätzliche statische Tags für den Consul-Dienst neben der Rolle (primary/replica/standby-leader). Standardmäßig wird eine leere Liste verwendet.
  • service_check_interval: (optional) Häufigkeit der Health Checks für die registrierte URL. Standardwert: ‘5s’.
  • service_check_tls_server_name: (optional) überschreibt den SNI-Host bei TLS-Verbindungen; siehe auch die API-Referenz für Consul-Agent-Prüfungen .

token benötigt folgende ACL-Berechtigungen:

service_prefix "${scope}" {
    policy = "write"
}
key_prefix "${namespace}/${scope}" {
    policy = "write"
}
session_prefix "" {
    policy = "write"
}

etcd

Die meisten Parameter sind optional, aber einer der Parameter host, hosts, url, proxy oder srv muss angegeben werden.

  • host: host:port des etcd-Endpunkts.
  • hosts: Liste der etcd-Endpunkte im Format host1:port1,host2:port2,etc… Möglich sind eine durch Kommas getrennte Zeichenfolge oder eine YAML-Liste.
  • use_proxies: ist dieser Parameter auf true gesetzt, behandelt Patroni hosts als Liste von Proxys und ermittelt nicht die Topologie des etcd-Clusters.
  • url: URL für etcd.
  • proxy: Proxy-URL für etcd. Bei einer Verbindung zu etcd über einen Proxy diesen Parameter anstelle von url verwenden.
  • srv: Domain, in der nach SRV-Einträgen für die automatische Clustererkennung gesucht wird. Patroni fragt für die angegebene Domain diese SRV-Dienstnamen ab (in dieser Reihenfolge bis zum ersten Erfolg): _etcd-client-ssl, _etcd-client, _etcd-ssl, _etcd, _etcd-server-ssl, _etcd-server. Werden SRV-Einträge für _etcd-server-ssl oder _etcd-server gefunden, wird über das ETCD-Peer-Protokoll bei ETCD nach verfügbaren Mitgliedern gefragt. Andernfalls werden die Hosts aus den SRV-Einträgen verwendet.
  • srv_suffix: konfiguriert ein Suffix für den bei der Erkennung abgefragten SRV-Namen. Mit diesem Flag lassen sich mehrere etcd-Cluster unter derselben Domain unterscheiden. Es funktioniert nur zusammen mit srv. Sind beispielsweise srv_suffix: foo und srv: example.org gesetzt, wird folgende DNS-SRV-Abfrage ausgeführt: _etcd-client-ssl-foo._tcp.example.org (entsprechend für jeden möglichen ETCD-SRV-Dienstnamen).
  • protocol: (optional) http oder https; ohne Angabe wird http verwendet. Ist url oder proxy angegeben, wird das Protokoll daraus übernommen.
  • username: (optional) Benutzername für die etcd-Authentifizierung.
  • password: (optional) Passwort für die etcd-Authentifizierung.
  • cacert: (optional) CA-Zertifikat. Falls vorhanden, wird die Validierung aktiviert.
  • cert: (optional) Datei mit dem Clientzertifikat
  • key: (optional) Datei mit dem Clientschlüssel. Kann leer sein, wenn der Schlüssel Bestandteil von cert ist.

Etcdv3

Damit Patroni mit dem etcd-Cluster über Protokollversion 3 arbeitet, muss in der Patroni-Konfigurationsdatei der Abschnitt etcd3 verwendet werden. Alle Konfigurationsparameter entsprechen denen für etcd.

Warnung

Mit Protokollversion 2 erstellte Schlüssel sind mit Protokollversion 3 nicht sichtbar und umgekehrt. Daher ist ein Wechsel von etcd zu etcd3 allein durch Ändern der Patroni-Konfigurationsdatei nicht möglich. Zudem verwendet Patroni das gRPC-Gateway (Proxy) von etcd zur Kommunikation mit der V3 API, weshalb eine TLS-Authentifizierung über den Common Name nicht möglich ist.


ZooKeeper

  • hosts: Liste der ZooKeeper-Clustermitglieder im Format: ′host1:port1′,′host2:port2′,′etc...′'host1:port1', 'host2:port2', 'etc...'.
  • use_ssl: (optional) bestimmt, ob SSL verwendet wird. Standardwert: false. Bei false werden alle SSL-spezifischen Parameter ignoriert.
  • cacert: (optional) CA-Zertifikat. Falls vorhanden, wird die Validierung aktiviert.
  • cert: (optional) Datei mit dem Clientzertifikat.
  • key: (optional) Datei mit dem Clientschlüssel.
  • key_password: (optional) Passwort für den Clientschlüssel.
  • verify: (optional) bestimmt, ob das Zertifikat geprüft wird. Standardwert: true.
  • set_acls: (optional) falls gesetzt, wird Kazoo so konfiguriert, dass es auf jeden neu erstellten ZNode eine Standard-ACL anwendet. ACLs können das Schema x509 (Standard) oder andere unterstützte ZooKeeper-Schemata wie digest verwenden. Sie sollten als Dictionary angegeben werden, dessen Schlüssel der vollständige Principal (optional mit vorangestelltem Schema) und dessen Wert eine Liste von Berechtigungen ist. Als Berechtigungen sind eine oder mehrere aus CREATE, READ, WRITE, DELETE, ADMIN oder ALL möglich. Beispiel: set_acls: {CN=principal1: [CREATE, READ], digest:principal2:+pjROuBuuwNNSujKyH8dGcEnFPQ=: [ALL]}.
  • auth_data: (optional) Zugangsdaten für die Verbindung. Sollte ein Dictionary mit scheme als Schlüssel und credential als Wert sein. Standardwert ist ein leeres Dictionary.
Hinweis

Für SSL-Unterstützung muss kazoo>=2.6.0 installiert sein.


Exhibitor

  • hosts: anfängliche Liste der Exhibitor-Knoten (ZooKeeper) im Format: ‘host1,host2,etc…’. Diese Liste wird bei jeder Änderung der Topologie des Exhibitor-Clusters (ZooKeeper) automatisch aktualisiert.
  • poll_interval: Häufigkeit, mit der die Liste der ZooKeeper- und Exhibitor-Knoten von Exhibitor aktualisiert werden sollte.
  • port: Exhibitor-Port.


Kubernetes

  • bypass_api_service: (optional) bei der Kommunikation mit der Kubernetes API verwendet Patroni normalerweise den Dienst kubernetes , dessen Adresse den Pods über die Umgebungsvariable KUBERNETES_SERVICE_HOST bereitgestellt wird. Ist bypass_api_service auf true gesetzt, ermittelt Patroni die Liste der API-Knoten hinter dem Dienst und verbindet sich direkt mit ihnen.
  • namespace: (optional) Kubernetes-Namespace, in dem der Patroni-Pod läuft. Standardwert: default.
  • labels: Labels im Format {label1: value1, label2: value2}. Mit diesen Labels werden vorhandene Objekte (Pods sowie Endpoints oder ConfigMaps) gesucht, die zum aktuellen Cluster gehören. Außerdem setzt Patroni sie auf jedem von ihm erstellten Objekt (Endpoint oder ConfigMap).
  • scope_label: (optional) Name des Labels mit dem Clusternamen. Standardwert: cluster-name.
  • bootstrap_labels: (optional) Labels im Format {label1: value1, label2: value2}. Sie werden einem Patroni-Pod zugewiesen, wenn sein Zustand initializing new cluster, running custom bootstrap script, starting after custom bootstrap oder creating replica ist.
  • role_label: (optional) Name des Labels mit der Rolle (primary, replica oder ein anderer benutzerdefinierter Wert). Patroni setzt dieses Label auf dem Pod, in dem es läuft. Standardwert: role.
  • leader_label_value: (optional) Wert des Pod-Labels, wenn die Postgres-Rolle primary ist. Standardwert: primary.
  • follower_label_value: (optional) Wert des Pod-Labels, wenn die Postgres-Rolle replica ist. Standardwert: replica.
  • standby_leader_label_value: (optional) Wert des Pod-Labels, wenn die Postgres-Rolle standby_leader ist. Standardwert: primary.
  • tmp_role_label: (optional) Name des temporären Labels mit der Rolle (primary oder replica). Der Wert dieses Labels entspricht immer dem Standardwert der jeweiligen Rolle. Nur bei Bedarf setzen.
  • use_endpoints: (optional) bei true verwendet Patroni Endpoints anstelle von ConfigMaps für die Leader-Wahl und zum Speichern des Clusterzustands.
  • pod_ip: (optional) IP-Adresse des Pods, in dem Patroni läuft. Dieser Wert ist erforderlich, wenn use_endpoints aktiviert ist, und wird beim Hochstufen von PostgreSQL im Pod zum Befüllen der Subsets des Leader-Endpoints verwendet.
  • ports: (optional) enthält das Service-Objekt einen Namen für den Port, muss derselbe Name im Endpoint-Objekt erscheinen; andernfalls funktioniert der Dienst nicht. Ist der Dienst beispielsweise als {Kind: Service, spec: {ports: [{name: postgresql, port: 5432, targetPort: 5432}]}} definiert, muss kubernetes.ports: [{"name": "postgresql", "port": 5432}] gesetzt werden. Patroni verwendet dies zum Aktualisieren der Subsets des Leader-Endpoints. Dieser Parameter wird nur verwendet, wenn kubernetes.use_endpoints gesetzt ist.
  • cacert: (optional) gibt die CA_BUNDLE-Datei mit den Zertifikaten vertrauenswürdiger CAs an, die zum Prüfen der SSL-Zertifikate der Kubernetes API verwendet werden. Ohne Angabe verwendet Patroni den Wert aus dem ServiceAccount-Secret.
  • retriable_http_codes: (optional) Liste der HTTP-Statuscodes der K8s API, bei denen ein erneuter Versuch erfolgt. Standardmäßig wiederholt Patroni die Anfrage bei 500, 503 und 504 oder wenn die Antwort der K8s API den HTTP-Header retry-after enthält.


Raft (veraltet)

  • self_addr: ip:port, an dem auf Raft-Verbindungen gewartet wird. self_addr muss von anderen Clusterknoten aus erreichbar sein. Ohne Angabe nimmt der Knoten nicht am Konsens teil.

  • bind_addr: (optional) ip:port, an dem auf Raft-Verbindungen gewartet wird. Ohne Angabe wird self_addr verwendet.

  • partner_addrs: Liste der anderen Patroni-Knoten im Cluster im Format:

    ′ip1:port′,′ip2:port′,′etc...′'ip1:port', 'ip2:port', 'etc...'
  • data_dir: Verzeichnis zum Speichern des Raft-Logs und des Snapshots. Ohne Angabe wird das aktuelle Arbeitsverzeichnis verwendet.

  • password: (optional) verschlüsselt den Raft-Datenverkehr mit dem angegebenen Passwort; erfordert das Python-Modul cryptography.

  • min_timeout: (optional) minimale Zeitüberschreitung für Wahlen in der zugrunde liegenden Raft-Implementierung pysyncobj, in Sekunden. Muss größer als 3 * append_entries_period sein. Standardwert: 0.4.

  • max_timeout: (optional) maximale Zeitüberschreitung für Wahlen in der zugrunde liegenden Raft-Implementierung pysyncobj, in Sekunden. Muss größer als min_timeout sein. Standardwert: 1.4.

  • connection_timeout: (optional) Zeit in Sekunden, nach der eine Verbindung ohne Datenempfang als unterbrochen gilt. Muss größer oder gleich max_timeout sein. Standardwert: 3.5.

  • append_entries_period: (optional) Intervall in Sekunden zum Senden von Heartbeat-Befehlen (append_entries). Muss kleiner als ein Drittel von min_timeout sein. Standardwert: 0.1.

  • connection_retry_time: (optional) Intervall in Sekunden zwischen erneuten Verbindungsversuchen zu nicht erreichbaren Knoten. Standardwert: 5.0.

  • leader_fallback_timeout: (optional) Zeit in Sekunden, nach der ein Leader ohne Antwort von der Mehrheit in den Follower-Zustand zurückkehrt. Muss größer als append_entries_period sein. Standardwert: 30.0.

Hinweis

Diese Zeitüberschreitungsparameter sind in Netzwerken mit hoher Latenz nützlich, in denen die standardmäßigen Zeitüberschreitungen von pysyncobj zu kurz sind. Folgende Bedingungen müssen erfüllt sein: min_timeout > 3 * append_entries_period, max_timeout > min_timeout, connection_timeout >= max_timeout und leader_fallback_timeout > append_entries_period. Patroni prüft diese Bedingungen beim Start und verweigert den Start, wenn sie verletzt sind. Diese Werte können nicht zur Laufzeit geändert werden und erfordern einen Neustart.

[!WARNING] Diese Einstellungen verlängern lediglich die Zeitüberschreitungen für Wahlen und Verbindungen in pysyncobj; sie verlängern nicht die Frist, die Patroni jedem einzelnen Raft-Befehl setzt. Jeder Raft-Befehl (Aktualisierung der Leader-Sperre, Schreiben des Clusterzustands) muss weiterhin innerhalb von retry_timeout (Standardwert 10) abgeschlossen sein. Bei Verbindungen mit sehr hoher Latenz – ungefähr ab einigen Sekunden Round-Trip-Zeit – kann ein einzelner Befehl retry_timeout überschreiten, selbst wenn connection_timeout deutlich über die RTT angehoben wurde. Der DCS erscheint dann als nicht erreichbar, und der Primärserver kann herabgestuft werden. Bei solchen Verbindungen müssen auch retry_timeout und ttl entsprechend angehoben werden; dabei muss loop_wait + 2 * retry_timeout <= ttl weiterhin gelten.

Kurze FAQ zur Raft-Implementierung

  • F: Wie lassen sich alle am Konsens beteiligten Knoten auflisten?

    A: syncobj_admin -conn host:port -status, wobei host:port die Adresse eines Clusterknotens ist.

  • F: Ein am Konsens beteiligter Knoten ist ausgefallen, und seine IP-Adresse kann nicht für einen anderen Knoten wiederverwendet werden. Wie lässt sich dieser Knoten aus dem Konsens entfernen?

    A: syncobj_admin -conn host:port -remove host2:port2, wobei host2:port2 die Adresse des Knotens ist, der aus dem Konsens entfernt werden soll.

  • F: Woher bekommt man das Werkzeug syncobj_admin?

    A: Es wird zusammen mit dem Modul pysyncobj (RAFT-Implementierung in Python) installiert, von dem Patroni abhängt.

  • F: Kann ein Patroni-Knoten betrieben werden, ohne ihn in den Konsens aufzunehmen?

    A: Ja, dazu raft.self_addr in der Patroni-Konfiguration auskommentieren oder entfernen.

  • F: Können Patroni und PostgreSQL auf nur zwei Knoten betrieben werden?

    A: Ja, auf dem dritten Knoten kann patroni_raft_controller laufen (ohne Patroni und PostgreSQL). Bei dieser Konfiguration kann ein Knoten vorübergehend ausfallen, ohne den Primärserver zu beeinträchtigen.


PostgreSQL

  • postgresql:
    • authentication:

      • superuser:
        • username: Name des Superusers, der bei der Initialisierung (initdb) festgelegt und später von Patroni für Verbindungen zu Postgres verwendet wird.
        • password: Passwort des Superusers, das bei der Initialisierung (initdb) festgelegt wird.
        • sslmode: (optional) entspricht dem Verbindungsparameter sslmode , der dem Client die Auswahl des Modus für die TLS-Aushandlung mit dem Server erlaubt. Einzelheiten zur Funktionsweise der einzelnen Modi stehen in der PostgreSQL-Dokumentation . Der Standardmodus ist prefer.
        • sslkey: (optional) entspricht dem Verbindungsparameter sslkey , der den Speicherort des geheimen Schlüssels für das Clientzertifikat angibt.
        • sslpassword: (optional) entspricht dem Verbindungsparameter sslpassword , der das Passwort für den in sslkey angegebenen geheimen Schlüssel festlegt.
        • sslcert: (optional) entspricht dem Verbindungsparameter sslcert , der den Speicherort des Clientzertifikats angibt.
        • sslrootcert: (optional) entspricht dem Verbindungsparameter sslrootcert , der den Pfad zu einer Datei mit einem oder mehreren Zertifikaten von Zertifizierungsstellen (CA) angibt, mit denen der Client ein Serverzertifikat prüft.
        • sslcrl: (optional) entspricht dem Verbindungsparameter sslcrl , der den Pfad zu einer Datei mit einer Zertifikatsperrliste angibt. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
        • sslcrldir: (optional) entspricht dem Verbindungsparameter sslcrldir , der den Pfad zu einem Verzeichnis mit Dateien angibt, die eine Zertifikatsperrliste enthalten. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
        • sslnegotiation: (optional) entspricht dem Verbindungsparameter sslnegotiation , der steuert, wie die SSL-Verschlüsselung mit dem Server ausgehandelt wird, falls SSL verwendet wird.
        • gssencmode: (optional) entspricht dem Verbindungsparameter gssencmode , der bestimmt, ob und mit welcher Priorität eine sichere GSS-Verbindung über TCP/IP mit dem Server ausgehandelt wird.
        • channel_binding: (optional) entspricht dem Verbindungsparameter channel_binding , der die Verwendung von Channel Binding durch den Client steuert.
      • replication:
        • username: Benutzername für die Replikation; der Benutzer wird bei der Initialisierung erstellt. Replikate verwenden ihn, um per Streaming-Replikation auf die Replikationsquelle zuzugreifen.
        • password: Passwort für die Replikation; der Benutzer wird bei der Initialisierung erstellt.
        • sslmode: (optional) entspricht dem Verbindungsparameter sslmode , der dem Client die Auswahl des Modus für die TLS-Aushandlung mit dem Server erlaubt. Einzelheiten zur Funktionsweise der einzelnen Modi stehen in der PostgreSQL-Dokumentation . Der Standardmodus ist prefer.
        • sslkey: (optional) entspricht dem Verbindungsparameter sslkey , der den Speicherort des geheimen Schlüssels für das Clientzertifikat angibt.
        • sslpassword: (optional) entspricht dem Verbindungsparameter sslpassword , der das Passwort für den in sslkey angegebenen geheimen Schlüssel festlegt.
        • sslcert: (optional) entspricht dem Verbindungsparameter sslcert , der den Speicherort des Clientzertifikats angibt.
        • sslrootcert: (optional) entspricht dem Verbindungsparameter sslrootcert , der den Pfad zu einer Datei mit einem oder mehreren Zertifikaten von Zertifizierungsstellen (CA) angibt, mit denen der Client ein Serverzertifikat prüft.
        • sslcrl: (optional) entspricht dem Verbindungsparameter sslcrl , der den Pfad zu einer Datei mit einer Zertifikatsperrliste angibt. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
        • sslcrldir: (optional) entspricht dem Verbindungsparameter sslcrldir , der den Pfad zu einem Verzeichnis mit Dateien angibt, die eine Zertifikatsperrliste enthalten. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
        • sslnegotiation: (optional) entspricht dem Verbindungsparameter sslnegotiation , der steuert, wie die SSL-Verschlüsselung mit dem Server ausgehandelt wird, falls SSL verwendet wird.
        • gssencmode: (optional) entspricht dem Verbindungsparameter gssencmode , der bestimmt, ob und mit welcher Priorität eine sichere GSS-Verbindung über TCP/IP mit dem Server ausgehandelt wird.
        • channel_binding: (optional) entspricht dem Verbindungsparameter channel_binding , der die Verwendung von Channel Binding durch den Client steuert.
      • rewind:
        • username: (optional) Name des Benutzers für pg_rewind; er wird bei der Initialisierung von Postgres 11+ erstellt und erhält alle erforderlichen Berechtigungen .
        • password: (optional) Passwort des Benutzers für pg_rewind; er wird bei der Initialisierung erstellt.
        • sslmode: (optional) entspricht dem Verbindungsparameter sslmode , der dem Client die Auswahl des Modus für die TLS-Aushandlung mit dem Server erlaubt. Einzelheiten zur Funktionsweise der einzelnen Modi stehen in der PostgreSQL-Dokumentation . Der Standardmodus ist prefer.
        • sslkey: (optional) entspricht dem Verbindungsparameter sslkey , der den Speicherort des geheimen Schlüssels für das Clientzertifikat angibt.
        • sslpassword: (optional) entspricht dem Verbindungsparameter sslpassword , der das Passwort für den in sslkey angegebenen geheimen Schlüssel festlegt.
        • sslcert: (optional) entspricht dem Verbindungsparameter sslcert , der den Speicherort des Clientzertifikats angibt.
        • sslrootcert: (optional) entspricht dem Verbindungsparameter sslrootcert , der den Pfad zu einer Datei mit einem oder mehreren Zertifikaten von Zertifizierungsstellen (CA) angibt, mit denen der Client ein Serverzertifikat prüft.
        • sslcrl: (optional) entspricht dem Verbindungsparameter sslcrl , der den Pfad zu einer Datei mit einer Zertifikatsperrliste angibt. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
        • sslcrldir: (optional) entspricht dem Verbindungsparameter sslcrldir , der den Pfad zu einem Verzeichnis mit Dateien angibt, die eine Zertifikatsperrliste enthalten. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
        • sslnegotiation: (optional) entspricht dem Verbindungsparameter sslnegotiation , der steuert, wie die SSL-Verschlüsselung mit dem Server ausgehandelt wird, falls SSL verwendet wird.
        • gssencmode: (optional) entspricht dem Verbindungsparameter gssencmode , der bestimmt, ob und mit welcher Priorität eine sichere GSS-Verbindung über TCP/IP mit dem Server ausgehandelt wird.
        • channel_binding: (optional) entspricht dem Verbindungsparameter channel_binding , der die Verwendung von Channel Binding durch den Client steuert.
    • callbacks: Callback-Skripte, die bei bestimmten Aktionen ausgeführt werden. Patroni übergibt Aktion, Rolle und Clusternamen. (scripts/aws.py zeigt ein Beispiel für solche Skripte.)

      • on_reload: führt dieses Skript aus, wenn das Neuladen der Konfiguration ausgelöst wird.
      • on_restart: führt dieses Skript aus, wenn Postgres neu startet (ohne Rollenwechsel).
      • on_role_change: führt dieses Skript aus, wenn Postgres hoch- oder herabgestuft wird.
      • on_start: führt dieses Skript aus, wenn Postgres startet.
      • on_stop: führt dieses Skript aus, wenn Postgres stoppt.
    • connect_address: IP-Adresse + Port, über die Postgres für andere Knoten und Anwendungen erreichbar ist.

    • proxy_address: IP-Adresse + Port, über die ein neben Postgres laufender Verbindungspool (z. B. PgBouncer) erreichbar ist. Der Wert wird als proxy_url in den Mitgliedsschlüssel im DCS geschrieben und kann für die Diensterkennung verwendet werden beziehungsweise nützlich sein.

    • create_replica_methods: geordnete Liste der Erstellungsmethoden, mit denen ein Patroni-Knoten zu einem neuen Replikat wird. Die Standardmethode ist “basebackup”; andere Methoden verweisen auf Skripte, die jeweils mit einem eigenen Konfigurationseintrag konfiguriert werden. Weitere Erläuterungen enthält die Dokumentation benutzerdefinierter Methoden zur Replikaterstellung .

    • data_dir: Pfad zum Postgres-Datenverzeichnis, das bereits existiert oder von Patroni initialisiert werden soll.

    • config_dir: Pfad zum Postgres-Konfigurationsverzeichnis; standardmäßig das Datenverzeichnis. Es muss für Patroni beschreibbar sein.

    • bin_dir: (optional) Pfad zu den PostgreSQL-Programmdateien (pg_ctl, initdb, pg_controldata, pg_basebackup, postgres, pg_isready, pg_rewind). Ohne Angabe oder bei einer leeren Zeichenfolge werden die Programme über die Umgebungsvariable PATH gesucht.

    • bin_name: (optional) ermöglicht das Überschreiben der Postgres-Programmnamen bei einer benutzerdefinierten Postgres-Distribution:

      • pg_ctl: (optional) benutzerdefinierter Name für die Programmdatei pg_ctl.
      • initdb: (optional) benutzerdefinierter Name für die Programmdatei initdb.
      • pg_controldata: (optional) benutzerdefinierter Name für die Programmdatei pg_controldata.
      • pg_basebackup: (optional) benutzerdefinierter Name für die Programmdatei pg_basebackup.
      • postgres: (optional) benutzerdefinierter Name für die Programmdatei postgres.
      • pg_isready: (optional) benutzerdefinierter Name für die Programmdatei pg_isready.
      • pg_rewind: (optional) benutzerdefinierter Name für die Programmdatei pg_rewind.
    • listen: IP-Adresse + Port, an denen Postgres auf Verbindungen wartet; bei Streaming-Replikation müssen sie von anderen Clusterknoten aus erreichbar sein. Mehrere durch Kommas getrennte Adressen sind zulässig, sofern der Port nach der letzten Adresse mit einem Doppelpunkt angehängt wird, etwa listen: 127.0.0.1,127.0.0.2:5432. Patroni verwendet die erste Adresse dieser Liste, um lokale Verbindungen zum PostgreSQL-Knoten aufzubauen.

    • use_unix_socket: legt fest, dass Patroni für die Verbindung zum Cluster bevorzugt Unix-Sockets verwenden sollte. Standardwert: false. Ist unix_socket_directories definiert, verwendet Patroni daraus den ersten geeigneten Wert für die Verbindung zum Cluster und greift auf TCP zurück, wenn kein Wert geeignet ist. Ist unix_socket_directories nicht in postgresql.parameters angegeben, nimmt Patroni an, dass der Standardwert verwendet werden sollte, und lässt host in den Verbindungsparametern weg.

    • use_unix_socket_repl: legt fest, dass Patroni für die Clusterverbindung des Replikationsbenutzers bevorzugt Unix-Sockets verwenden sollte. Standardwert: false. Ist unix_socket_directories definiert, verwendet Patroni daraus den ersten geeigneten Wert für die Verbindung zum Cluster und greift auf TCP zurück, wenn kein Wert geeignet ist. Ist unix_socket_directories nicht in postgresql.parameters angegeben, nimmt Patroni an, dass der Standardwert verwendet werden sollte, und lässt host in den Verbindungsparametern weg.

    • pgpass: Pfad zur Passwortdatei .pgpass . Patroni erstellt diese Datei vor dem Ausführen von pg_basebackup, des Skripts post_init und in einigen weiteren Fällen. Der Speicherort muss für Patroni beschreibbar sein.

    • recovery_conf: zusätzliche Konfigurationseinstellungen, die beim Konfigurieren eines Followers in recovery.conf geschrieben werden.

    • custom_conf : Pfad zu einer optionalen benutzerdefinierten Datei postgresql.conf, die anstelle von postgresql.base.conf verwendet wird. Sie muss auf allen Clusterknoten existieren, für PostgreSQL lesbar sein und wird von ihrem Speicherort aus in die tatsächliche postgresql.conf eingebunden. Patroni überwacht diese Datei weder auf Änderungen noch erstellt es ein Backup davon. Ihre Einstellungen können dennoch durch Patronis eigene Konfigurationsmöglichkeiten überschrieben werden; Einzelheiten stehen unter Dynamische Konfiguration .

    • parameters: Konfigurationsparameter (GUCs) für Postgres im Format {ssl: "on", ssl_cert_file: "cert_file"}.

    • parameters_primary: (optional) rollenspezifische Parameterüberschreibungen für primary. Diese Werte werden mit den grundlegenden parameters zusammengeführt und überschreiben sie.

    • parameters_replica: (optional) rollenspezifische Parameterüberschreibungen für replica. Diese Werte werden mit den grundlegenden parameters zusammengeführt und überschreiben sie.

    • parameters_standby_leader: (optional) rollenspezifische Parameterüberschreibungen für standby_leader. Diese Werte werden mit den grundlegenden parameters zusammengeführt und überschreiben sie.

    • pg_hba: Liste der Zeilen, aus denen Patroni pg_hba.conf erzeugt. Patroni ignoriert diesen Parameter, wenn der PostgreSQL-Parameter hba_file auf einen anderen Wert als den Standardwert gesetzt ist. Zusammen mit der dynamischen Konfiguration vereinfacht dieser Parameter die Verwaltung von pg_hba.conf.

      • - host all all 0.0.0.0/0 md5
      • - host replication replicator 127.0.0.1/32 md5: Eine solche Zeile ist für die Replikation erforderlich.
    • pg_hba_primary: (optional) rollenspezifische pg_hba-Einträge für primary. Sie ersetzen pg_hba vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_hba verwendet.

    • pg_hba_replica: (optional) rollenspezifische pg_hba-Einträge für replica. Sie ersetzen pg_hba vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_hba verwendet.

    • pg_hba_standby_leader: (optional) rollenspezifische pg_hba-Einträge für standby_leader. Sie ersetzen pg_hba vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_hba verwendet.

    • pg_ident: Liste der Zeilen, aus denen Patroni pg_ident.conf erzeugt. Patroni ignoriert diesen Parameter, wenn der PostgreSQL-Parameter ident_file auf einen anderen Wert als den Standardwert gesetzt ist. Zusammen mit der dynamischen Konfiguration vereinfacht dieser Parameter die Verwaltung von pg_ident.conf.

      • - mapname1 systemname1 pguser1
      • - mapname1 systemname2 pguser2
    • pg_ident_primary: (optional) rollenspezifische pg_ident-Einträge für primary. Sie ersetzen pg_ident vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_ident verwendet.

    • pg_ident_replica: (optional) rollenspezifische pg_ident-Einträge für replica. Sie ersetzen pg_ident vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_ident verwendet.

    • pg_ident_standby_leader: (optional) rollenspezifische pg_ident-Einträge für standby_leader. Sie ersetzen pg_ident vollständig (keine Zusammenführung). Sind sie nicht definiert, wird pg_ident verwendet.

    • pg_ctl_timeout: Wartezeit für pg_ctl bei start, stop oder restart. Der Standardwert beträgt 60 Sekunden.

    • use_pg_rewind: versucht, pg_rewind auf dem bisherigen Leader zu verwenden, wenn er dem Cluster als Replikat beitritt. Der Cluster muss mit data page checksums (Option --data-checksums für initdb) initialisiert worden sein und/oder wal_log_hints muss auf on gesetzt sein, andernfalls funktioniert pg_rewind nicht.

    • rewind: (optional) benutzerdefinierte Optionen für den Befehl pg_rewind. Sie können als Liste von Zeichenfolgen und/oder Dictionaries mit jeweils einem Schlüssel-Wert-Paar angegeben werden. Zu den nicht zulässigen Optionen gehören: target-pgdata, source-pgdata, source-server, write-recovery-conf, dry-run, restore-target-wal, config-file, no-ensure-shutdown, version und help. Beispiel:

      postgresql:
        rewind:
          - debug
          - progress
          - sync-method: fsync
    • remove_data_directory_on_rewind_failure: ist diese Option aktiviert, entfernt Patroni das PostgreSQL-Datenverzeichnis und erstellt das Replikat neu. Andernfalls versucht es, dem neuen Leader zu folgen. Standardwert: false.

    • remove_data_directory_on_diverged_timelines: Patroni entfernt das PostgreSQL-Datenverzeichnis und erstellt das Replikat neu, wenn es auseinanderlaufende Timelines erkennt und der bisherige Primärserver nicht mit dem Streaming vom neuen Primärserver beginnen kann. Diese Option ist nützlich, wenn pg_rewind nicht verwendet werden kann. Beim Prüfen auf auseinanderlaufende Timelines unter PostgreSQL v10 und älter versucht Patroni, sich mit den Replikationszugangsdaten zur Datenbank “postgres” zu verbinden. Daher sollte dieser Zugriff in pg_hba.conf erlaubt sein. Standardwert: false.

    • replica_method: für jeden Eintrag in create_replica_methods außer basebackup wird ein gleichnamiger Konfigurationsabschnitt hinzugefügt. Er sollte mindestens “command” mit dem vollständigen Pfad zum auszuführenden Skript enthalten. Andere Konfigurationsparameter werden im Format “parameter=value” an das Skript übergeben.

    • pre_promote: Fencing-Skript, das während eines Failovers nach dem Erwerb der Leader-Sperre, aber vor dem Hochstufen des Replikats ausgeführt wird. Endet das Skript mit einem von null verschiedenen Code, stuft Patroni das Replikat nicht hoch und entfernt den Leader-Schlüssel aus dem DCS.

    • before_stop: Skript, das unmittelbar vor dem Stoppen von Postgres ausgeführt wird. Anders als ein Callback läuft dieses Skript synchron und blockiert das Herunterfahren bis zu seinem Abschluss. Sein Rückgabecode beeinflusst nicht, ob das Herunterfahren anschließend fortgesetzt wird.


REST API

  • restapi:
    • thread_pool_size: Größe des Threadpools, mit dem Patroni REST-API-Anfragen verarbeitet. Mindestwert: 5, Standardwert: 5.
    • connect_address: IP-Adresse (oder Hostname) und Port für den Zugriff auf die REST API von Patroni. Alle Clustermitglieder müssen diese Adresse erreichen können. Sofern die Patroni-Installation nicht als lokale Demo gedacht ist, darf daher weder “localhost” noch eine Loopback-Adresse (also “localhost” oder “127.0.0.1”) verwendet werden. Die Adresse kann als Endpunkt für HTTP Health Checks (siehe unten den REST-API-Parameter “listen”), für Benutzerabfragen (direkt oder über die REST API) sowie für die Health Checks der Clustermitglieder während der Leader-Wahl dienen (etwa um festzustellen, ob der Leader noch läuft oder ob ein Knoten eine weiter fortgeschrittene WAL-Position hat als der abfragende Knoten). connect_address wird im Mitgliedsschlüssel im DCS gespeichert, sodass sich der Mitgliedsname in die Adresse für den Zugriff auf dessen REST API auflösen lässt.
    • listen: IP-Adresse (oder Hostname) und Port, an denen Patroni für die REST API auf Verbindungen wartet, um die oben beschriebenen Health Checks und die Kommunikation zwischen den beteiligten Clusterknoten bereitzustellen. Dient außerdem zum Bereitstellen von Health-Check-Informationen für HAProxy (oder jeden anderen Load-Balancer, der HTTP-Prüfungen mit “OPTIONS” oder “GET” ausführen kann).
    • authentication: (optional)
      • username: Benutzername für die Basic-Authentifizierung zum Schutz unsicherer REST-API-Endpunkte.
      • password: Passwort für die Basic-Authentifizierung zum Schutz unsicherer REST-API-Endpunkte.
    • certfile: (optional) gibt die Datei mit dem Zertifikat im PEM-Format an. Ist certfile nicht angegeben oder leer, arbeitet der API-Server ohne SSL.
    • keyfile: (optional) gibt die Datei mit dem geheimen Schlüssel im PEM-Format an.
    • keyfile_password: (optional) gibt ein Passwort zum Entschlüsseln der Schlüsseldatei an.
    • cafile: (optional) gibt die Datei mit dem CA_BUNDLE vertrauenswürdiger CA-Zertifikate an, die zum Prüfen der Clientzertifikate verwendet werden.
    • ciphers: (optional) gibt die zulässigen Cipher Suites an (z. B. “ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1”)
    • verify_client: (optional) none (Standard), optional oder required. Bei none prüft die REST API keine Clientzertifikate. Bei required sind Clientzertifikate für alle REST-API-Aufrufe erforderlich. Bei optional sind sie für alle unsicheren REST-API-Endpunkte erforderlich. Bei required ist die Clientauthentifizierung erfolgreich, wenn die Prüfung der Zertifikatssignatur erfolgreich ist. Bei optional wird das Clientzertifikat nur bei Anfragen mit PUT, POST, PATCH und DELETE geprüft.
    • allowlist: (optional): legt die Hosts fest, die unsichere REST-API-Endpunkte aufrufen dürfen. Ein Eintrag kann ein Hostname, eine IP-Adresse oder eine Netzwerkadresse in CIDR-Schreibweise sein. Standardmäßig gilt allow all. Ist allowlist oder allowlist_include_members gesetzt, werden alle nicht enthaltenen Zugriffe abgelehnt.
    • allowlist_include_members: (optional): bei true dürfen andere im DCS registrierte Clustermitglieder auf unsichere REST-API-Endpunkte zugreifen (IP-Adresse oder Hostname werden aus api_url des Mitglieds übernommen). Vorsicht: Das Betriebssystem kann für ausgehende Verbindungen eine andere IP-Adresse verwenden.
    • http_extra_headers: (optional) HTTP-Header ermöglichen es dem REST-API-Server, zusätzliche Informationen mit einer HTTP-Antwort zu übertragen.
    • https_extra_headers: (optional) HTTPS-Header ermöglichen es dem REST-API-Server, bei aktiviertem TLS zusätzliche Informationen mit einer HTTP-Antwort zu übertragen. Die in http_extra_headers festgelegten Zusatzinformationen werden ebenfalls übertragen.
    • request_queue_size: (optional): legt die Größe der Anfragewarteschlange für den TCP-Socket der Patroni REST API fest. Ist die Warteschlange voll, erhalten weitere Anfragen den Fehler “Connection denied”. Der Standardwert ist 5.
    • server_tokens: (optional): konfiguriert den Wert des HTTP-Headers Server.
      • Minimal: Der Header enthält nur die Patroni-Version, etwa Patroni/4.0.0.
      • ProductOnly: Der Header enthält nur den Produktnamen, etwa Patroni.
      • Original (Standard): Der Header behält das ursprüngliche Verhalten bei und zeigt die Versionen von BaseHTTP und Python an, etwa BaseHTTP/0.6 Python/3.12.3.

Hier ein Beispiel für http_extra_headers und https_extra_headers:

restapi:
  listen: <listen>
  connect_address: <connect_address>
  authentication:
    username: <username>
    password: <password>
  http_extra_headers:
    'X-Frame-Options': 'SAMEORIGIN'
    'X-XSS-Protection': '1; mode=block'
    'X-Content-Type-Options': 'nosniff'
  cafile: <ca file>
  certfile: <cert>
  keyfile: <key>
  https_extra_headers:
    'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'

Warnung

  • restapi.connect_address muss von allen Knoten des jeweiligen Patroni-Clusters aus erreichbar sein. Intern verwendet Patroni diese Adresse während der Leader-Wahl, um die Knoten mit dem geringsten Replikationsrückstand zu ermitteln.
  • Ist die Prüfung von Clientzertifikaten aktiviert (restapi.verify_client auf required gesetzt), müssen außerdem gültige Clientzertifikate in ctl.certfile, ctl.keyfile, ctl.keyfile_password angegeben werden. Andernfalls funktioniert Patroni nicht korrekt.


CTL

  • ctl: (optional)
    • authentication:
      • username: Benutzername für die Basic-Authentifizierung beim Zugriff auf geschützte REST-API-Endpunkte. Ohne Angabe verwendet patronictl den Wert des REST-API-Parameters “username”.
      • password: Passwort für die Basic-Authentifizierung beim Zugriff auf geschützte REST-API-Endpunkte. Ohne Angabe verwendet patronictl den Wert des REST-API-Parameters “password”.
    • insecure: erlaubt Verbindungen zur REST API ohne Prüfung der SSL-Zertifikate.
    • cacert: gibt die CA_BUNDLE-Datei oder das Verzeichnis mit Zertifikaten vertrauenswürdiger CAs an, die zum Prüfen der SSL-Zertifikate der REST API verwendet werden. Ohne Angabe verwendet patronictl den Wert des REST-API-Parameters “cafile”.
    • certfile: gibt die Datei mit dem Clientzertifikat im PEM-Format an.
    • keyfile: gibt die Datei mit dem geheimen Clientschlüssel im PEM-Format an.
    • keyfile_password: gibt ein Passwort zum Entschlüsseln der Clientschlüsseldatei an.

Watchdog

  • mode: off, automatic oder required. Bei off ist der Watchdog deaktiviert. Bei automatic wird er verwendet, falls verfügbar, andernfalls ignoriert. Bei required wird der Knoten nur dann Leader, wenn der Watchdog erfolgreich aktiviert werden kann.
  • device: Pfad zum Watchdog-Gerät. Standardwert: /dev/watchdog.
  • safety_margin: Sicherheitsabstand in Sekunden zwischen dem Auslösen des Watchdogs und dem Ablauf des Leader-Schlüssels.


Tags

  • clonefrom: true oder false. Bei true bevorzugen andere Knoten möglicherweise diesen Knoten zur Initialisierung (als Quelle für pg_basebackup). Haben mehrere Knoten das Tag clonefrom auf true gesetzt, wird die Quelle für die Initialisierung zufällig ausgewählt. Standardwert: false.
  • noloadbalance: true oder false. Bei true antwortet der Knoten auf den REST-API-Health-Check GET /replica mit HTTP-Statuscode 503 und wird dadurch von der Lastverteilung ausgeschlossen. Standardwert: false.
  • replicatefrom: Name eines anderen Replikats, von dem repliziert werden soll. Dient zur Unterstützung kaskadierender Replikation.
  • nosync: true oder false. Bei true wird der Knoten niemals als synchrones Replikat ausgewählt.
  • sync_priority: Ganzzahl, die die Priorität dieses Knotens bei der Auswahl synchroner Replikate bestimmt, wenn synchronous_mode auf on gesetzt ist. Knoten mit höherer Priorität werden gegenüber solchen mit niedrigerer Priorität bevorzugt. Ist sync_priority 0 oder negativ, darf dieser Knoten nicht in den PostgreSQL-Parameter synchronous_standby_names aufgenommen werden (wie bei nosync: true). Beachten Sie, dass dieser Parameter die entgegengesetzte Bedeutung zum Wert sync_priority in der Sicht pg_stat_replication hat.
  • nofailover: true oder false; steuert, ob dieser Knoten an der Leader-Wahl teilnehmen und Leader werden darf. Standardwert: false, das heißt, dieser Knoten darf_ an Leader-Wahlen teilnehmen.
  • failover_priority: Ganzzahl, die die Priorität dieses Knotens bei einem Failover bestimmt. Knoten mit höherer Priorität werden gegenüber solchen mit niedrigerer Priorität bevorzugt, wenn sie dieselbe Menge WAL empfangen beziehungsweise wiedergegeben haben. Knoten mit höherer Empfangs-/Wiedergabe-LSN werden jedoch unabhängig von ihrer Priorität bevorzugt. Ist failover_priority 0 oder negativ, darf dieser Knoten weder an der Leader-Wahl teilnehmen noch Leader werden (wie bei nofailover: true). Bekannte Einschränkung: failover_priority funktioniert derzeit nicht mit Quorum-basierter synchroner Replikation .
  • nostream: true oder false. Bei true verwendet der Knoten nicht das Replikationsprotokoll zum Streamen von WAL. Stattdessen nutzt er Archiv-Recovery (falls restore_command konfiguriert ist) und fragt pg_wal/pg_xlog regelmäßig ab. Dies deaktiviert außerdem das Kopieren und Synchronisieren permanenter logischer Replikationsslots auf dem Knoten selbst und allen seinen kaskadierenden Replikaten. Auf einem Primärserver hat dieses Tag keine Wirkung.
Warnung

Nur einen der Parameter nofailover oder failover_priority angeben. nofailover: true entspricht failover_priority: 0; nofailover: false gibt dem Knoten die Priorität 1.

Neben diesen vordefinierten Tags können auch eigene hinzugefügt werden:

  • key1: true
  • key2: false
  • key3: 1.4
  • key4: "RandomString"

Tags sind in der REST API und in patronictl_list sichtbar. Mit diesen Tags lässt sich auch die Funktionsfähigkeit einer Instanz prüfen. Ist das Tag für eine Instanz nicht definiert oder stimmt sein Wert nicht mit dem abgefragten Wert überein, wird HTTP-Statuscode 503 zurückgegeben.

3.3 - Umgebungskonfiguration

Umgebungsvariablen zum Überschreiben der Patroni-Konfigurationsparameter.

Einige in der Patroni-Konfigurationsdatei definierte Parameter können über Systemumgebungsvariablen überschrieben werden. Dieses Dokument listet alle von Patroni verarbeiteten Umgebungsvariablen auf. Die über diese Variablen gesetzten Werte haben stets Vorrang vor den Werten in der Patroni-Konfigurationsdatei.


Global/Allgemein

  • PATRONI_CONFIGURATION: die gesamte Patroni-Konfiguration kann über die Umgebungsvariable PATRONI_CONFIGURATION festgelegt werden. In diesem Fall werden alle anderen Umgebungsvariablen ignoriert!
  • PATRONI_THREAD_POOL_SIZE: Größe des Threadpools, mit dem Patroni asynchrone Aufgaben ausführt und während der Leader-Wahl oder bei Failsafe-Prüfungen über die REST API mit anderen Mitgliedern kommuniziert. Mindestwert: 5, Standardwert: 5.
  • PATRONI_THREAD_STACK_SIZE: legt die Stackgröße für von Patroni gestartete Threads fest. Der Wert muss an 64kB ausgerichtet sein. Mindestwert: 64kB, Standardwert (von Patroni gesetzt): 512kB.
  • PATRONI_NAME: Name des Knotens, auf dem die aktuelle Patroni-Instanz läuft. Er muss im Cluster eindeutig sein.
  • PATRONI_NAMESPACE: Pfad im Konfigurationsspeicher, unter dem Patroni Informationen über den Cluster speichert. Standardwert: “/service”
  • PATRONI_SCOPE: Clustername
  • PG_MALLOC_ARENA_MAX: benutzerdefinierter Wert für die Umgebungsvariable MALLOC_ARENA_MAX des Prozesses postmaster. Ist er nicht gesetzt, erbt postmaster den Wert von MALLOC_ARENA_MAX.

Protokollierung

  • PATRONI_LOG_TYPE: legt das Protokollformat fest. Mögliche Werte sind plain und json. Für das Format json muss jsonlogger installiert sein. Der Standardwert ist plain.
  • PATRONI_LOG_LEVEL: legt die allgemeine Protokollierungsstufe fest. Standardwert: INFO (siehe Dokumentation der Python-Protokollierung )
  • PATRONI_LOG_TRACEBACK_LEVEL: legt die Stufe fest, auf der Tracebacks sichtbar sind. Standardwert: ERROR. Auf DEBUG setzen, wenn Tracebacks nur bei aktiviertem PATRONI_LOG_LEVEL=DEBUG sichtbar sein sollen.
  • PATRONI_LOG_FORMAT: legt die Formatzeichenfolge für Protokolle fest. Beim Protokolltyp plain sollte das Format eine Zeichenfolge sein. Verfügbare Attribute stehen unter LogRecord-Attribute . Beim Protokolltyp json kann das Format neben einer Zeichenfolge auch eine Liste sein. Jeder Listeneintrag sollte einem LogRecord-Attribut entsprechen. Dabei wird nur der Feldname benötigt; %( und ) sollten weggelassen werden. Um ein Protokollfeld unter einem anderen Schlüsselnamen auszugeben, ein Dictionary verwenden: Der Schlüssel bezeichnet das Protokollfeld, der Wert den im Protokoll auszugebenden Feldnamen. Standardwert: %(asctime)s %(levelname)s: %(message)s
  • PATRONI_LOG_DATEFORMAT: legt die Formatzeichenfolge für Datum und Uhrzeit fest (siehe Dokumentation zu formatTime() ).
  • PATRONI_LOG_STATIC_FIELDS: fügt dem Protokoll zusätzliche Felder hinzu. Diese Option ist nur beim Protokolltyp json verfügbar. Beispiel: PATRONI_LOG_STATIC_FIELDS="{app: patroni}"
  • PATRONI_LOG_MAX_QUEUE_SIZE: Patroni verwendet eine zweistufige Protokollierung. Protokolleinträge werden in eine Warteschlange im Arbeitsspeicher geschrieben; ein separater Thread entnimmt sie und schreibt sie nach stderr oder in eine Datei. Die interne Warteschlange ist standardmäßig auf 1000 Einträge begrenzt, was für die Protokolle der letzten 1h20m ausreicht.
  • PATRONI_LOG_DIR: Verzeichnis für die Anwendungsprotokolle. Es muss existieren und für den Benutzer, der Patroni ausführt, beschreibbar sein. Ist diese Umgebungsvariable gesetzt, bewahrt die Anwendung standardmäßig 4 Protokolldateien mit jeweils 25MB auf. Diese Aufbewahrungswerte lassen sich mit PATRONI_LOG_FILE_NUM und PATRONI_LOG_FILE_SIZE anpassen (siehe unten).
  • PATRONI_LOG_MODE: Berechtigungen für Protokolldateien (z. B. 0644). Ohne Angabe werden die Berechtigungen anhand des aktuellen umask-Werts gesetzt.
  • PATRONI_LOG_FILE_NUM: Anzahl der aufzubewahrenden Anwendungsprotokolle.
  • PATRONI_LOG_FILE_SIZE: Größe der Datei patroni.log (in Bytes), bei der eine Protokollrotation ausgelöst wird.
  • PATRONI_LOG_LOGGERS: definiert die Protokollierungsstufe je Python-Modul neu. Beispiel: PATRONI_LOG_LOGGERS="{patroni.postmaster: WARNING, urllib3: DEBUG}"
  • PATRONI_LOG_DEDUPLICATE_HEARTBEAT_LOGS: bei true werden aufeinanderfolgende identische Heartbeat-Protokolleinträge nicht ausgegeben. Standardwert: false.
Warnung

Der Ausführungszeitpunkt der HA-Schleife kann bei der Diagnose von Failovers aufgrund erschöpfter Ressourcen und ähnlicher Probleme sehr wertvoll sein. Ist PATRONI_LOG_DEDUPLICATE_HEARTBEAT_LOGS auf true gesetzt, wird für die Ausführung der HA-Schleife kein Protokolleintrag erzeugt (außer bei einem Leader-Wechsel). Diese möglicherweise nützliche Information steht dann in den Protokollen nicht zur Verfügung.


Citus

Aktiviert die Integration von Patroni mit Citus . Ist sie konfiguriert, übernimmt Patroni die Registrierung der Citus-Worker-Knoten beim Coordinator. Weitere Informationen zur Citus-Unterstützung stehen hier .

  • PATRONI_CITUS_GROUP: Citus-Gruppen-ID als Ganzzahl. Für den Coordinator 0 verwenden, für Worker 1, 2 usw.
  • PATRONI_CITUS_DATABASE: Datenbank, in der die Erweiterung citus erstellt werden sollte. Sie muss auf dem Coordinator und allen Workern identisch sein. Derzeit wird nur eine Datenbank unterstützt.

Consul

  • PATRONI_CONSUL_HOST: host:port des lokalen Consul-Agenten.
  • PATRONI_CONSUL_URL: URL des lokalen Consul-Agenten im Format: http(s)://host:port
  • PATRONI_CONSUL_PORT: (optional) Consul-Port
  • PATRONI_CONSUL_SCHEME: (optional) http oder https, Standardwert http
  • PATRONI_CONSUL_TOKEN: (optional) ACL-Token
  • PATRONI_CONSUL_VERIFY: (optional) bestimmt, ob das SSL-Zertifikat bei HTTPS-Anfragen geprüft wird
  • PATRONI_CONSUL_CACERT: (optional) CA-Zertifikat. Falls vorhanden, wird die Validierung aktiviert.
  • PATRONI_CONSUL_CERT: (optional) Datei mit dem Clientzertifikat
  • PATRONI_CONSUL_KEY: (optional) Datei mit dem Clientschlüssel. Kann leer sein, wenn der Schlüssel Bestandteil des Zertifikats ist.
  • PATRONI_CONSUL_DC: (optional) Rechenzentrum, mit dem kommuniziert werden soll. Standardmäßig wird das Rechenzentrum des Hosts verwendet.
  • PATRONI_CONSUL_CONSISTENCY: (optional) wählt den Konsistenzmodus von Consul. Mögliche Werte: default, consistent oder stale (Einzelheiten in der Consul-API-Referenz )
  • PATRONI_CONSUL_CHECKS: (optional) Liste der für die Sitzung verwendeten Consul Health Checks. Standardmäßig wird eine leere Liste verwendet.
  • PATRONI_CONSUL_REGISTER_SERVICE: (optional) bestimmt, ob ein Dienst registriert wird, dessen Name durch den Parameter scope festgelegt ist und der je nach Knotenrolle das Tag master, primary, replica oder standby-leader erhält. Standardwert false
  • PATRONI_CONSUL_SERVICE_TAGS: (optional) zusätzliche statische Tags für den Consul-Dienst neben der Rolle (primary/replica/standby-leader). Standardmäßig wird eine leere Liste verwendet.
  • PATRONI_CONSUL_SERVICE_CHECK_INTERVAL: (optional) Häufigkeit der Health Checks für die registrierte URL
  • PATRONI_CONSUL_SERVICE_CHECK_TLS_SERVER_NAME: (optional) überschreibt den SNI-Host bei TLS-Verbindungen; siehe auch die API-Referenz für Consul-Agent-Prüfungen .

etcd

  • PATRONI_ETCD_PROXY: Proxy-URL für etcd. Bei einer Verbindung zu etcd über einen Proxy diesen Parameter anstelle von PATRONI_ETCD_URL verwenden.
  • PATRONI_ETCD_URL: URL für etcd im Format: http(s)://(username:password@)host:port
  • PATRONI_ETCD_HOSTS: Liste der etcd-Endpunkte im Format ‘host1:port1’,‘host2:port2’,etc…
  • PATRONI_ETCD_USE_PROXIES: ist dieser Parameter auf true gesetzt, behandelt Patroni hosts als Liste von Proxys und ermittelt nicht die Topologie des etcd-Clusters, sondern bleibt bei der festen Liste hosts.
  • PATRONI_ETCD_PROTOCOL: http oder https; ohne Angabe wird http verwendet. Ist url oder proxy angegeben, wird das Protokoll daraus übernommen.
  • PATRONI_ETCD_HOST: host:port des etcd-Endpunkts.
  • PATRONI_ETCD_SRV: Domain, in der nach SRV-Einträgen für die automatische Clustererkennung gesucht wird. Patroni fragt für die angegebene Domain diese SRV-Dienstnamen ab (in dieser Reihenfolge bis zum ersten Erfolg): _etcd-client-ssl, _etcd-client, _etcd-ssl, _etcd, _etcd-server-ssl, _etcd-server. Werden SRV-Einträge für _etcd-server-ssl oder _etcd-server gefunden, wird über das ETCD-Peer-Protokoll bei ETCD nach verfügbaren Mitgliedern gefragt. Andernfalls werden die Hosts aus den SRV-Einträgen verwendet.
  • PATRONI_ETCD_SRV_SUFFIX: konfiguriert ein Suffix für den bei der Erkennung abgefragten SRV-Namen. Mit diesem Flag lassen sich mehrere etcd-Cluster unter derselben Domain unterscheiden. Es funktioniert nur zusammen mit PATRONI_ETCD_SRV. Sind beispielsweise PATRONI_ETCD_SRV_SUFFIX=foo und PATRONI_ETCD_SRV=example.org gesetzt, wird folgende DNS-SRV-Abfrage ausgeführt: _etcd-client-ssl-foo._tcp.example.org (entsprechend für jeden möglichen ETCD-SRV-Dienstnamen).
  • PATRONI_ETCD_USERNAME: Benutzername für die etcd-Authentifizierung.
  • PATRONI_ETCD_PASSWORD: Passwort für die etcd-Authentifizierung.
  • PATRONI_ETCD_CACERT: CA-Zertifikat. Falls vorhanden, wird die Validierung aktiviert.
  • PATRONI_ETCD_CERT: Datei mit dem Clientzertifikat.
  • PATRONI_ETCD_KEY: Datei mit dem Clientschlüssel. Kann leer sein, wenn der Schlüssel Bestandteil des Zertifikats ist.

Etcdv3

Die Namen der Umgebungsvariablen für Etcdv3 entsprechen denen für etcd; im Variablennamen muss lediglich ETCD durch ETCD3 ersetzt werden. Beispiele: PATRONI_ETCD3_HOST, PATRONI_ETCD3_CACERT usw.

Warnung

Mit Protokollversion 2 erstellte Schlüssel sind mit Protokollversion 3 nicht sichtbar und umgekehrt. Daher ist ein Wechsel von etcd zu Etcdv3 allein durch Ändern der Patroni-Konfiguration nicht möglich. Zudem verwendet Patroni das gRPC-Gateway (Proxy) von etcd zur Kommunikation mit der V3 API, weshalb eine TLS-Authentifizierung über den Common Name nicht möglich ist.


ZooKeeper

  • PATRONI_ZOOKEEPER_HOSTS: durch Kommas getrennte Liste der ZooKeeper-Clustermitglieder: “‘host1:port1’,‘host2:port2’,’etc…’”. Jeder einzelne Eintrag muss in Anführungszeichen stehen!
  • PATRONI_ZOOKEEPER_USE_SSL: (optional) bestimmt, ob SSL verwendet wird. Standardwert: false. Bei false werden alle SSL-spezifischen Parameter ignoriert.
  • PATRONI_ZOOKEEPER_CACERT: (optional) CA-Zertifikat. Falls vorhanden, wird die Validierung aktiviert.
  • PATRONI_ZOOKEEPER_CERT: (optional) Datei mit dem Clientzertifikat.
  • PATRONI_ZOOKEEPER_KEY: (optional) Datei mit dem Clientschlüssel.
  • PATRONI_ZOOKEEPER_KEY_PASSWORD: (optional) Passwort für den Clientschlüssel.
  • PATRONI_ZOOKEEPER_VERIFY: (optional) bestimmt, ob das Zertifikat geprüft wird. Standardwert: true.
  • PATRONI_ZOOKEEPER_SET_ACLS: (optional) falls gesetzt, wird Kazoo so konfiguriert, dass es auf jeden neu erstellten ZNode eine Standard-ACL anwendet. ACLs können das Schema x509 (Standard) oder andere unterstützte ZooKeeper-Schemata wie digest verwenden. Sie sollten als Dictionary angegeben werden, dessen Schlüssel der vollständige Principal (optional mit vorangestelltem Schema) und dessen Wert eine Liste von Berechtigungen ist. Als Berechtigungen sind eine oder mehrere aus CREATE, READ, WRITE, DELETE, ADMIN oder ALL möglich. Beispiel: set_acls: {CN=principal1: [CREATE, READ], digest:principal2:+pjROuBuuwNNSujKyH8dGcEnFPQ=: [ALL]}.
  • PATRONI_ZOOKEEPER_AUTH_DATA: (optional) Zugangsdaten für die Verbindung. Sollte ein Dictionary mit scheme als Schlüssel und credential als Wert sein. Standardwert ist ein leeres Dictionary.
Hinweis

Für SSL-Unterstützung muss kazoo>=2.6.0 installiert sein.


Exhibitor

  • PATRONI_EXHIBITOR_HOSTS: anfängliche Liste der Exhibitor-Knoten (ZooKeeper) im Format: ‘host1,host2,etc…’. Diese Liste wird bei jeder Änderung der Topologie des Exhibitor-Clusters (ZooKeeper) automatisch aktualisiert.
  • PATRONI_EXHIBITOR_PORT: Exhibitor-Port.


Kubernetes

  • PATRONI_KUBERNETES_BYPASS_API_SERVICE: (optional) bei der Kommunikation mit der Kubernetes API verwendet Patroni normalerweise den Dienst kubernetes , dessen Adresse den Pods über die Umgebungsvariable KUBERNETES_SERVICE_HOST bereitgestellt wird. Ist PATRONI_KUBERNETES_BYPASS_API_SERVICE auf true gesetzt, ermittelt Patroni die Liste der API-Knoten hinter dem Dienst und verbindet sich direkt mit ihnen.
  • PATRONI_KUBERNETES_NAMESPACE: (optional) Kubernetes-Namespace, in dem der Patroni-Pod läuft. Standardwert: default.
  • PATRONI_KUBERNETES_LABELS: Labels im Format {label1: value1, label2: value2}. Mit diesen Labels werden vorhandene Objekte (Pods sowie Endpoints oder ConfigMaps) gesucht, die zum aktuellen Cluster gehören. Außerdem setzt Patroni sie auf jedem von ihm erstellten Objekt (Endpoint oder ConfigMap).
  • PATRONI_KUBERNETES_SCOPE_LABEL: (optional) Name des Labels mit dem Clusternamen. Standardwert: cluster-name.
  • PATRONI_KUBERNETES_BOOTSTRAP_LABELS: (optional) Labels im Format {label1: value1, label2: value2}. Sie werden einem Patroni-Pod zugewiesen, wenn sein Zustand initializing new cluster, running custom bootstrap script, starting after custom bootstrap oder creating replica ist.
  • PATRONI_KUBERNETES_ROLE_LABEL: (optional) Name des Labels mit der Rolle (primary, replica oder ein anderer benutzerdefinierter Wert). Patroni setzt dieses Label auf dem Pod, in dem es läuft. Standardwert: role.
  • PATRONI_KUBERNETES_LEADER_LABEL_VALUE: (optional) Wert des Pod-Labels, wenn die Postgres-Rolle primary ist. Standardwert: primary.
  • PATRONI_KUBERNETES_FOLLOWER_LABEL_VALUE: (optional) Wert des Pod-Labels, wenn die Postgres-Rolle replica ist. Standardwert: replica.
  • PATRONI_KUBERNETES_STANDBY_LEADER_LABEL_VALUE: (optional) Wert des Pod-Labels, wenn die Postgres-Rolle standby_leader ist. Standardwert: primary.
  • PATRONI_KUBERNETES_TMP_ROLE_LABEL: (optional) Name des temporären Labels mit der Rolle (primary oder replica). Der Wert dieses Labels entspricht immer dem Standardwert der jeweiligen Rolle. Nur bei Bedarf setzen.
  • PATRONI_KUBERNETES_USE_ENDPOINTS: (optional) bei true verwendet Patroni Endpoints anstelle von ConfigMaps für die Leader-Wahl und zum Speichern des Clusterzustands.
  • PATRONI_KUBERNETES_POD_IP: (optional) IP-Adresse des Pods, in dem Patroni läuft. Dieser Wert ist erforderlich, wenn PATRONI_KUBERNETES_USE_ENDPOINTS aktiviert ist, und wird beim Hochstufen von PostgreSQL im Pod zum Befüllen der Subsets des Leader-Endpoints verwendet.
  • PATRONI_KUBERNETES_PORTS: (optional) enthält das Service-Objekt einen Namen für den Port, muss derselbe Name im Endpoint-Objekt erscheinen; andernfalls funktioniert der Dienst nicht. Ist der Dienst beispielsweise als {Kind: Service, spec: {ports: [{name: postgresql, port: 5432, targetPort: 5432}]}} definiert, muss PATRONI_KUBERNETES_PORTS='[{"name": "postgresql", "port": 5432}]' gesetzt werden. Patroni verwendet dies zum Aktualisieren der Subsets des Leader-Endpoints. Dieser Parameter wird nur verwendet, wenn PATRONI_KUBERNETES_USE_ENDPOINTS gesetzt ist.
  • PATRONI_KUBERNETES_CACERT: (optional) gibt die CA_BUNDLE-Datei mit den Zertifikaten vertrauenswürdiger CAs an, die zum Prüfen der SSL-Zertifikate der Kubernetes API verwendet werden. Ohne Angabe verwendet Patroni den Wert aus dem ServiceAccount-Secret.
  • PATRONI_RETRIABLE_HTTP_CODES: (optional) Liste der HTTP-Statuscodes der K8s API, bei denen ein erneuter Versuch erfolgt. Standardmäßig wiederholt Patroni die Anfrage bei 500, 503 und 504 oder wenn die Antwort der K8s API den HTTP-Header retry-after enthält.

Raft (veraltet)

  • PATRONI_RAFT_SELF_ADDR: ip:port, an dem auf Raft-Verbindungen gewartet wird. self_addr muss von anderen Clusterknoten aus erreichbar sein. Ohne Angabe nimmt der Knoten nicht am Konsens teil.
  • PATRONI_RAFT_BIND_ADDR: (optional) ip:port, an dem auf Raft-Verbindungen gewartet wird. Ohne Angabe wird self_addr verwendet.
  • PATRONI_RAFT_PARTNER_ADDRS: Liste der anderen Patroni-Knoten im Cluster im Format "'ip1:port1','ip2:port2'". Jeder einzelne Eintrag muss in Anführungszeichen stehen!
  • PATRONI_RAFT_DATA_DIR: Verzeichnis zum Speichern des Raft-Logs und des Snapshots. Ohne Angabe wird das aktuelle Arbeitsverzeichnis verwendet.
  • PATRONI_RAFT_PASSWORD: (optional) verschlüsselt den Raft-Datenverkehr mit dem angegebenen Passwort; erfordert das Python-Modul cryptography.
  • PATRONI_RAFT_MIN_TIMEOUT: (optional) minimale Zeitüberschreitung für Wahlen in der zugrunde liegenden Raft-Implementierung pysyncobj, in Sekunden. Muss größer als 3 * PATRONI_RAFT_APPEND_ENTRIES_PERIOD sein. Standardwert: 0.4.
  • PATRONI_RAFT_MAX_TIMEOUT: (optional) maximale Zeitüberschreitung für Wahlen in der zugrunde liegenden Raft-Implementierung pysyncobj, in Sekunden. Muss größer als PATRONI_RAFT_MIN_TIMEOUT sein. Standardwert: 1.4.
  • PATRONI_RAFT_CONNECTION_TIMEOUT: (optional) Zeit in Sekunden, nach der eine Verbindung ohne Datenempfang als unterbrochen gilt. Muss größer oder gleich PATRONI_RAFT_MAX_TIMEOUT sein. Standardwert: 3.5.
  • PATRONI_RAFT_APPEND_ENTRIES_PERIOD: (optional) Intervall in Sekunden zum Senden von Heartbeat-Befehlen. Muss kleiner als ein Drittel von PATRONI_RAFT_MIN_TIMEOUT sein. Standardwert: 0.1.
  • PATRONI_RAFT_CONNECTION_RETRY_TIME: (optional) Intervall in Sekunden zwischen erneuten Verbindungsversuchen zu nicht erreichbaren Knoten. Standardwert: 5.0.
  • PATRONI_RAFT_LEADER_FALLBACK_TIMEOUT: (optional) Zeit in Sekunden, nach der ein Leader ohne Antwort von der Mehrheit in den Follower-Zustand zurückkehrt. Muss größer als PATRONI_RAFT_APPEND_ENTRIES_PERIOD sein. Standardwert: 30.0.
Hinweis

Patroni prüft diese Bedingungen beim Start und verweigert den Start, wenn sie verletzt sind. Diese Werte können nicht zur Laufzeit geändert werden und erfordern einen Neustart. Einzelheiten einschließlich der Einschränkungen bei hoher Latenz stehen unter Raft-Einstellungen .


PostgreSQL

  • PATRONI_POSTGRESQL_LISTEN: IP-Adresse + Port, an denen Postgres auf Verbindungen wartet. Mehrere durch Kommas getrennte Adressen sind zulässig, sofern der Port nach der letzten Adresse mit einem Doppelpunkt angehängt wird, etwa listen: 127.0.0.1,127.0.0.2:5432. Patroni verwendet die erste Adresse dieser Liste, um lokale Verbindungen zum PostgreSQL-Knoten aufzubauen.
  • PATRONI_POSTGRESQL_CONNECT_ADDRESS: IP-Adresse + Port, über die Postgres für andere Knoten und Anwendungen erreichbar ist.
  • PATRONI_POSTGRESQL_PROXY_ADDRESS: IP-Adresse + Port, über die ein neben Postgres laufender Verbindungspool (z. B. PgBouncer) erreichbar ist. Der Wert wird als proxy_url in den Mitgliedsschlüssel im DCS geschrieben und kann für die Diensterkennung verwendet werden beziehungsweise nützlich sein.
  • PATRONI_POSTGRESQL_DATA_DIR: Pfad zum Postgres-Datenverzeichnis, das bereits existiert oder von Patroni initialisiert werden soll.
  • PATRONI_POSTGRESQL_CONFIG_DIR: Pfad zum Postgres-Konfigurationsverzeichnis; standardmäßig das Datenverzeichnis. Es muss für Patroni beschreibbar sein.
  • PATRONI_POSTGRESQL_BIN_DIR: Pfad zu den PostgreSQL-Programmdateien (pg_ctl, initdb, pg_controldata, pg_basebackup, postgres, pg_isready, pg_rewind). Der Standardwert ist eine leere Zeichenfolge; dann werden die Programme über die Umgebungsvariable PATH gesucht.
  • PATRONI_POSTGRESQL_BIN_PG_CTL: (optional) benutzerdefinierter Name für die Programmdatei pg_ctl.
  • PATRONI_POSTGRESQL_BIN_INITDB: (optional) benutzerdefinierter Name für die Programmdatei initdb.
  • PATRONI_POSTGRESQL_BIN_PG_CONTROLDATA: (optional) benutzerdefinierter Name für die Programmdatei pg_controldata.
  • PATRONI_POSTGRESQL_BIN_PG_BASEBACKUP: (optional) benutzerdefinierter Name für die Programmdatei pg_basebackup.
  • PATRONI_POSTGRESQL_BIN_POSTGRES: (optional) benutzerdefinierter Name für die Programmdatei postgres.
  • PATRONI_POSTGRESQL_BIN_IS_READY: (optional) benutzerdefinierter Name für die Programmdatei pg_isready.
  • PATRONI_POSTGRESQL_BIN_PG_REWIND: (optional) benutzerdefinierter Name für die Programmdatei pg_rewind.
  • PATRONI_POSTGRESQL_PGPASS: Pfad zur Passwortdatei .pgpass . Patroni erstellt diese Datei vor dem Ausführen von pg_basebackup und in einigen weiteren Fällen. Der Speicherort muss für Patroni beschreibbar sein.
  • PATRONI_REPLICATION_USERNAME: Benutzername für die Replikation; der Benutzer wird bei der Initialisierung erstellt. Replikate verwenden ihn, um per Streaming-Replikation auf die Replikationsquelle zuzugreifen.
  • PATRONI_REPLICATION_PASSWORD: Passwort für die Replikation; der Benutzer wird bei der Initialisierung erstellt.
  • PATRONI_REPLICATION_SSLMODE: (optional) entspricht dem Verbindungsparameter sslmode , der dem Client die Auswahl des Modus für die TLS-Aushandlung mit dem Server erlaubt. Einzelheiten zur Funktionsweise der einzelnen Modi stehen in der PostgreSQL-Dokumentation . Der Standardmodus ist prefer.
  • PATRONI_REPLICATION_SSLKEY: (optional) entspricht dem Verbindungsparameter sslkey , der den Speicherort des geheimen Schlüssels für das Clientzertifikat angibt.
  • PATRONI_REPLICATION_SSLPASSWORD: (optional) entspricht dem Verbindungsparameter sslpassword , der das Passwort für den in PATRONI_REPLICATION_SSLKEY angegebenen geheimen Schlüssel festlegt.
  • PATRONI_REPLICATION_SSLCERT: (optional) entspricht dem Verbindungsparameter sslcert , der den Speicherort des Clientzertifikats angibt.
  • PATRONI_REPLICATION_SSLROOTCERT: (optional) entspricht dem Verbindungsparameter sslrootcert , der den Pfad zu einer Datei mit einem oder mehreren Zertifikaten von Zertifizierungsstellen (CA) angibt, mit denen der Client ein Serverzertifikat prüft.
  • PATRONI_REPLICATION_SSLCRL: (optional) entspricht dem Verbindungsparameter sslcrl , der den Pfad zu einer Datei mit einer Zertifikatsperrliste angibt. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
  • PATRONI_REPLICATION_SSLCRLDIR: (optional) entspricht dem Verbindungsparameter sslcrldir , der den Pfad zu einem Verzeichnis mit Dateien angibt, die eine Zertifikatsperrliste enthalten. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
  • PATRONI_REPLICATION_SSLNEGOTIATION: (optional) entspricht dem Verbindungsparameter sslnegotiation , der steuert, wie die SSL-Verschlüsselung mit dem Server ausgehandelt wird, falls SSL verwendet wird.
  • PATRONI_REPLICATION_GSSENCMODE: (optional) entspricht dem Verbindungsparameter gssencmode , der bestimmt, ob und mit welcher Priorität eine sichere GSS-Verbindung über TCP/IP mit dem Server ausgehandelt wird.
  • PATRONI_REPLICATION_CHANNEL_BINDING: (optional) entspricht dem Verbindungsparameter channel_binding , der die Verwendung von Channel Binding durch den Client steuert.
  • PATRONI_SUPERUSER_USERNAME: Name des Superusers, der bei der Initialisierung (initdb) festgelegt und später von Patroni für Verbindungen zu Postgres verwendet wird. Auch pg_rewind verwendet diesen Benutzer.
  • PATRONI_SUPERUSER_PASSWORD: Passwort des Superusers, das bei der Initialisierung (initdb) festgelegt wird.
  • PATRONI_SUPERUSER_SSLMODE: (optional) entspricht dem Verbindungsparameter sslmode , der dem Client die Auswahl des Modus für die TLS-Aushandlung mit dem Server erlaubt. Einzelheiten zur Funktionsweise der einzelnen Modi stehen in der PostgreSQL-Dokumentation . Der Standardmodus ist prefer.
  • PATRONI_SUPERUSER_SSLKEY: (optional) entspricht dem Verbindungsparameter sslkey , der den Speicherort des geheimen Schlüssels für das Clientzertifikat angibt.
  • PATRONI_SUPERUSER_SSLPASSWORD: (optional) entspricht dem Verbindungsparameter sslpassword , der das Passwort für den in PATRONI_SUPERUSER_SSLKEY angegebenen geheimen Schlüssel festlegt.
  • PATRONI_SUPERUSER_SSLCERT: (optional) entspricht dem Verbindungsparameter sslcert , der den Speicherort des Clientzertifikats angibt.
  • PATRONI_SUPERUSER_SSLROOTCERT: (optional) entspricht dem Verbindungsparameter sslrootcert , der den Pfad zu einer Datei mit einem oder mehreren Zertifikaten von Zertifizierungsstellen (CA) angibt, mit denen der Client ein Serverzertifikat prüft.
  • PATRONI_SUPERUSER_SSLCRL: (optional) entspricht dem Verbindungsparameter sslcrl , der den Pfad zu einer Datei mit einer Zertifikatsperrliste angibt. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
  • PATRONI_SUPERUSER_SSLCRLDIR: (optional) entspricht dem Verbindungsparameter sslcrldir , der den Pfad zu einem Verzeichnis mit Dateien angibt, die eine Zertifikatsperrliste enthalten. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
  • PATRONI_SUPERUSER_SSLNEGOTIATION: (optional) entspricht dem Verbindungsparameter sslnegotiation , der steuert, wie die SSL-Verschlüsselung mit dem Server ausgehandelt wird, falls SSL verwendet wird.
  • PATRONI_SUPERUSER_GSSENCMODE: (optional) entspricht dem Verbindungsparameter gssencmode , der bestimmt, ob und mit welcher Priorität eine sichere GSS-Verbindung über TCP/IP mit dem Server ausgehandelt wird.
  • PATRONI_SUPERUSER_CHANNEL_BINDING: (optional) entspricht dem Verbindungsparameter channel_binding , der die Verwendung von Channel Binding durch den Client steuert.
  • PATRONI_REWIND_USERNAME: (optional) Name des Benutzers für pg_rewind; er wird bei der Initialisierung von Postgres 11+ erstellt und erhält alle erforderlichen Berechtigungen .
  • PATRONI_REWIND_PASSWORD: (optional) Passwort des Benutzers für pg_rewind; er wird bei der Initialisierung erstellt.
  • PATRONI_REWIND_SSLMODE: (optional) entspricht dem Verbindungsparameter sslmode , der dem Client die Auswahl des Modus für die TLS-Aushandlung mit dem Server erlaubt. Einzelheiten zur Funktionsweise der einzelnen Modi stehen in der PostgreSQL-Dokumentation . Der Standardmodus ist prefer.
  • PATRONI_REWIND_SSLKEY: (optional) entspricht dem Verbindungsparameter sslkey , der den Speicherort des geheimen Schlüssels für das Clientzertifikat angibt.
  • PATRONI_REWIND_SSLPASSWORD: (optional) entspricht dem Verbindungsparameter sslpassword , der das Passwort für den in PATRONI_REWIND_SSLKEY angegebenen geheimen Schlüssel festlegt.
  • PATRONI_REWIND_SSLCERT: (optional) entspricht dem Verbindungsparameter sslcert , der den Speicherort des Clientzertifikats angibt.
  • PATRONI_REWIND_SSLROOTCERT: (optional) entspricht dem Verbindungsparameter sslrootcert , der den Pfad zu einer Datei mit einem oder mehreren Zertifikaten von Zertifizierungsstellen (CA) angibt, mit denen der Client ein Serverzertifikat prüft.
  • PATRONI_REWIND_SSLCRL: (optional) entspricht dem Verbindungsparameter sslcrl , der den Pfad zu einer Datei mit einer Zertifikatsperrliste angibt. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
  • PATRONI_REWIND_SSLCRLDIR: (optional) entspricht dem Verbindungsparameter sslcrldir , der den Pfad zu einem Verzeichnis mit Dateien angibt, die eine Zertifikatsperrliste enthalten. Ein Client lehnt Verbindungen zu Servern ab, deren Zertifikat in dieser Liste enthalten ist.
  • PATRONI_REWIND_SSLNEGOTIATION: (optional) entspricht dem Verbindungsparameter sslnegotiation , der steuert, wie die SSL-Verschlüsselung mit dem Server ausgehandelt wird, falls SSL verwendet wird.
  • PATRONI_REWIND_GSSENCMODE: (optional) entspricht dem Verbindungsparameter gssencmode , der bestimmt, ob und mit welcher Priorität eine sichere GSS-Verbindung über TCP/IP mit dem Server ausgehandelt wird.
  • PATRONI_REWIND_CHANNEL_BINDING: (optional) entspricht dem Verbindungsparameter channel_binding , der die Verwendung von Channel Binding durch den Client steuert.

REST API

  • PATRONI_RESTAPI_THREAD_POOL_SIZE: Größe des Threadpools, mit dem Patroni REST-API-Anfragen verarbeitet. Mindestwert: 5, Standardwert: 5.
  • PATRONI_RESTAPI_CONNECT_ADDRESS: IP-Adresse und Port für den Zugriff auf die REST API.
  • PATRONI_RESTAPI_LISTEN: IP-Adresse und Port, an denen Patroni auf Verbindungen wartet, um Health-Check-Informationen für HAProxy bereitzustellen.
  • PATRONI_RESTAPI_USERNAME: Benutzername für die Basic-Authentifizierung zum Schutz unsicherer REST-API-Endpunkte.
  • PATRONI_RESTAPI_PASSWORD: Passwort für die Basic-Authentifizierung zum Schutz unsicherer REST-API-Endpunkte.
  • PATRONI_RESTAPI_CERTFILE: gibt die Datei mit dem Zertifikat im PEM-Format an. Ist certfile nicht angegeben oder leer, arbeitet der API-Server ohne SSL.
  • PATRONI_RESTAPI_KEYFILE: gibt die Datei mit dem geheimen Schlüssel im PEM-Format an.
  • PATRONI_RESTAPI_KEYFILE_PASSWORD: gibt ein Passwort zum Entschlüsseln der Schlüsseldatei an.
  • PATRONI_RESTAPI_CAFILE: gibt die Datei mit dem CA_BUNDLE vertrauenswürdiger CA-Zertifikate an, die zum Prüfen der Clientzertifikate verwendet werden.
  • PATRONI_RESTAPI_CIPHERS: (optional) gibt die zulässigen Cipher Suites an (z. B. “ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:!SSLv1:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1”)
  • PATRONI_RESTAPI_VERIFY_CLIENT: none (Standard), optional oder required. Bei none prüft die REST API keine Clientzertifikate. Bei required sind Clientzertifikate für alle REST-API-Aufrufe erforderlich. Bei optional sind sie für alle unsicheren REST-API-Endpunkte erforderlich. Bei required ist die Clientauthentifizierung erfolgreich, wenn die Prüfung der Zertifikatssignatur erfolgreich ist. Bei optional wird das Clientzertifikat nur bei Anfragen mit PUT, POST, PATCH und DELETE geprüft.
  • PATRONI_RESTAPI_ALLOWLIST: (optional): legt die Hosts fest, die unsichere REST-API-Endpunkte aufrufen dürfen. Ein Eintrag kann ein Hostname, eine IP-Adresse oder eine Netzwerkadresse in CIDR-Schreibweise sein. Standardmäßig gilt allow all. Ist allowlist oder allowlist_include_members gesetzt, werden alle nicht enthaltenen Zugriffe abgelehnt.
  • PATRONI_RESTAPI_ALLOWLIST_INCLUDE_MEMBERS: (optional): bei true dürfen andere im DCS registrierte Clustermitglieder auf unsichere REST-API-Endpunkte zugreifen (IP-Adresse oder Hostname werden aus api_url des Mitglieds übernommen). Vorsicht: Das Betriebssystem kann für ausgehende Verbindungen eine andere IP-Adresse verwenden.
  • PATRONI_RESTAPI_HTTP_EXTRA_HEADERS: (optional) HTTP-Header ermöglichen es dem REST-API-Server, zusätzliche Informationen mit einer HTTP-Antwort zu übertragen.
  • PATRONI_RESTAPI_HTTPS_EXTRA_HEADERS: (optional) HTTPS-Header ermöglichen es dem REST-API-Server, bei aktiviertem TLS zusätzliche Informationen mit einer HTTP-Antwort zu übertragen. Die in http_extra_headers festgelegten Zusatzinformationen werden ebenfalls übertragen.
  • PATRONI_RESTAPI_REQUEST_QUEUE_SIZE: (optional): legt die Größe der Anfragewarteschlange für den TCP-Socket der Patroni REST API fest. Ist die Warteschlange voll, erhalten weitere Anfragen den Fehler “Connection denied”. Der Standardwert ist 5.
  • PATRONI_RESTAPI_SERVER_TOKENS: (optional) konfiguriert den Wert des HTTP-Headers Server. Original (Standard) behält das ursprüngliche Verhalten bei und zeigt die Versionen von BaseHTTP und Python an, etwa BaseHTTP/0.6 Python/3.12.3. Minimal: Der Header enthält nur die Patroni-Version, etwa Patroni/4.0.0. ProductOnly: Der Header enthält nur den Produktnamen, etwa Patroni.

Warnung

  • PATRONI_RESTAPI_CONNECT_ADDRESS muss von allen Knoten des jeweiligen Patroni-Clusters aus erreichbar sein. Intern verwendet Patroni diese Adresse während der Leader-Wahl, um die Knoten mit dem geringsten Replikationsrückstand zu ermitteln.
  • Ist die Prüfung von Clientzertifikaten aktiviert (PATRONI_RESTAPI_VERIFY_CLIENT auf required gesetzt), müssen außerdem gültige Clientzertifikate in PATRONI_CTL_CERTFILE, PATRONI_CTL_KEYFILE, PATRONI_CTL_KEYFILE_PASSWORD angegeben werden. Andernfalls funktioniert Patroni nicht korrekt.

CTL

  • PATRONICTL_CONFIG_FILE: (optional) Pfad zur Konfigurationsdatei.
  • PATRONI_CTL_USERNAME: (optional) Benutzername für die Basic-Authentifizierung beim Zugriff auf geschützte REST-API-Endpunkte. Ohne Angabe verwendet patronictl den Wert des REST-API-Parameters “username”.
  • PATRONI_CTL_PASSWORD: (optional) Passwort für die Basic-Authentifizierung beim Zugriff auf geschützte REST-API-Endpunkte. Ohne Angabe verwendet patronictl den Wert des REST-API-Parameters “password”.
  • PATRONI_CTL_INSECURE: (optional) erlaubt Verbindungen zur REST API ohne Prüfung der SSL-Zertifikate.
  • PATRONI_CTL_CACERT: (optional) gibt die CA_BUNDLE-Datei oder das Verzeichnis mit Zertifikaten vertrauenswürdiger CAs an, die zum Prüfen der SSL-Zertifikate der REST API verwendet werden. Ohne Angabe verwendet patronictl den Wert des REST-API-Parameters “cafile”.
  • PATRONI_CTL_CERTFILE: (optional) gibt die Datei mit dem Clientzertifikat im PEM-Format an.
  • PATRONI_CTL_KEYFILE: (optional) gibt die Datei mit dem geheimen Clientschlüssel im PEM-Format an.
  • PATRONI_CTL_KEYFILE_PASSWORD: (optional) gibt ein Passwort zum Entschlüsseln der Clientschlüsseldatei an.

4 - Patroni REST API

Referenz der REST-API-Endpunkte von Patroni und ihres Betriebsverhaltens.

Patroni bietet eine umfangreiche REST API. Patroni selbst nutzt sie bei der Leader-Wahl, das Werkzeug patronictl für Failover, Switchover, Neuinitialisierung, Neustart und Neuladen sowie HAProxy und andere Load-Balancer für HTTP Health Checks. Sie kann auch zur Überwachung verwendet werden. Nachfolgend sind die REST-API-Endpunkte von Patroni aufgeführt.


Endpunkte für Health Checks

Bei allen GET-Anfragen für Health Checks gibt Patroni neben dem HTTP-Statuscode ein JSON-Dokument mit dem Zustand des Knotens zurück. Wenn das JSON-Dokument nicht gewünscht oder benötigt wird, kann anstelle von GET die Methode HEAD oder OPTIONS verwendet werden.

  • Die folgenden Anfragen an die REST API von Patroni liefern den HTTP-Statuscode 200 nur dann, wenn der Patroni-Knoten als Primärserver mit Leader-Lock läuft:

    • GET /
    • GET /primary
    • GET /read-write
  • GET /standby-leader: Liefert den HTTP-Statuscode 200 nur dann, wenn der Patroni-Knoten als Leader in einem Standby-Cluster läuft.

  • GET /leader: Liefert den HTTP-Statuscode 200, wenn der Patroni-Knoten den Leader-Lock hält. Anders als bei GET /primary und GET /standby-leader hängt diese Prüfung nicht davon ab, ob PostgreSQL als primary oder als standby_leader läuft.

  • GET /replica: Endpunkt für den Health Check eines Replikats. Liefert den HTTP-Statuscode 200 nur dann, wenn der Patroni-Knoten den Zustand running und die Rolle replica hat und das Tag noloadbalance nicht gesetzt ist.

  • GET /replica?replication_state=<required state>: Endpunkt zur Prüfung eines Replikats. Prüft zusätzlich zu den Prüfungen von replica, ob der Replikationszustand dem geforderten Zustand entspricht. Vor allem mit replication_state=streaming nützlich, um Replikate auszuschließen, die noch mittels Archiv-Recovery aufholen.

  • GET /replica?lag=<max-lag>: Endpunkt zur Prüfung eines Replikats. Prüft zusätzlich zu den Prüfungen von replica den Replikationsrückstand und liefert den Statuscode 200 nur dann, wenn er unter dem angegebenen Wert liegt. Aus Leistungsgründen wird der Schlüssel cluster.last_leader_operation aus dem DCS für die WAL-Position des Leaders und zur Berechnung des Rückstands des Replikats verwendet. max-lag kann in Bytes (als Ganzzahl) oder in lesbarer Form angegeben werden, z. B. 16kB, 64MB, 1GB.

    • GET /replica?lag=1048576
    • GET /replica?lag=1024kB
    • GET /replica?lag=10MB
    • GET /replica?lag=1GB
  • GET /replica?tag_key1=value1&tag_key2=value2: Endpunkt zur Prüfung eines Replikats. Prüft zusätzlich die benutzerdefinierten Tags key1 und key2 und ihre jeweiligen Werte im Abschnitt tags der YAML-Konfiguration. Wenn das Tag für eine Instanz nicht definiert ist oder der Wert in der YAML-Konfiguration nicht mit dem abgefragten Wert übereinstimmt, wird der HTTP-Statuscode 503 zurückgegeben.

    Bei den folgenden Anfragen wird der Status als Leader oder Standby-Leader geprüft. Daher berücksichtigt Patroni keine benutzerdefinierten Tags und ignoriert sie.

    • GET /?tag_key1=value1&tag_key2=value2
    • GET /leader?tag_key1=value1&tag_key2=value2
    • GET /primary?tag_key1=value1&tag_key2=value2
    • GET /read-write?tag_key1=value1&tag_key2=value2
    • GET /standby_leader?tag_key1=value1&tag_key2=value2
    • GET /standby-leader?tag_key1=value1&tag_key2=value2
  • GET /read-only: Wie der obige Endpunkt, schließt aber auch den Primärserver ein.

  • GET /synchronous oder GET /sync: Liefert den HTTP-Statuscode 200 nur dann, wenn der Patroni-Knoten als synchroner Standby läuft.

  • GET /read-only-sync: Wie der obige Endpunkt, schließt aber auch den Primärserver ein.

  • GET /quorum: Liefert den HTTP-Statuscode 200 nur dann, wenn dieser Patroni-Knoten auf dem Primärserver in synchronous_standby_names als Quorum-Knoten aufgeführt ist.

  • GET /read-only-quorum: Wie der obige Endpunkt, schließt aber auch den Primärserver ein.

  • GET /asynchronous oder GET /async: Liefert den HTTP-Statuscode 200 nur dann, wenn der Patroni-Knoten als asynchroner Standby läuft.

  • GET /asynchronous?lag=<max-lag> oder GET /async?lag=<max-lag>: Endpunkt zur Prüfung eines asynchronen Standbys. Prüft zusätzlich zu den Prüfungen von asynchronous oder async den Replikationsrückstand und liefert den Statuscode 200 nur dann, wenn er unter dem angegebenen Wert liegt. Aus Leistungsgründen wird der Schlüssel cluster.last_leader_operation aus dem DCS für die WAL-Position des Leaders und zur Berechnung des Rückstands des Replikats verwendet. max-lag kann in Bytes (als Ganzzahl) oder in lesbarer Form angegeben werden, z. B. 16kB, 64MB, 1GB.

    • GET /async?lag=1048576
    • GET /async?lag=1024kB
    • GET /async?lag=10MB
    • GET /async?lag=1GB
  • GET /health: Liefert den HTTP-Statuscode 200 nur dann, wenn PostgreSQL läuft.

  • GET /liveness: Liefert den HTTP-Statuscode 200, wenn die Heartbeat-Schleife von Patroni ordnungsgemäß läuft, und 503, wenn der letzte Durchlauf auf dem Primärserver mehr als ttl Sekunden oder auf dem Replikat mehr als 2*ttl Sekunden zurückliegt. Kann für livenessProbe verwendet werden.

  • GET /readiness?lag=<max-lag>&mode=apply|write: Liefert den HTTP-Statuscode 200, wenn der Patroni-Knoten als Leader läuft oder wenn PostgreSQL läuft, repliziert und nicht zu weit hinter dem Leader zurückliegt. Der Parameter lag legt den zulässigen Rückstand eines Standbys fest; sein Standardwert ist maximum_lag_on_failover. Der Rückstand kann in Bytes oder in lesbarer Form angegeben werden, beispielsweise 16kB, 64MB oder 1GB. Der Parameter mode legt fest, ob das WAL wiedergegeben (apply) oder lediglich empfangen (write) werden muss. Der Standardwert ist apply.

    Bei Verwendung als Kubernetes-readinessProbe stellt der Endpunkt sicher, dass frisch gestartete Pods erst dann bereit sind, wenn sie zum Leader aufgeholt haben. Zusammen mit einem PodDisruptionBudget verhindert dies, dass der Leader bei einem schrittweisen Neustart der Knoten zu früh beendet wird. Außerdem wird sichergestellt, dass Replikate, die mit der Replikation nicht Schritt halten können, keinen schreibgeschützten Datenverkehr bedienen. Der Endpunkt kann für readinessProbe verwendet werden, wenn Kubernetes-Endpunkte nicht für die Leader-Wahl genutzt werden können (OpenShift).

Der Endpunkt liveness benötigt nur sehr wenige Ressourcen und führt kein SQL aus. Die Prüfungen sollten so konfiguriert werden, dass sie etwa zu dem Zeitpunkt fehlschlagen, zu dem der Leader-Schlüssel abläuft. Beim Standardwert 30s für ttl könnten die Prüfungen beispielsweise wie folgt aussehen:

readinessProbe:
  httpGet:
    scheme: HTTP
    path: /readiness
    port: 8008
  initialDelaySeconds: 3
  periodSeconds: 10
  timeoutSeconds: 5
  successThreshold: 1
  failureThreshold: 3
livenessProbe:
  httpGet:
    scheme: HTTP
    path: /liveness
    port: 8008
  initialDelaySeconds: 3
  periodSeconds: 10
  timeoutSeconds: 5
  successThreshold: 1
  failureThreshold: 3

Endpunkt zur Überwachung

Patroni verwendet GET /patroni bei der Leader-Wahl. Der Endpunkt kann auch vom Überwachungssystem genutzt werden. Das von diesem Endpunkt erzeugte JSON-Dokument hat dieselbe Struktur wie die JSON-Dokumente der Endpunkte für Health Checks.

Beispiel: Ein funktionsfähiger Cluster

$ curl -s http://localhost:8008/patroni | jq .
{
  "state": "running",
  "postmaster_start_time": "2024-08-28 19:39:26.352526+00:00",
  "role": "primary",
  "server_version": 160004,
  "xlog": {
    "location": 67395656
  },
  "timeline": 1,
  "replication": [
    {
      "usename": "replicator",
      "application_name": "patroni2",
      "client_addr": "10.89.0.6",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    },
    {
      "usename": "replicator",
      "application_name": "patroni3",
      "client_addr": "10.89.0.2",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    }
  ],
  "dcs_last_seen": 1692356718,
  "tags": {
    "clonefrom": true
  },
  "database_system_identifier": "7268616322854375442",
  "patroni": {
    "version": "4.0.0",
    "scope": "demo",
    "name": "patroni1"
  }
}

Beispiel: Ein Cluster ohne Leader-Lock

$ curl -s http://localhost:8008/patroni  | jq .
{
  "state": "running",
  "postmaster_start_time": "2024-08-28 19:39:26.352526+00:00",
  "role": "replica",
  "server_version": 160004,
  "xlog": {
    "received_location": 67419744,
    "replayed_location": 67419744,
    "replayed_timestamp": null,
    "paused": false
  },
  "timeline": 1,
  "replication": [
    {
      "usename": "replicator",
      "application_name": "patroni2",
      "client_addr": "10.89.0.6",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    },
    {
      "usename": "replicator",
      "application_name": "patroni3",
      "client_addr": "10.89.0.2",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    }
  ],
  "cluster_unlocked": true,
  "dcs_last_seen": 1692356928,
  "tags": {
    "clonefrom": true
  },
  "database_system_identifier": "7268616322854375442",
  "patroni": {
    "version": "4.0.0",
    "scope": "demo",
    "name": "patroni1"
  }
}

Beispiel: Ein Cluster ohne Leader-Lock mit aktiviertem DCS-Failsafe-Modus

$ curl -s http://localhost:8008/patroni  | jq .
{
  "state": "running",
  "postmaster_start_time": "2024-08-28 19:39:26.352526+00:00",
  "role": "replica",
  "server_version": 160004,
  "xlog": {
    "location": 67420024
  },
  "timeline": 1,
  "replication": [
    {
      "usename": "replicator",
      "application_name": "patroni2",
      "client_addr": "10.89.0.6",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    },
    {
      "usename": "replicator",
      "application_name": "patroni3",
      "client_addr": "10.89.0.2",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    }
  ],
  "cluster_unlocked": true,
  "failsafe_mode_is_active": true,
  "dcs_last_seen": 1692356928,
  "tags": {
    "clonefrom": true
  },
  "database_system_identifier": "7268616322854375442",
  "patroni": {
    "version": "4.0.0",
    "scope": "demo",
    "name": "patroni1"
  }
}

Beispiel: Ein Cluster mit aktiviertem Pausenmodus

$ curl -s http://localhost:8008/patroni  | jq .
{
  "state": "running",
  "postmaster_start_time": "2024-08-28 19:39:26.352526+00:00",
  "role": "replica",
  "server_version": 160004,
  "xlog": {
    "location": 67420024
  },
  "timeline": 1,
  "replication": [
    {
      "usename": "replicator",
      "application_name": "patroni2",
      "client_addr": "10.89.0.6",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    },
    {
      "usename": "replicator",
      "application_name": "patroni3",
      "client_addr": "10.89.0.2",
      "state": "streaming",
      "sync_state": "async",
      "sync_priority": 0
    }
  ],
  "pause": true,
  "dcs_last_seen": 1724874295,
  "tags": {
    "clonefrom": true
  },
  "database_system_identifier": "7268616322854375442",
  "patroni": {
    "version": "4.0.0",
    "scope": "demo",
    "name": "patroni1"
  }
}

Die Patroni-Metriken lassen sich über den Endpunkt GET /metrics im Prometheus-Format abrufen.

$ curl http://localhost:8008/metrics

# HELP patroni_version Patroni semver without periods. \
# TYPE patroni_version gauge
patroni_version{scope="batman",name="patroni1"} 040000
# HELP patroni_postgres_running Value is 1 if Postgres is running, 0 otherwise.
# TYPE patroni_postgres_running gauge
patroni_postgres_running{scope="batman",name="patroni1"} 1
# HELP patroni_postmaster_start_time Epoch seconds since Postgres started.
# TYPE patroni_postmaster_start_time gauge
patroni_postmaster_start_time{scope="batman",name="patroni1"} 1724873966.352526
# HELP patroni_primary Value is 1 if this node is the leader, 0 otherwise.
# TYPE patroni_primary gauge
patroni_primary{scope="batman",name="patroni1"} 1
# HELP patroni_xlog_location Current location of the Postgres transaction log, 0 if this node is not the leader.
# TYPE patroni_xlog_location counter
patroni_xlog_location{scope="batman",name="patroni1"} 22320573386952
# HELP patroni_standby_leader Value is 1 if this node is the standby_leader, 0 otherwise.
# TYPE patroni_standby_leader gauge
patroni_standby_leader{scope="batman",name="patroni1"} 0
# HELP patroni_replica Value is 1 if this node is a replica, 0 otherwise.
# TYPE patroni_replica gauge
patroni_replica{scope="batman",name="patroni1"} 0
# HELP patroni_sync_standby Value is 1 if this node is a sync standby replica, 0 otherwise.
# TYPE patroni_sync_standby gauge
patroni_sync_standby{scope="batman",name="patroni1"} 0
# HELP patroni_quorum_standby Value is 1 if this node is a quorum standby replica, 0 otherwise.
# TYPE patroni_quorum_standby gauge
patroni_quorum_standby{scope="batman",name="patroni1"} 0
# HELP patroni_xlog_received_location Current location of the received Postgres transaction log, 0 if this node is not a replica.
# TYPE patroni_xlog_received_location counter
patroni_xlog_received_location{scope="batman",name="patroni1"} 0
# HELP patroni_xlog_replayed_location Current location of the replayed Postgres transaction log, 0 if this node is not a replica.
# TYPE patroni_xlog_replayed_location counter
patroni_xlog_replayed_location{scope="batman",name="patroni1"} 0
# HELP patroni_xlog_replayed_timestamp Current timestamp of the replayed Postgres transaction log, 0 if null.
# TYPE patroni_xlog_replayed_timestamp gauge
patroni_xlog_replayed_timestamp{scope="batman",name="patroni1"} 0
# HELP patroni_xlog_paused Value is 1 if the Postgres xlog is paused, 0 otherwise.
# TYPE patroni_xlog_paused gauge
patroni_xlog_paused{scope="batman",name="patroni1"} 0
# HELP patroni_postgres_streaming Value is 1 if Postgres is streaming, 0 otherwise.
# TYPE patroni_postgres_streaming gauge
patroni_postgres_streaming{scope="batman",name="patroni1"} 1
# HELP patroni_postgres_in_archive_recovery Value is 1 if Postgres is replicating from archive, 0 otherwise.
# TYPE patroni_postgres_in_archive_recovery gauge
patroni_postgres_in_archive_recovery{scope="batman",name="patroni1"} 0
# HELP patroni_postgres_server_version Version of Postgres (if running), 0 otherwise.
# TYPE patroni_postgres_server_version gauge
patroni_postgres_server_version{scope="batman",name="patroni1"} 160004
# HELP patroni_cluster_unlocked Value is 1 if the cluster is unlocked, 0 if locked.
# TYPE patroni_cluster_unlocked gauge
patroni_cluster_unlocked{scope="batman",name="patroni1"} 0
# HELP patroni_failsafe_mode_is_active Value is 1 if failsafe mode is active, 0 otherwise.
# TYPE patroni_failsafe_mode_is_active gauge
patroni_failsafe_mode_is_active{scope="batman",name="patroni1"} 0
# HELP patroni_failsafe_mode_enabled Value is 1 if failsafe_mode is enabled, 0 otherwise.
# TYPE patroni_failsafe_mode_enabled gauge
patroni_failsafe_mode_enabled{scope="batman",name="patroni1"} 0
# HELP patroni_failsafe_member Value is 1 if this node is a member of failsafe, 0 otherwise.
# TYPE patroni_failsafe_member gauge
patroni_failsafe_member{scope="batman",name="patroni1"} 0
# HELP patroni_postgres_timeline Postgres timeline of this node (if running), 0 otherwise.
# TYPE patroni_postgres_timeline gauge
patroni_postgres_timeline{scope="batman",name="patroni1"} 24
# HELP patroni_dcs_last_seen Epoch timestamp when DCS was last contacted successfully by Patroni.
# TYPE patroni_dcs_last_seen gauge
patroni_dcs_last_seen{scope="batman",name="patroni1"} 1724874235
# HELP patroni_pending_restart Value is 1 if the node needs a restart, 0 otherwise.
# TYPE patroni_pending_restart gauge
patroni_pending_restart{scope="batman",name="patroni1"} 1
# HELP patroni_is_paused Value is 1 if auto failover is disabled, 0 otherwise.
# TYPE patroni_is_paused gauge
patroni_is_paused{scope="batman",name="patroni1"} 1
# HELP patroni_postgres_state Numeric representation of Postgres state.
# Values: 0=initdb, 1=initdb_failed, 2=custom_bootstrap, 3=custom_bootstrap_failed, 4=creating_replica, 5=running, 6=starting, 7=bootstrap_starting, 8=start_failed, 9=restarting, 10=restart_failed, 11=stopping, 12=stopped, 13=stop_failed, 14=crashed
# TYPE patroni_postgres_state gauge
patroni_postgres_state{scope="batman",name="patroni1"} 5
# HELP patroni_failover_priority Failover priority of this node.
# TYPE patroni_failover_priority gauge
patroni_failover_priority{scope="batman",name="patroni1"} 1

PostgreSQL-Zustandswerte

Die Metrik patroni_postgres_state bildet den aktuellen Zustand der PostgreSQL-Instanz als Zahl ab. Das ist für Überwachungs- und Alarmierungssysteme nützlich, die Zustandsänderungen im Zeitverlauf verfolgen müssen. Die Zahlenwerte werden mit der statischen Methode PostgresqlState.get_metrics_description() erzeugt.

Wert Zustandsname Beschreibung
0 initdb Neuer Cluster wird initialisiert
1 initdb_failed Initialisierung des neuen Clusters fehlgeschlagen
2 custom_bootstrap Benutzerdefiniertes Bootstrap-Skript wird ausgeführt
3 custom_bootstrap_failed Benutzerdefiniertes Bootstrap-Skript fehlgeschlagen
4 creating_replica Replikat wird vom Primärserver erstellt
5 running PostgreSQL läuft ordnungsgemäß
6 starting PostgreSQL wird gestartet
7 bootstrap_starting Start nach benutzerdefiniertem Bootstrap
8 start_failed Start von PostgreSQL fehlgeschlagen
9 restarting PostgreSQL wird neu gestartet
10 restart_failed Neustart von PostgreSQL fehlgeschlagen
11 stopping PostgreSQL wird angehalten
12 stopped PostgreSQL ist angehalten
13 stop_failed Anhalten von PostgreSQL fehlgeschlagen
14 crashed PostgreSQL ist abgestürzt

PostgreSQL-Zustandswerte

Hinweis

Diese Zahlenwerte sind fest und werden niemals geändert, um die Abwärtskompatibilität mit bestehenden Überwachungssystemen zu wahren. Falls künftig neue Zustände hinzukommen, erhalten sie neue Zahlenwerte, ohne die bestehenden zu ändern.


Endpunkte für den Cluster-Status

  • Der Endpunkt GET /cluster erzeugt ein JSON-Dokument, das die aktuelle Topologie und den Zustand des Clusters beschreibt:
$ curl -s http://localhost:8008/cluster | jq .
{
  "members": [
    {
      "name": "patroni1",
      "role": "leader",
      "state": "running",
      "api_url": "http://10.89.0.4:8008/patroni",
      "host": "10.89.0.4",
      "port": 5432,
      "timeline": 5,
      "tags": {
        "clonefrom": true
      }
    },
    {
      "name": "patroni2",
      "role": "replica",
      "state": "streaming",
      "api_url": "http://10.89.0.6:8008/patroni",
      "host": "10.89.0.6",
      "port": 5433,
      "timeline": 5,
      "tags": {
        "clonefrom": true
      },
      "receive_lag": 0,
      "receive_lsn": "0/4000060",
      "replay_lag": 0,
      "replay_lsn": "0/4000060",
      "lag": 0,
      "lsn": "0/4000060"
    }
  ],
  "scope": "demo",
  "scheduled_switchover": {
    "at": "2023-09-24T10:36:00+02:00",
    "from": "patroni1",
    "to": "patroni3"
  }
}
  • Der Endpunkt GET /history bietet einen Überblick über die Switchover- und Failover-Historie des Clusters. Das Format ähnelt stark dem Inhalt der History-Dateien im Verzeichnis pg_wal. Der einzige Unterschied ist das Zeitstempelfeld, das angibt, wann die neue Timeline erstellt wurde.
$ curl -s http://localhost:8008/history | jq .
[
  [
    1,
    25623960,
    "no recovery target specified",
    "2019-09-23T16:57:57+02:00"
  ],
  [
    2,
    25624344,
    "no recovery target specified",
    "2019-09-24T09:22:33+02:00"
  ],
  [
    3,
    25624752,
    "no recovery target specified",
    "2019-09-24T09:26:15+02:00"
  ],
  [
    4,
    50331856,
    "no recovery target specified",
    "2019-09-24T09:35:52+02:00"
  ]
]


Endpunkt für die Konfiguration

GET /config: Aktuelle Version der dynamischen Konfiguration abrufen:

$ curl -s http://localhost:8008/config | jq .
{
  "ttl": 30,
  "loop_wait": 10,
  "retry_timeout": 10,
  "maximum_lag_on_failover": 1048576,
  "postgresql": {
    "use_slots": true,
    "use_pg_rewind": true,
    "parameters": {
      "hot_standby": "on",
      "wal_level": "hot_standby",
      "max_wal_senders": 5,
      "max_replication_slots": 5,
      "max_connections": "100"
    }
  }
}

PATCH /config: Bestehende Konfiguration ändern.

$ curl -s -XPATCH -d \
    '{"loop_wait":5,"ttl":20,"postgresql":{"parameters":{"max_connections":"101"}}}' \
    http://localhost:8008/config | jq .
{
  "ttl": 20,
  "loop_wait": 5,
  "maximum_lag_on_failover": 1048576,
  "retry_timeout": 10,
  "postgresql": {
    "use_slots": true,
    "use_pg_rewind": true,
    "parameters": {
      "hot_standby": "on",
      "wal_level": "hot_standby",
      "max_wal_senders": 5,
      "max_replication_slots": 5,
      "max_connections": "101"
    }
  }
}

Der obige REST-API-Aufruf ändert die bestehende Konfiguration und gibt die neue Konfiguration zurück.

Nun prüfen, ob der Knoten diese Konfiguration verarbeitet hat. Zunächst sollte er alle 5 Sekunden Protokollzeilen ausgeben (loop_wait=5). Die Änderung von „max_connections“ erfordert einen Neustart, daher sollte das Flag „pending_restart“ angezeigt werden:

$ curl -s http://localhost:8008/patroni | jq .
{
  "postmaster_start_time": "2024-08-28 19:39:26.352526+00:00",
  "xlog": {
    "location": 2197818976
  },
  "timeline": 1,
  "dcs_last_seen": 1724874545,
  "database_system_identifier": "7408277255830290455",
  "pending_restart": true,
  "pending_restart_reason": {
    "max_connections": {
      "old_value": "100",
      "new_value": "101"
    }
  },
  "patroni": {
    "version": "4.0.0",
    "scope": "batman",
    "name": "patroni1"
  },
  "state": "running",
  "role": "primary",
  "server_version": 160004
}

Parameter entfernen:

Um eine Einstellung zu entfernen (zurückzusetzen), genügt es, sie per Patch auf null zu setzen:

$ curl -s -XPATCH -d \
    '{"postgresql":{"parameters":{"max_connections":null}}}' \
    http://localhost:8008/config | jq .
{
  "ttl": 20,
  "loop_wait": 5,
  "retry_timeout": 10,
  "maximum_lag_on_failover": 1048576,
  "postgresql": {
    "use_slots": true,
    "use_pg_rewind": true,
    "parameters": {
      "hot_standby": "on",
      "unix_socket_directories": ".",
      "wal_level": "hot_standby",
      "max_wal_senders": 5,
      "max_replication_slots": 5
    }
  }
}

Der obige Aufruf entfernt postgresql.parameters.max_connections aus der dynamischen Konfiguration.

PUT /config: Eine bestehende dynamische Konfiguration kann auch bedingungslos vollständig überschrieben werden:

$ curl -s -XPUT -d \
    '{"maximum_lag_on_failover":1048576,"retry_timeout":10,"postgresql":{"use_slots":true,"use_pg_rewind":true,"parameters":{"hot_standby":"on","wal_level":"hot_standby","unix_socket_directories":".","max_wal_senders":5}},"loop_wait":3,"ttl":20}' \
    http://localhost:8008/config | jq .
{
  "ttl": 20,
  "maximum_lag_on_failover": 1048576,
  "retry_timeout": 10,
  "postgresql": {
    "use_slots": true,
    "parameters": {
      "hot_standby": "on",
      "unix_socket_directories": ".",
      "wal_level": "hot_standby",
      "max_wal_senders": 5
    },
    "use_pg_rewind": true
  },
  "loop_wait": 3
}

Endpunkte für Switchover und Failover

Switchover

Der Endpunkt /switchover funktioniert nur, wenn der Cluster funktionsfähig ist (ein Leader vorhanden ist). Er ermöglicht auch, einen Switchover zu einem bestimmten Zeitpunkt zu planen.

Beim Aufruf des Endpunkts /switchover kann ein Kandidat angegeben werden; anders als beim Endpunkt /failover ist dies jedoch nicht erforderlich. Wird kein Kandidat angegeben, nehmen alle geeigneten Knoten des Clusters an der Leader-Wahl teil, nachdem der Leader seine Rolle abgegeben hat.

Im JSON-Inhalt der POST-Anfrage muss das Feld leader angegeben werden. Die Felder candidate und scheduled_at sind optional und können verwendet werden, um einen Switchover zu einem bestimmten Zeitpunkt zu planen.

Je nach Situation können Anfragen unterschiedliche HTTP-Statuscodes und Antwortinhalte liefern. Der Statuscode 200 wird zurückgegeben, wenn der Switchover oder das Failover erfolgreich abgeschlossen wurde. Wurde der Switchover erfolgreich geplant, liefert Patroni den HTTP-Statuscode 202. Ist ein Fehler aufgetreten, wird ein Fehlerstatuscode (400, 412 oder 503) mit Einzelheiten im Antwortinhalt zurückgegeben.

Mit DELETE /switchover kann der aktuell geplante Switchover gelöscht werden.

Beispiel: Switchover zu einem beliebigen funktionsfähigen Standby durchführen

$ curl -s http://localhost:8008/switchover -XPOST -d '{"leader":"postgresql1"}'
Successfully switched over to "postgresql2"

Beispiel: Switchover zu einem bestimmten Knoten durchführen

$ curl -s http://localhost:8008/switchover -XPOST -d \
    '{"leader":"postgresql1","candidate":"postgresql2"}'
Successfully switched over to "postgresql2"

Beispiel: Switchover vom Leader zu einem beliebigen anderen funktionsfähigen Standby im Cluster zu einem bestimmten Zeitpunkt planen.

$ curl -s http://localhost:8008/switchover -XPOST -d \
    '{"leader":"postgresql0","scheduled_at":"2019-09-24T12:00+00"}'
Switchover scheduled

Failover

Der Endpunkt /failover kann für ein manuelles Failover verwendet werden, wenn keine funktionsfähigen Knoten vorhanden sind (z. B. zu einem asynchronen Standby, wenn alle synchronen Standbys für eine Hochstufung nicht funktionsfähig genug sind). Ein fehlender Leader ist jedoch keine Voraussetzung: Ein Failover kann auch in einem funktionsfähigen Cluster ausgeführt werden.

Im JSON-Inhalt der POST-Anfrage muss das Feld candidate angegeben werden. Wird das Feld leader angegeben, wird stattdessen ein Switchover ausgelöst.

Beispiel:

$ curl -s http://localhost:8008/failover -XPOST -d '{"candidate":"postgresql1"}'
Successfully failed over to "postgresql1"
Warnung

Bei Verwendung dieses Endpunkts ist äußerste Vorsicht geboten , da er unter bestimmten Umständen zu Datenverlust führen kann. In den meisten Fällen erfüllt der Switchover-Endpunkt die Anforderungen des Administrators.

Die Endpunkte POST /switchover und POST /failover werden von patronictl_switchover bzw. patronictl_failover verwendet.

DELETE /switchover wird von patronictl flush cluster-name switchover verwendet.

Failover Switchover
Angabe eines Leaders erforderlich nein ja
Angabe eines Kandidaten erforderlich ja nein
Im Pausenmodus ausführbar ja ja (nur zu einem bestimmten Kandidaten)
Planbar nein ja (sofern nicht im Pausenmodus)

Vergleich von Failover und Switchover

Funktionsfähiger Standby

Ein Cluster-Mitglied sollte einige Prüfungen bestehen, um bei einem Switchover an der Leader-Wahl teilnehmen oder als Failover-/Switchover-Kandidat zum Leader werden zu können:

  • über die Patroni API erreichbar sein;
  • das Tag nofailover darf nicht auf true gesetzt sein;
  • über einen voll funktionsfähigen Watchdog verfügen (falls die Konfiguration dies erfordert);
  • bei einem Switchover in einem funktionsfähigen Cluster oder einem automatischen Failover den maximalen Replikationsrückstand nicht überschreiten (Konfigurationsparameter maximum_lag_on_failover);
  • bei einem Switchover in einem funktionsfähigen Cluster oder einem automatischen Failover keine kleinere Timeline-Nummer als die Cluster-Timeline haben, wenn der Konfigurationsparameter check_timeline auf true gesetzt ist;
  • im synchronen Modus :
    • Bei einem Switchover (mit oder ohne Kandidaten): unter den Mitgliedern des Schlüssels /sync aufgeführt sein;
    • Bei einem Failover sowohl in funktionsfähigen als auch in nicht funktionsfähigen Clustern entfällt diese Prüfung.
Warnung

Bei einem manuellen Failover in einem Cluster ohne Leader darf ein Kandidat auch dann hochgestuft werden, wenn:

  • er bei aktiviertem synchronem Modus nicht unter den Mitgliedern des Schlüssels /sync aufgeführt ist;
  • sein Rückstand den maximal zulässigen Replikationsrückstand überschreitet;
  • seine Timeline-Nummer kleiner als die zuletzt bekannte Cluster-Timeline ist.


Endpunkt für Neustarts

  • POST /restart: Mit dem Aufruf POST /restart kann Postgres auf dem jeweiligen Knoten neu gestartet werden. Im JSON-Inhalt der POST-Anfrage können optional Bedingungen für den Neustart angegeben werden:
    • restart_pending: Boolescher Wert. Bei true startet Patroni PostgreSQL nur dann neu, wenn ein Neustart aussteht, um Änderungen an der PostgreSQL-Konfiguration anzuwenden.
    • role: Neustart nur durchführen, wenn die aktuelle Rolle des Knotens mit der Rolle aus der POST-Anfrage übereinstimmt.
    • postgres_version: Neustart nur durchführen, wenn die aktuelle Postgres-Version kleiner als die in der POST-Anfrage angegebene ist.
    • timeout: Wartezeit, bis PostgreSQL Verbindungen annimmt. Überschreibt primary_start_timeout.
    • schedule: Zeitstempel mit Zeitzone; plant den Neustart für einen zukünftigen Zeitpunkt.
  • DELETE /restart: Geplanten Neustart löschen

Die Endpunkte POST /restart und DELETE /restart werden von patronictl_restart bzw. patronictl flush cluster-name restart verwendet.


Endpunkt zum Neuladen

Der Aufruf POST /reload weist Patroni an, die Konfigurationsdatei erneut einzulesen und anzuwenden. Dies entspricht dem Senden des Signals SIGHUP an den Patroni-Prozess. Wenn Postgres-Parameter geändert wurden, die einen Neustart erfordern (z. B. shared_buffers), muss Postgres weiterhin ausdrücklich neu gestartet werden, entweder über den Endpunkt POST /restart oder mithilfe von patronictl_restart .

Der Endpunkt zum Neuladen wird von patronictl_reload verwendet.


Endpunkt zur Neuinitialisierung

POST /reinitialize: Initialisiert das PostgreSQL-Datenverzeichnis auf dem angegebenen Knoten neu. Der Aufruf darf nur auf Replikaten ausgeführt werden. Er entfernt das Datenverzeichnis und startet pg_basebackup oder eine alternative Methode zur Replikaterstellung .

Der Aufruf kann fehlschlagen, wenn Patroni in einer Schleife versucht, ein ausgefallenes Postgres wiederherzustellen (neu zu starten). Um dieses Problem zu umgehen, kann im Anfrageinhalt {"force":true} angegeben werden.

Im Anfrageinhalt kann {“from-leader”:true} angegeben werden, um das Basis-Backup direkt vom Leader-Knoten zu beziehen. Dies ist nützlich, wenn die Neuinitialisierung bei einem Ausfall aller Replikatknoten ausgeführt wird.

Der Endpunkt zur Neuinitialisierung wird von patronictl_reinit verwendet.

5 - patronictl

Befehlsreferenz zu Konfiguration, Syntax und Unterbefehlen von patronictl.

Patroni bietet eine Befehlszeilenschnittstelle namens patronictl , die hauptsächlich mit der REST API von Patroni und dem DCS interagiert. Sie erleichtert die Durchführung von Vorgängen im Cluster und lässt sich sowohl manuell als auch in Skripten einfach verwenden.


Konfiguration

patronictl verwendet 3 Abschnitte der Konfiguration:

  • ctl: Authentifizierung gegenüber der REST API von Patroni und Prüfung der Serveridentität. Weitere Einzelheiten finden sich unter ctl-Einstellungen ;
  • restapi: Authentifizierung gegenüber der REST API von Patroni und Prüfung der Serveridentität. Wird nur verwendet, wenn die ctl-Konfiguration nicht ausreicht. patronictl verwendet hauptsächlich den Abschnitt restapi.authentication (wenn ctl.authentication fehlt) und die Einstellung restapi.cafile (wenn ctl.cacert fehlt). Weitere Einzelheiten finden sich unter REST-API-Einstellungen ;
  • DCS (z. B. etcd): Verbindung und Authentifizierung gegenüber dem von Patroni verwendeten DCS.

Diese Konfigurationsoptionen können entweder aus Umgebungsvariablen oder aus einer Konfigurationsdatei stammen. Die obigen Abschnitte unter Konfiguration über Umgebungsvariablen bzw. YAML-Konfiguration erläutern, wie die Optionen über Umgebungsvariablen oder eine Konfigurationsdatei gesetzt werden können.

Die Verwendung von Umgebungsvariablen ist unkompliziert. Patronictl liest die Umgebungsvariablen und verwendet ihre Werte.

Bei Verwendung einer Konfigurationsdatei gibt es verschiedene Möglichkeiten, patronictl die gewünschte Datei mitzuteilen. Standardmäßig versucht patronictl , eine Konfigurationsdatei namens patronictl.yaml zu laden. Je nach System wird sie unter einem der folgenden Pfade erwartet:

  • Mac OS X: ~/Library/Application Support/patroni
  • Mac OS X (POSIX): ~/.patroni
  • Unix: ~/.config/patroni
  • Unix (POSIX): ~/.patroni
  • Windows (mit Roaming): C:\Users\<user>\AppData\Roaming\patroni
  • Windows (ohne Roaming): C:\Users\<user>\AppData\Local\patroni

Dieses Verhalten lässt sich auf folgende Weise überschreiben:

  • Die Umgebungsvariable PATRONICTL_CONFIG_FILE auf den Pfad einer eigenen Konfigurationsdatei setzen;
  • Dem Befehlszeilenargument -c / --config-file von patronictl den Pfad einer eigenen Konfigurationsdatei übergeben.
Hinweis

Wenn patronictl auf demselben Host wie der Daemon patroni ausgeführt wird, kann dieselbe Konfigurationsdatei verwendet werden, sofern sie alle von patronictl benötigten Konfigurationsabschnitte enthält.


Verwendung

patronictl bietet mehrere praktische Operationen. Dieser Abschnitt beschreibt sie im Einzelnen.

Vor der Beschreibung der einzelnen Unterbefehle von patronictl folgt eine Übersicht der Befehlszeilenargumente von patronictl selbst:

-c / --config-file
Wie bereits erläutert, wird damit der Pfad zu einer Konfigurationsdatei für patronictl angegeben.

-d / --dcs-url / --dcs
Eine Verbindungszeichenfolge für den von Patroni verwendeten DCS angeben.

Dieses Argument kann die DCS- und namespace-Einstellungen aus der Konfiguration von patronictl überschreiben oder sie festlegen, falls sie dort fehlen.

Der Wert sollte das Format DCS://HOST:PORT/NAMESPACE haben, z. B. etcd3://localhost:2379/service, um eine Verbindung zu etcd v3 auf localhost herzustellen, wobei der Patroni-Cluster im Namensraum service gespeichert ist. Jeder im Argument fehlende Teil wird durch den Wert aus der Konfiguration oder den Standardwert ersetzt.

-k / --insecure
Flag zum Überspringen der Prüfung des SSL-Zertifikats des REST-API-Servers.

Dies ist das Aufrufschema für einen Befehl von patronictl :

patronictl [ { -c | --config-file } CONFIG_FILE ]
  [ { -d | --dcs-url | --dcs } DCS_URL ] 
  [ { -k | --insecure } ]
  SUBCOMMAND
Hinweis

Für das Aufrufschema gilt folgende Syntax:

  • Optionen in eckigen Klammern sind optional;
  • Optionen in geschweiften Klammern bedeuten, dass eine Option aus der Menge gewählt wird;
  • Optionen mit [, ... ] können mehrfach angegeben werden;
  • Angaben in Großbuchstaben stehen für Literale, denen ein Wert zugewiesen werden sollte.

Dieselbe Syntax wird in den folgenden Unterabschnitten bei der Beschreibung der Unterbefehle von patronictl verwendet. Die dortigen Aufrufschemata der Unterbefehle ersetzen jeweils SUBCOMMAND im obigen Aufrufschema.

Die folgenden Unterabschnitte beschreiben alle von patronictl implementierten Befehle. Für die Beispiele werden die Konfigurationsdateien aus dem GitHub-Repository von Patroni verwendet (postgres0.yml, postgres1.yml und postgres2.yml).

patronictl demote-cluster

Aufrufschema

demote-cluster
  [ CLUSTER_NAME ]
  [ --host HOST ]
  [ --port PORT ]
  [ --restore-command RESTORE_COMMAND ]
  [ --primary-slot-name PRIMARY_SLOT_NAME ]
  [ --force ]

Beschreibung

patronictl demote-cluster wandelt einen regulären Patroni-Cluster in einen Standby-Cluster um.

Der Befehl ergänzt die dynamische Konfiguration um einen Abschnitt standby_cluster, der aus den angegebenen Verbindungsoptionen für den entfernten Primärserver erstellt wird. Anschließend wartet er, bis der Leader als Standby-Leader läuft. Vor der Konfigurationsänderung gibt er die aktuelle Cluster-Topologie aus. Eine Bestätigung fordert er an, sofern --force nicht verwendet wird.

Mindestens eine der Optionen --host, --port oder --restore-command muss angegeben werden.

Parameter

CLUSTER_NAME: Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--host: Adresse des entfernten Knotens.

--port: Port des entfernten Knotens.

--restore-command: Befehl zur Wiederherstellung von WAL-Einträgen vom entfernten Primärserver.

--primary-slot-name: Name des Replikationsslots auf dem entfernten Knoten, der für die Replikation verwendet werden soll.

--force: Flag zum Überspringen der Bestätigungsabfragen beim Herabstufen des Clusters.

Nützlich für Skripte.

Beispiele

Den Cluster zu einem Standby-Cluster herabstufen, der einem entfernten Primärserver-Endpunkt folgt:

$ patronictl -c postgres0.yml demote-cluster batman --host 192.0.2.10 --port 5432 --primary-slot-name batman --force

patronictl dsn

Aufrufschema

dsn
  [ CLUSTER_NAME ]
  [ { { -r | --role } { leader | primary | standby-leader | replica | standby | any } | { -m | --member } MEMBER_NAME } ]
  [ --group CITUS_GROUP ]

Beschreibung

patronictl dsn ermittelt die Verbindungszeichenfolge für ein Mitglied des Patroni-Clusters.

Wenn mehrere Mitglieder den Parametern dieses Befehls entsprechen, wird eines davon ausgewählt, wobei der Primärserver Vorrang hat.

Parameter

CLUSTER_NAME: Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

-r / --role
Ein Mitglied mit der angegebenen Rolle auswählen.

Die Rolle kann einen der folgenden Werte haben:

  • leader: der Leader eines regulären Patroni-Clusters oder eines Patroni-Standby-Clusters; oder
  • primary: der Leader eines regulären Patroni-Clusters; oder
  • standby-leader: der Leader eines Patroni-Standby-Clusters; oder
  • replica: ein Replikat eines Patroni-Clusters; oder
  • standby: entspricht replica; oder
  • any: beliebige Rolle. Entspricht dem Weglassen dieses Parameters; oder

-m / --member
Ein Mitglied des Clusters mit dem angegebenen Namen auswählen.

MEMBER_NAME ist der Name des Mitglieds.

--group
Ein Mitglied auswählen, das zur angegebenen Citus-Gruppe gehört.

CITUS_GROUP ist die ID der Citus-Gruppe.

Beispiele

DSN des Primärservers abrufen:

$ patronictl -c postgres0.yml dsn batman -r primary
host=127.0.0.1 port=5432

DSN des Knotens namens postgresql1 abrufen:

$ patronictl -c postgres0.yml dsn batman --member postgresql1
host=127.0.0.1 port=5433

patronictl edit-config

Aufrufschema

edit-config
  [ CLUSTER_NAME ]
  [ --group CITUS_GROUP ]
  [ { -q | --quiet } ]
  [ { -s | --set } CONFIG="VALUE" [, ... ] ]
  [ { -p | --pg } PG_CONFIG="PG_VALUE" [, ... ] ]
  [ { --apply | --replace } CONFIG_FILE ]
  [ --force ]

Beschreibung

patronictl edit-config ändert die dynamische Konfiguration des Clusters und aktualisiert damit den DCS.

Hinweis

Beim Aufruf über ein TTY versucht der Befehl, einen Diff der dynamischen Konfiguration mit einem Pager anzuzeigen. Standardmäßig versucht er, less oder more zu verwenden. Für einen anderen Pager die Umgebungsvariable PAGER auf das gewünschte Programm setzen.

Parameter

CLUSTER_NAME: Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--group
Die dynamische Konfiguration der angegebenen Citus-Gruppe ändern.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration citus.group zu lesen, sofern sie vorhanden ist.

CITUS_GROUP ist die ID der Citus-Gruppe.

-q / --quiet
Flag zum Überspringen der Anzeige des Konfigurations-Diffs.

-s / --set
Eine bestimmte dynamische Konfigurationsoption auf den angegebenen Wert setzen.

CONFIG ist der Pfad der dynamischen Konfiguration im YAML-Baum, dessen Ebenen durch . verbunden sind.

VALUE ist der Wert für CONFIG. Bei null wird CONFIG aus der dynamischen Konfiguration entfernt.

-p / --pg
Eine bestimmte dynamische Postgres-Konfigurationsoption auf den angegebenen Wert setzen.

Dies ist im Wesentlichen eine Kurzform für -s / --set, bei der CONFIG das Präfix postgresql.parameters. erhält.

PG_CONFIG ist der Name der zu setzenden Postgres-Konfigurationsoption.

PG_VALUE ist der Wert für PG_CONFIG. Bei null wird PG_CONFIG aus der dynamischen Konfiguration entfernt.

--apply
Die dynamische Konfiguration aus der angegebenen Datei anwenden.

Dies entspricht der Angabe mehrerer Optionen -s / --set, einer für jede Konfigurationsoption aus CONFIG_FILE.

CONFIG_FILE ist der Pfad zu einer Datei mit der anzuwendenden dynamischen Konfiguration im YAML-Format. Zum Lesen aus stdin den Wert - verwenden.

--replace
Die dynamische Konfiguration im DCS durch die dynamische Konfiguration aus der angegebenen Datei ersetzen.

CONFIG_FILE ist der Pfad zu einer Datei mit der neuen dynamischen Konfiguration im YAML-Format, die wirksam werden soll. Zum Lesen aus stdin den Wert - verwenden.

--force
Flag zum Überspringen der Bestätigungsabfragen beim Ändern der dynamischen Konfiguration.

Nützlich für Skripte.

Beispiele

Den Postgres-GUC max_connections ändern:

patronictl -c postgres0.yml edit-config batman --pg max_connections="150" --force
---
+++
@@ -1,6 +1,8 @@
loop_wait: 10
maximum_lag_on_failover: 1048576
postgresql:
+  parameters:
+    max_connections: 150
  pg_hba:
  - host replication replicator 127.0.0.1/32 md5
  - host all all 0.0.0.0/0 md5

Configuration changed

Die Einstellungen loop_wait und ttl ändern:

patronictl -c postgres0.yml edit-config batman --set loop_wait="15" --set ttl="45" --force
---
+++
@@ -1,4 +1,4 @@
-loop_wait: 10
+loop_wait: 15
maximum_lag_on_failover: 1048576
postgresql:
  pg_hba:
@@ -6,4 +6,4 @@
  - host all all 0.0.0.0/0 md5
  use_pg_rewind: true
retry_timeout: 10
-ttl: 30
+ttl: 45

Configuration changed

Die Einstellung maximum_lag_on_failover aus der dynamischen Konfiguration entfernen:

patronictl -c postgres0.yml edit-config batman --set maximum_lag_on_failover="null" --force
---
+++
@@ -1,5 +1,4 @@
loop_wait: 10
-maximum_lag_on_failover: 1048576
postgresql:
  pg_hba:
  - host replication replicator 127.0.0.1/32 md5

Configuration changed

patronictl failover

Aufrufschema

failover
  [ CLUSTER_NAME ]
  [ --group CITUS_GROUP ]
  --candidate CANDIDATE_NAME
  [ --force ]

Beschreibung

patronictl failover führt ein manuelles Failover im Cluster durch.

Der Befehl ist für nicht funktionsfähige Cluster vorgesehen, z. B. wenn:

  • kein Leader vorhanden ist; oder
  • in einem synchronen Cluster kein synchroner Standby verfügbar ist.

Er ermöglicht bei aktiviertem synchronem Modus auch ein Failover zu einem asynchronen Knoten.

Hinweis

patronictl failover kann auch in einem funktionsfähigen Cluster ausgeführt werden. Für diese Fälle wird jedoch patronictl switchover empfohlen.

Warnung

Das Auslösen eines Failovers kann zu Datenverlust führen, je nachdem, wie aktuell das hochgestufte Replikat im Vergleich zum Primärserver ist.

Parameter

CLUSTER_NAME: Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--group
Ein Failover in der angegebenen Citus-Gruppe durchführen.

CITUS_GROUP ist die ID der Citus-Gruppe.

--candidate
Der Knoten, der beim Failover hochgestuft werden soll.

CANDIDATE_NAME ist der Name des hochzustufenden Knotens.

--force
Flag zum Überspringen der Bestätigungsabfragen bei der Durchführung des Failovers.

Nützlich für Skripte.

Beispiele

Ein Failover zum Knoten postgresql2 durchführen:

$ patronictl -c postgres0.yml failover batman --candidate postgresql2 --force
Current cluster topology
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  3 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  3 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  3 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
2023-09-12 11:52:27.50978 Successfully failed over to "postgresql2"
+ Cluster: batman (7277694203142172922) -+---------+----+-------------+---------+------------+---------+
| Member      | Host           | Role    | State   | TL | Receive LSN |     Lag | Replay LSN |     Lag |
+-------------+----------------+---------+---------+----+-------------+---------+------------+---------+
| postgresql0 | 127.0.0.1:5432 | Replica | stopped |    |     unknown | unknown |    unknown | unknown |
| postgresql1 | 127.0.0.1:5433 | Replica | running |  3 |   0/4000188 |       0 |  0/4000188 |       0 |
| postgresql2 | 127.0.0.1:5434 | Leader  | running |  3 |             |         |            |         |
+-------------+----------------+---------+---------+----+-------------+---------+------------+---------+

patronictl flush

Aufrufschema

flush
  CLUSTER_NAME
  [ MEMBER_NAME [, ... ] ]
  { restart | switchover }
  [ --group CITUS_GROUP ]
  [ { -r | --role } { leader | primary | standby-leader | replica | standby | any } ]
  [ --force ]

Beschreibung

patronictl flush verwirft geplante Ereignisse, sofern vorhanden.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

MEMBER_NAME
Geplante Ereignisse für die angegebenen Patroni-Mitglieder verwerfen.

Es können mehrere Mitglieder angegeben werden. Ohne Angabe von Mitgliedern werden alle berücksichtigt.

Hinweis

Wird nur beim Verwerfen geplanter Neustarts verwendet.

restart
Geplante Neustarts verwerfen.

switchover
Geplanten Switchover verwerfen.

--group
Geplante Ereignisse der angegebenen Citus-Gruppe verwerfen.

CITUS_GROUP ist die ID der Citus-Gruppe.

-r / --role
Geplante Ereignisse für Mitglieder mit der angegebenen Rolle verwerfen.

Die Rolle kann einen der folgenden Werte haben:

  • leader: der Leader eines regulären Patroni-Clusters oder eines Patroni-Standby-Clusters; oder
  • primary: der Leader eines regulären Patroni-Clusters; oder
  • standby-leader: der Leader eines Patroni-Standby-Clusters; oder
  • replica: ein Replikat eines Patroni-Clusters; oder
  • standby: entspricht replica; oder
  • any: beliebige Rolle. Entspricht dem Weglassen dieses Parameters.
Hinweis

Wird nur beim Verwerfen geplanter Neustarts verwendet.

--force
Flag zum Überspringen der Bestätigungsabfragen beim Verwerfen geplanter Ereignisse.

Nützlich für Skripte.

Beispiele

Einen geplanten Switchover verwerfen:

$ patronictl -c postgres0.yml flush batman switchover --force
Success: scheduled switchover deleted

Den geplanten Neustart aller Standby-Knoten verwerfen:

$ patronictl -c postgres0.yml flush batman restart -r replica --force
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+---------------------------+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag | Scheduled restart         |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+---------------------------+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  5 |             |     |            |     | 2025-03-23T18:00:00-03:00 |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  5 |   0/4000400 |   0 |  0/4000400 |   0 | 2025-03-23T18:00:00-03:00 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  5 |   0/4000400 |   0 |  0/4000400 |   0 | 2025-03-23T18:00:00-03:00 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+---------------------------+
Success: flush scheduled restart for member postgresql1
Success: flush scheduled restart for member postgresql2

Den geplanten Neustart der Knoten postgresql0 und postgresql1 verwerfen:

$ patronictl -c postgres0.yml flush batman postgresql0 postgresql1 restart --force
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+---------------------------+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag | Scheduled restart         |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+---------------------------+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  5 |             |     |            |     | 2025-03-23T18:00:00-03:00 |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  5 |   0/4000400 |   0 |  0/4000400 |   0 | 2025-03-23T18:00:00-03:00 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  5 |   0/4000400 |   0 |  0/4000400 |   0 | 2025-03-23T18:00:00-03:00 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+---------------------------+
Success: flush scheduled restart for member postgresql0
Success: flush scheduled restart for member postgresql1

patronictl history

Aufrufschema

history
  [ CLUSTER_NAME ]
  [ --group CITUS_GROUP ]
  [ { -f | --format } { pretty | tsv | json | yaml } ]

Beschreibung

patronictl history zeigt die Historie der Failover- und Switchover-Ereignisse des Clusters, sofern vorhanden.

Die Ausgabe enthält folgende Informationen:

TL
Postgres-Timeline, auf der das Ereignis auftrat.

LSN
Postgres-LSN, an der das Ereignis auftrat.

Reason
Grund aus der Postgres-Datei .history.

Timestamp
Zeitpunkt des Ereignisses.

New Leader
Patroni-Mitglied, das bei diesem Ereignis hochgestuft wurde.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--group
Die Ereignishistorie der angegebenen Citus-Gruppe anzeigen.

CITUS_GROUP ist die ID der Citus-Gruppe.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration citus.group zu lesen, sofern sie vorhanden ist.

-f / --format
Formatierung der Ereignisliste in der Ausgabe.

Das Format kann einen der folgenden Werte haben:

  • pretty: gibt die Historie als formatierte Tabelle aus; oder
  • tsv: gibt die Historie tabellarisch aus, mit durch \t getrennten Spalten; oder
  • json: gibt die Historie im JSON-Format aus; oder
  • yaml: gibt die Historie im YAML-Format aus.

Der Standardwert ist pretty.

Beispiele

Die Ereignishistorie anzeigen:

$ patronictl -c postgres0.yml history batman
+----+----------+------------------------------+----------------------------------+-------------+
| TL |      LSN | Reason                       | Timestamp                        | New Leader  |
+----+----------+------------------------------+----------------------------------+-------------+
|  1 | 24392648 | no recovery target specified | 2023-09-11T22:11:27.125527+00:00 | postgresql0 |
|  2 | 50331864 | no recovery target specified | 2023-09-12T11:34:03.148097+00:00 | postgresql0 |
|  3 | 83886704 | no recovery target specified | 2023-09-12T11:52:26.948134+00:00 | postgresql2 |
|  4 | 83887280 | no recovery target specified | 2023-09-12T11:53:09.620136+00:00 | postgresql0 |
+----+----------+------------------------------+----------------------------------+-------------+

Die Ereignishistorie im YAML-Format anzeigen:

$ patronictl -c postgres0.yml history batman -f yaml
- LSN: 24392648
  New Leader: postgresql0
  Reason: no recovery target specified
  TL: 1
  Timestamp: '2023-09-11T22:11:27.125527+00:00'
- LSN: 50331864
  New Leader: postgresql0
  Reason: no recovery target specified
  TL: 2
  Timestamp: '2023-09-12T11:34:03.148097+00:00'
- LSN: 83886704
  New Leader: postgresql2
  Reason: no recovery target specified
  TL: 3
  Timestamp: '2023-09-12T11:52:26.948134+00:00'
- LSN: 83887280
  New Leader: postgresql0
  Reason: no recovery target specified
  TL: 4
  Timestamp: '2023-09-12T11:53:09.620136+00:00'

patronictl list

Aufrufschema

list
  [ CLUSTER_NAME [, ... ] ]
  [ --group CITUS_GROUP ]
  [ { -e | --extended } ]
  [ { -t | --timestamp } ]
  [ { -f | --format } { pretty | tsv | json | yaml } ]
  [ { -W | { -w | --watch } TIME } ]

Beschreibung

patronictl list zeigt Informationen zum Patroni-Cluster und seinen Mitgliedern.

Die Ausgabe enthält folgende Informationen:

Cluster
Name des Patroni-Clusters.

Member
Name des Patroni-Mitglieds.

Host
Host, auf dem sich das Mitglied befindet.

Role
Aktuelle Rolle des Mitglieds.

Mögliche Werte sind:

  • Leader: der aktuelle Leader eines regulären Patroni-Clusters; oder
  • Standby Leader: der aktuelle Leader eines Patroni-Standby-Clusters; oder
  • Sync Standby: ein synchroner Standby eines Patroni-Clusters mit aktiviertem synchronem Modus; oder
  • Replica: ein regulärer Standby eines Patroni-Clusters.

State
Aktueller Zustand von Postgres im Patroni-Mitglied.

Einige Beispiele für mögliche Zustände:

  • running: wenn Postgres derzeit läuft;
  • streaming: bei einem Replikat, wenn Postgres derzeit WAL per Streaming vom Primärserver empfängt;
  • in archive recovery: bei einem Replikat, wenn Postgres derzeit WAL aus dem Archiv abruft;
  • stopped: wenn Postgres heruntergefahren wurde;
  • crashed: wenn Postgres abgestürzt ist.

TL
Aktuelle Postgres-Timeline im Patroni-Mitglied.

Receive LSN
Die letzte Write-Ahead-Log-Position, die das Mitglied per Streaming-Replikation empfangen und auf den Datenträger synchronisiert hat (pg_catalog.pg_last_(xlog|wal)_receive_(location|lsn)()).

Receive Lag
Replikationsrückstand zwischen der Position Receive LSN des Mitglieds und seiner Replikationsquelle in MB.

Replay LSN
Die letzte Write-Ahead-Log-Position, die bei der Recovery des Mitglieds wiedergegeben wurde (pg_catalog.pg_last_(xlog|wal)_replay_(location|lsn)()).

Replay Lag
Replikationsrückstand zwischen der Position Replay LSN des Mitglieds und seiner Replikationsquelle in MB.

Darüber hinaus kann die Ausgabe folgende Informationen enthalten:

System identifier
Postgres-Systemkennung.

Hinweis

Wird im Tabellenkopf angezeigt.

Wird nur beim Ausgabeformat pretty angezeigt.

Group
ID der Citus-Gruppe.

Hinweis

Wird im Tabellenkopf angezeigt.

Wird nur bei einem Citus-Cluster angezeigt.

Pending restart
* zeigt an, dass der Knoten einen Neustart benötigt, damit bestimmte Postgres-Konfigurationseinstellungen wirksam werden. Ein leerer Wert zeigt an, dass der Knoten keinen Neustart benötigt.

Hinweis

Wird als Attribut des Mitglieds angezeigt.

Wird angezeigt, wenn:

  • die Ausgabe im Format pretty oder tsv erfolgt und die erweiterte Ausgabe aktiviert ist; oder
  • der Knoten einen Neustart benötigt.

Scheduled restart
Zeitstempel des geplanten Neustarts der vom Patroni-Mitglied verwalteten Postgres-Instanz. Ein leerer Wert zeigt an, dass für das Mitglied kein Neustart geplant ist.

Hinweis

Wird als Attribut des Mitglieds angezeigt.

Wird angezeigt, wenn:

  • die Ausgabe im Format pretty oder tsv erfolgt und die erweiterte Ausgabe aktiviert ist; oder
  • für den Knoten ein Neustart geplant ist.

Tags
Enthält die für das Patroni-Mitglied gesetzten Tags. Ein leerer Wert zeigt an, dass entweder keine Tags konfiguriert wurden oder diese auf die Standardwerte gesetzt sind.

Hinweis

Wird als Attribut des Mitglieds angezeigt.

Wird angezeigt, wenn:

  • die Ausgabe im Format pretty oder tsv erfolgt und die erweiterte Ausgabe aktiviert ist; oder
  • der Knoten benutzerdefinierte Tags oder Standard-Tags mit abweichenden Werten hat.

Scheduled switchover
Zeitstempel des geplanten Switchovers für den Patroni-Cluster, sofern vorhanden.

Hinweis

Wird am Tabellenende angezeigt.

Wird nur angezeigt, wenn ein Switchover geplant ist und das Ausgabeformat pretty verwendet wird.

Maintenance mode

Ob die Cluster-Überwachung derzeit pausiert ist.

Hinweis

Wird am Tabellenende angezeigt.

Wird nur angezeigt, wenn der Cluster pausiert ist und das Ausgabeformat pretty verwendet wird.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--group
Informationen zu Mitgliedern der angegebenen Citus-Gruppe anzeigen.

CITUS_GROUP ist die ID der Citus-Gruppe.

-e / --extended
Erweiterte Informationen anzeigen.

Die Attribute Pending restart, Scheduled restart und Tags auch dann anzeigen, wenn ihr Wert leer ist.

Hinweis

Gilt nur für die Ausgabeformate pretty und tsv.

-t / --timestamp
Vor den Informationen zum Cluster und seinen Mitgliedern einen Zeitstempel ausgeben.

-f / --format
Formatierung der Liste der Clustermitglieder in der Ausgabe.

Das Format kann einen der folgenden Werte haben:

  • pretty: gibt die Clustermitglieder als formatierte Tabelle aus; oder
  • tsv: gibt die Clustermitglieder tabellarisch aus, mit durch \t getrennten Spalten; oder
  • json: gibt die Clustermitglieder im JSON-Format aus; oder
  • yaml: gibt die Clustermitglieder im YAML-Format aus.

Der Standardwert ist pretty.

-W
Informationen automatisch alle 2 Sekunden aktualisieren.

-w / --watch
Informationen automatisch im angegebenen Intervall aktualisieren.

TIME ist das Aktualisierungsintervall in Sekunden.

Beispiele

Informationen zum Cluster als formatierte Tabelle anzeigen:

$ patronictl -c postgres0.yml list batman
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  5 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+

Informationen zum Cluster als formatierte Tabelle mit erweiterten Spalten anzeigen:

$ patronictl -c postgres0.yml list batman -e
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+-----------------+------------------------+-------------------+------+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag | Pending restart | Pending restart reason | Scheduled restart | Tags |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+-----------------+------------------------+-------------------+------+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  5 |             |     |            |     |                 |                        |                   |      |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |                 |                        |                   |      |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |                 |                        |                   |      |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+-----------------+------------------------+-------------------+------+

Informationen zum Cluster im YAML-Format mit Ausführungszeitstempel anzeigen:

$ patronictl -c postgres0.yml list batman -f yaml -t
2023-09-12 13:30:48
- Cluster: batman
  Host: 127.0.0.1:5432
  Member: postgresql0
  Role: Leader
  State: running
  TL: 5
- Cluster: batman
  Host: 127.0.0.1:5433
  Receive LSN: 0/40004E8
  Receive Lag: 0
  Replay LSN: 0/40004E8
  Replay Lag: 0
  Member: postgresql1
  Role: Replica
  State: streaming
  TL: 5
- Cluster: batman
  Host: 127.0.0.1:5434
  Receive LSN: 0/40004E8
  Receive Lag: 0
  Replay LSN: 0/40004E8
  Replay Lag: 0
  Member: postgresql2
  Role: Replica
  State: streaming
  TL: 5

patronictl pause

Aufrufschema

pause
  [ CLUSTER_NAME ]
  [ --group CITUS_GROUP ]
  [ --wait ]

Beschreibung

patronictl pause versetzt den Patroni-Cluster vorübergehend in den Wartungsmodus und deaktiviert automatisches Failover.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--group
Die angegebene Citus-Gruppe pausieren.

CITUS_GROUP ist die ID der Citus-Gruppe.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration citus.group zu lesen, sofern sie vorhanden ist.

--wait
Warten, bis alle Patroni-Mitglieder pausiert sind, bevor die Kontrolle an den Aufrufer zurückgegeben wird.

Beispiele

Den Cluster in den Wartungsmodus versetzen und warten, bis alle Knoten pausiert sind:

$ patronictl -c postgres0.yml pause batman --wait
'pause' request sent, waiting until it is recognized by all nodes
Success: cluster management is paused

patronictl promote-cluster

Aufrufschema

promote-cluster
  [ CLUSTER_NAME ]
  [ --force ]

Beschreibung

patronictl promote-cluster wandelt einen Standby-Cluster in einen regulären Patroni-Cluster um.

Der Befehl entfernt den Abschnitt standby_cluster aus der dynamischen Konfiguration und wartet, bis der Leader als Primärserver läuft. Vor der Konfigurationsänderung gibt er die aktuelle Cluster-Topologie aus. Eine Bestätigung fordert er an, sofern --force nicht verwendet wird.

Parameter

CLUSTER_NAME: Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--force: Flag zum Überspringen der Bestätigungsabfragen beim Hochstufen des Clusters.

Nützlich für Skripte.

Beispiele

Den Standby-Cluster hochstufen, sodass er als regulärer Patroni-Cluster läuft:

$ patronictl -c postgres0.yml promote-cluster batman --force

patronictl query

Aufrufschema

query
  [ CLUSTER_NAME ]
  [ --group CITUS_GROUP ]
  [ { { -r | --role } { leader | primary | standby-leader | replica | standby | any } | { -m | --member } MEMBER_NAME } ]
  [ { -d | --dbname } DBNAME ]
  [ { -U | --username } USERNAME ]
  [ --password ]
  [ --format { pretty | tsv | json | yaml } ]
  [ { { -f | --file } FILE_NAME | { -c | --command } SQL_COMMAND } ]
  [ --delimiter ]
  [ { -W | { -w | --watch } TIME } ]

Beschreibung

patronictl query führt einen SQL-Befehl oder ein Skript auf einem Mitglied des Patroni-Clusters aus.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--group
Die angegebene Citus-Gruppe abfragen.

CITUS_GROUP ist die ID der Citus-Gruppe.

-r / --role
Ein Mitglied mit der angegebenen Rolle auswählen.

Die Rolle kann einen der folgenden Werte haben:

  • leader: der Leader eines regulären Patroni-Clusters oder eines Patroni-Standby-Clusters; oder
  • primary: der Leader eines regulären Patroni-Clusters; oder
  • standby-leader: der Leader eines Patroni-Standby-Clusters; oder
  • replica: ein Replikat eines Patroni-Clusters; oder
  • standby: entspricht replica; oder
  • any: beliebige Rolle. Entspricht dem Weglassen dieses Parameters.

-m / --member
Ein Mitglied mit dem angegebenen Namen auswählen.

MEMBER_NAME ist der Name des auszuwählenden Mitglieds.

-d / --dbname
Datenbank, zu der eine Verbindung hergestellt und auf der die Abfrage ausgeführt wird.

DBNAME ist der Name der Datenbank. Ohne Angabe wird USERNAME verwendet.

-U / --username
Benutzer für die Verbindung zur Datenbank.

USERNAME ist der Name des Benutzers. Ohne Angabe wird der Betriebssystembenutzer verwendet, der patronictl query ausführt.

--password
Das Passwort des Benutzers abfragen, der die Verbindung herstellt.

Da Patroni libpq verwendet, kann alternativ eine Datei ~/.pgpass erstellt oder die Umgebungsvariable PGPASSWORD gesetzt werden.

--format
Formatierung der Abfrageausgabe.

Das Format kann einen der folgenden Werte haben:

  • pretty: gibt das Abfrageergebnis als formatierte Tabelle aus; oder
  • tsv: gibt das Abfrageergebnis tabellarisch aus, mit durch \t getrennten Spalten; oder
  • json: gibt das Abfrageergebnis im JSON-Format aus; oder
  • yaml: gibt das Abfrageergebnis im YAML-Format aus.

Der Standardwert ist tsv.

-f / --file
Eine Datei als Quelle der auszuführenden Abfragebefehle verwenden.

FILE_NAME ist der Pfad zur Quelldatei.

-c / --command
Den angegebenen SQL-Befehl als Abfrage ausführen.

SQL_COMMAND ist der auszuführende SQL-Befehl.

--delimiter
Das Trennzeichen für die Ausgabe im Format tsv; ohne Angabe wird \t verwendet.

-W
Die Abfrage automatisch alle 2 Sekunden erneut ausführen.

-w / --watch
Die Abfrage automatisch im angegebenen Intervall erneut ausführen.

TIME ist das Intervall zwischen den Ausführungen in Sekunden.

Beispiele

Einen SQL-Befehl als Benutzer postgres ausführen und dessen Passwort abfragen:

$ patronictl -c postgres0.yml query batman -U postgres --password -c "SELECT now()"
Password:
now
2023-09-12 18:10:53.228084+00:00

Einen SQL-Befehl als Benutzer postgres ausführen und das Passwort aus der Umgebungsvariable von libpq beziehen:

$ PGPASSWORD=patroni patronictl -c postgres0.yml query batman -U postgres -c "SELECT now()"
now
2023-09-12 18:11:37.639500+00:00

Einen SQL-Befehl alle 2 Sekunden ausführen und das Ergebnis im Format pretty ausgeben:

$ patronictl -c postgres0.yml query batman -c "SELECT now()" --format pretty -W
+----------------------------------+
| now                              |
+----------------------------------+
| 2023-09-12 18:12:16.716235+00:00 |
+----------------------------------+
+----------------------------------+
| now                              |
+----------------------------------+
| 2023-09-12 18:12:18.732645+00:00 |
+----------------------------------+
+----------------------------------+
| now                              |
+----------------------------------+
| 2023-09-12 18:12:20.750573+00:00 |
+----------------------------------+

Einen SQL-Befehl auf der Datenbank test ausführen und das Ergebnis im YAML-Format ausgeben:

$ patronictl -c postgres0.yml query batman -d test -c "SELECT now() AS column_1, 'test' AS column_2" --format yaml
- column_1: 2023-09-12 18:14:22.052060+00:00
  column_2: test

Einen SQL-Befehl auf dem Mitglied postgresql2 ausführen:

$ patronictl -c postgres0.yml query batman -m postgresql2 -c "SHOW port"
port
5434

Einen SQL-Befehl auf einem beliebigen Standby ausführen:

$ patronictl -c postgres0.yml query batman -r replica -c "SHOW port"
port
5433

patronictl reinit

Aufrufschema

reinit
  CLUSTER_NAME
  [ MEMBER_NAME [, ... ] ]
  [ --group CITUS_GROUP ]
  [ --wait ]
  [ --force ]
  [ --from-leader ]

Beschreibung

patronictl reinit erstellt eine Postgres-Standby-Instanz neu, die von einem Replikatmitglied des Patroni-Clusters verwaltet wird.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

MEMBER_NAME
Name des Replikatmitglieds, dessen Postgres-Instanz neu erstellt werden soll.

Es können mehrere Replikatmitglieder angegeben werden. Ohne Angabe von Mitgliedern führt der Befehl keine Aktion aus.

--group
Ein Replikatmitglied der angegebenen Citus-Gruppe neu erstellen.

CITUS_GROUP ist die ID der Citus-Gruppe.

--wait
Warten, bis die Neuinitialisierung der Postgres-Standby-Knoten abgeschlossen ist.

--force
Flag zum Überspringen der Bestätigungsabfragen beim Neuerstellen von Postgres-Standby-Instanzen.

Nützlich für Skripte.

--from-leader
Flag zum direkten Beziehen des Basis-Backups vom Leader.

Beispiele

Das Neuerstellen aller Replikatmitglieder des Patroni-Clusters anfordern und die Kontrolle sofort an den Aufrufer zurückgeben:

$ patronictl -c postgres0.yml reinit batman postgresql1 postgresql2 --force
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  5 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
Success: reinitialize for member postgresql1
Success: reinitialize for member postgresql2

Das Neuerstellen von postgresql2 anfordern und auf den Abschluss warten:

$ patronictl -c postgres0.yml reinit batman postgresql2 --wait --force
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  5 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
Success: reinitialize for member postgresql2
Waiting for reinitialize to complete on: postgresql2
Reinitialize is completed on: postgresql2

Das Neuerstellen von postgresql2 anfordern und das Basis-Backup direkt vom Leader beziehen:

$ patronictl -c postgres0.yml reinit batman postgresql2 --from-leader
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  5 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
Success: reinitialize for member postgresql2

patronictl reload

Aufrufschema

reload
  CLUSTER_NAME
  [ MEMBER_NAME [, ... ] ]
  [ --group CITUS_GROUP ]
  [ { -r | --role } { leader | primary | standby-leader | replica | standby | any } ]
  [ --force ]

Beschreibung

patronictl reload fordert ein Neuladen der lokalen Konfiguration für ein oder mehrere Patroni-Mitglieder an.

Dabei wird auf der verwalteten Postgres-Instanz auch pg_ctl reload ausgelöst, selbst wenn sich nichts geändert hat.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

MEMBER_NAME
Das Neuladen der lokalen Konfiguration für die angegebenen Patroni-Mitglieder anfordern.

Es können mehrere Mitglieder angegeben werden. Ohne Angabe von Mitgliedern werden alle berücksichtigt.

--group
Ein Neuladen der Mitglieder der angegebenen Citus-Gruppe anfordern.

CITUS_GROUP ist die ID der Citus-Gruppe.

-r / --role
Mitglieder mit der angegebenen Rolle auswählen.

Die Rolle kann einen der folgenden Werte haben:

  • leader: der Leader eines regulären Patroni-Clusters oder eines Patroni-Standby-Clusters; oder
  • primary: der Leader eines regulären Patroni-Clusters; oder
  • standby-leader: der Leader eines Patroni-Standby-Clusters; oder
  • replica: ein Replikat eines Patroni-Clusters; oder
  • standby: entspricht replica; oder
  • any: beliebige Rolle. Entspricht dem Weglassen dieses Parameters.

--force
Flag zum Überspringen der Bestätigungsabfragen beim Anfordern eines Neuladens der lokalen Konfiguration.

Nützlich für Skripte.

Beispiele

Das Neuladen der lokalen Konfiguration aller Mitglieder des Patroni-Clusters anfordern:

$ patronictl -c postgres0.yml reload batman --force
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  5 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
Reload request received for member postgresql0 and will be processed within 10 seconds
Reload request received for member postgresql1 and will be processed within 10 seconds
Reload request received for member postgresql2 and will be processed within 10 seconds

patronictl remove

Aufrufschema

remove
  CLUSTER_NAME
  [ --group CITUS_GROUP ]
  [ { -f | --format } { pretty | tsv | json | yaml } ]

Beschreibung

patronictl remove entfernt die Informationen zum Cluster aus dem DCS.

Dies ist ein interaktiver Vorgang.

Warnung

Dieser Vorgang zerstört die Informationen zum Patroni-Cluster im DCS.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

--group
Die Informationen zum Patroni-Cluster entfernen, die zur angegebenen Citus-Gruppe gehören.

CITUS_GROUP ist die ID der Citus-Gruppe.

-f / --format
Formatierung der Mitgliederliste in der Ausgabe bei der Bestätigungsabfrage.

Das Format kann einen der folgenden Werte haben:

  • pretty: gibt die Mitglieder als formatierte Tabelle aus; oder
  • tsv: gibt die Mitglieder tabellarisch aus, mit durch \t getrennten Spalten; oder
  • json: gibt die Mitglieder im JSON-Format aus; oder
  • yaml: gibt die Mitglieder im YAML-Format aus.

Der Standardwert ist pretty.

Beispiele

Informationen zum Patroni-Cluster batman aus dem DCS entfernen:

$ patronictl -c postgres0.yml remove batman
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  5 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  5 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
Please confirm the cluster name to remove: batman
You are about to remove all information in DCS for batman, please type: "Yes I am aware": Yes I am aware
This cluster currently is healthy. Please specify the leader name to continue: postgresql0

patronictl restart

Aufrufschema

restart
  CLUSTER_NAME
  [ MEMBER_NAME [, ...] ]
  [ --group CITUS_GROUP ]
  [ { -r | --role } { leader | primary | standby-leader | replica | standby | any } ]
  [ --any ]
  [ --pg-version PG_VERSION ]
  [ --pending ]
  [ --timeout TIMEOUT ]
  [ --scheduled TIMESTAMP ]
  [ --force ]

Beschreibung

patronictl restart fordert einen Neustart der Postgres-Instanz an, die von einem Mitglied des Patroni-Clusters verwaltet wird.

Der Neustart kann sofort ausgeführt oder für später geplant werden.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

--group
Den zur angegebenen Citus-Gruppe gehörenden Patroni-Cluster neu starten.

CITUS_GROUP ist die ID der Citus-Gruppe.

-r / --role
Mitglieder mit der angegebenen Rolle auswählen.

Die Rolle kann einen der folgenden Werte haben:

  • leader: der Leader eines regulären Patroni-Clusters oder eines Patroni-Standby-Clusters; oder
  • primary: der Leader eines regulären Patroni-Clusters; oder
  • standby-leader: der Leader eines Patroni-Standby-Clusters; oder
  • replica: ein Replikat eines Patroni-Clusters; oder
  • standby: entspricht replica; oder
  • any: beliebige Rolle. Entspricht dem Weglassen dieses Parameters.

--any
Einen einzelnen, zufällig ausgewählten Knoten aus denjenigen neu starten, die den angegebenen Filtern entsprechen.

--pg-version
Nur Mitglieder auswählen, deren verwaltete Postgres-Instanz eine ältere als die angegebene Version hat.

PG_VERSION ist die zum Vergleich herangezogene Postgres-Version.

--pending
Nur Mitglieder auswählen, die als Pending restart markiert sind.

--timeout: Den Neustart abbrechen, wenn er länger als die angegebene Wartezeit dauert, und ein Failover zu einem Replikat durchführen, wenn das Problem auf dem Primärserver auftritt.

TIMEOUT ist die Wartezeit in Sekunden, bevor der Neustart abgebrochen wird.

--scheduled
Einen Neustart zum angegebenen Zeitpunkt planen.

TIMESTAMP ist der Zeitstempel, zu dem der Neustart erfolgen soll. Er ist in einem eindeutigen Format anzugeben, vorzugsweise mit Zeitzone. Mit dem Literal now kann der Neustart auch sofort ausgeführt werden.

--force
Flag zum Überspringen der Bestätigungsabfragen beim Anfordern von Neustarts.

Nützlich für Skripte.

Beispiele

Alle Mitglieder des Clusters sofort neu starten:

$ patronictl -c postgres0.yml restart batman --force
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  6 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  6 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  6 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
Success: restart on member postgresql0
Success: restart on member postgresql1
Success: restart on member postgresql2

Ein zufällig ausgewähltes Mitglied des Clusters sofort neu starten:

$ patronictl -c postgres0.yml restart batman --any --force
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  6 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  6 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  6 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
Success: restart on member postgresql1

Einen Neustart für 2023-09-13T18:00-03:00 planen:

$ patronictl -c postgres0.yml restart batman --scheduled 2023-09-13T18:00-03:00 --force
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  6 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  6 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  6 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
Success: restart scheduled on member postgresql0
Success: restart scheduled on member postgresql1
Success: restart scheduled on member postgresql2

patronictl resume

Aufrufschema

resume
  [ CLUSTER_NAME ]
  [ --group CITUS_GROUP ]
  [ --wait ]

Beschreibung

patronictl resume beendet den Wartungsmodus des Patroni-Clusters und aktiviert automatisches Failover wieder.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--group
Den Betrieb der angegebenen Citus-Gruppe fortsetzen.

CITUS_GROUP ist die ID der Citus-Gruppe.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration citus.group zu lesen, sofern sie vorhanden ist.

--wait
Warten, bis die Pause für alle Patroni-Mitglieder aufgehoben ist, bevor die Kontrolle an den Aufrufer zurückgegeben wird.

Beispiele

Den Wartungsmodus des Clusters beenden:

$ patronictl -c postgres0.yml resume batman --wait
'resume' request sent, waiting until it is recognized by all nodes
Success: cluster management is resumed

patronictl show-config

Aufrufschema

show-config
  [ CLUSTER_NAME ]
  [ --group CITUS_GROUP ]

Beschreibung

patronictl show-config zeigt die im DCS gespeicherte dynamische Konfiguration des Clusters.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--group
Die dynamische Konfiguration der angegebenen Citus-Gruppe anzeigen.

CITUS_GROUP ist die ID der Citus-Gruppe.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration citus.group zu lesen, sofern sie vorhanden ist.

Beispiele

Die dynamische Konfiguration des Clusters batman anzeigen:

$ patronictl -c postgres0.yml show-config batman
loop_wait: 10
postgresql:
  parameters:
    max_connections: 250
  pg_hba:
  - host replication replicator 127.0.0.1/32 md5
  - host all all 0.0.0.0/0 md5
  use_pg_rewind: true
retry_timeout: 10
ttl: 30

patronictl switchover

Aufrufschema

switchover
  [ CLUSTER_NAME ]
  [ --group CITUS_GROUP ]
  [ { --leader | --primary } LEADER_NAME ]
  --candidate CANDIDATE_NAME
  [ --force ]

Beschreibung

patronictl switchover führt einen Switchover im Cluster durch.

Der Befehl ist für funktionsfähige Cluster vorgesehen, z. B. wenn:

  • ein Leader vorhanden ist;
  • in einem synchronen Cluster synchrone Standbys verfügbar sind.
Hinweis

Bei einem nicht funktionsfähigen Cluster kommt stattdessen möglicherweise patronictl failover infrage.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--group
Einen Switchover in der angegebenen Citus-Gruppe durchführen.

CITUS_GROUP ist die ID der Citus-Gruppe.

--leader / --primary
Den Leader angeben, der beim Switchover herabgestuft werden soll.

LEADER_NAME sollte mit dem Namen des aktuellen Leaders im Cluster übereinstimmen.

--candidate
Der Knoten, der beim Switchover hochgestuft werden und die Rolle des Primärservers übernehmen soll.

CANDIDATE_NAME ist der Name des hochzustufenden Knotens.

--scheduled
Einen Switchover zum angegebenen Zeitpunkt planen.

TIMESTAMP ist der Zeitstempel, zu dem der Switchover erfolgen soll. Er ist in einem eindeutigen Format anzugeben, vorzugsweise mit Zeitzone. Mit dem Literal now kann der Switchover auch sofort ausgeführt werden.

--force
Flag zum Überspringen der Bestätigungsabfragen bei der Durchführung des Switchovers.

Nützlich für Skripte.

Beispiele

Einen Switchover zum Knoten postgresql2 durchführen:

$ patronictl -c postgres0.yml switchover batman --leader postgresql0 --candidate postgresql2 --force
Current cluster topology
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  6 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  6 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  6 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
2023-09-13 14:15:23.07497 Successfully switched over to "postgresql2"
+ Cluster: batman (7277694203142172922) -+---------+----+-------------+---------+------------+---------+
| Member      | Host           | Role    | State   | TL | Receive LSN |     Lag | Replay LSN |     Lag |
+-------------+----------------+---------+---------+----+-------------+---------+------------+---------+
| postgresql0 | 127.0.0.1:5432 | Replica | stopped |    |     unknown | unknown |    unknown | unknown |
| postgresql1 | 127.0.0.1:5433 | Replica | running |  6 |   0/4000188 |       0 |  0/4000188 |       0 |
| postgresql2 | 127.0.0.1:5434 | Leader  | running |  6 |             |         |            |         |
+-------------+----------------+---------+---------+----+-------------+---------+------------+---------+

Einen Switchover zwischen postgresql0 und postgresql2 für 2023-09-13T18:00:00-03:00 planen:

$ patronictl -c postgres0.yml switchover batman --leader postgresql0 --candidate postgresql2 --scheduled 2023-09-13T18:00-03:00 --force
Current cluster topology
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  8 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  8 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  8 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
2023-09-13 14:18:11.20661 Switchover scheduled
+ Cluster: batman (7277694203142172922) -+-----------+----+-------------+-----+------------+-----+
| Member      | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0 | 127.0.0.1:5432 | Leader  | running   |  8 |             |     |            |     |
| postgresql1 | 127.0.0.1:5433 | Replica | streaming |  8 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| postgresql2 | 127.0.0.1:5434 | Replica | streaming |  8 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+-------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
Switchover scheduled at: 2023-09-13T18:00:00-03:00
                    from: postgresql0
                    to: postgresql2

patronictl topology

Aufrufschema

topology
  [ CLUSTER_NAME [, ... ] ]
  [ --group CITUS_GROUP ]
  [ { -W | { -w | --watch } TIME } ]

Beschreibung

patronictl topology zeigt Informationen zum Patroni-Cluster und seinen Mitgliedern als Baumansicht.

Die Ausgabe enthält folgende Informationen:

Cluster
Name des Patroni-Clusters.

Hinweis

Wird im Tabellenkopf angezeigt.

System identifier
Postgres-Systemkennung.

Hinweis

Wird im Tabellenkopf angezeigt.

Member
Name des Patroni-Mitglieds.

Hinweis

Diese Spalte zeigt die Mitglieder als Baumansicht ihrer Replikationsverbindungen.

Host
Host, auf dem sich das Mitglied befindet.

Role
Aktuelle Rolle des Mitglieds.

Mögliche Werte sind:

  • Leader: der aktuelle Leader eines regulären Patroni-Clusters; oder
  • Standby Leader: der aktuelle Leader eines Patroni-Standby-Clusters; oder
  • Sync Standby: ein synchroner Standby eines Patroni-Clusters mit aktiviertem synchronem Modus; oder
  • Replica: ein regulärer Standby eines Patroni-Clusters.

State
Aktueller Zustand von Postgres im Patroni-Mitglied.

Einige Beispiele für mögliche Zustände:

  • running: wenn Postgres derzeit läuft;
  • streaming: bei einem Replikat, wenn Postgres derzeit WAL per Streaming vom Primärserver empfängt;
  • in archive recovery: bei einem Replikat, wenn Postgres derzeit WAL aus dem Archiv abruft;
  • stopped: wenn Postgres heruntergefahren wurde;
  • crashed: wenn Postgres abgestürzt ist.

TL
Aktuelle Postgres-Timeline im Patroni-Mitglied.

Receive LSN
Die letzte Write-Ahead-Log-Position, die das Mitglied per Streaming-Replikation empfangen und auf den Datenträger synchronisiert hat (pg_catalog.pg_last_(xlog|wal)_receive_(location|lsn)()).

Receive Lag
Replikationsrückstand zwischen der Position Receive LSN des Mitglieds und seiner Replikationsquelle in MB.

Replay LSN
Die letzte Write-Ahead-Log-Position, die bei der Recovery des Mitglieds wiedergegeben wurde (pg_catalog.pg_last_(xlog|wal)_replay_(location|lsn)()).

Replay Lag
Replikationsrückstand zwischen der Position Replay LSN des Mitglieds und seiner Replikationsquelle in MB.

Darüber hinaus kann die Ausgabe folgende Informationen enthalten:

Group
ID der Citus-Gruppe.

Hinweis

Wird im Tabellenkopf angezeigt.

Wird nur bei einem Citus-Cluster angezeigt.

Pending restart
* zeigt an, dass der Knoten einen Neustart benötigt, damit bestimmte Postgres-Konfigurationseinstellungen wirksam werden. Ein leerer Wert zeigt an, dass der Knoten keinen Neustart benötigt.

Hinweis

Wird als Attribut des Mitglieds angezeigt.

Wird angezeigt, wenn der Knoten einen Neustart benötigt.

Scheduled restart
Zeitstempel des geplanten Neustarts der vom Patroni-Mitglied verwalteten Postgres-Instanz. Ein leerer Wert zeigt an, dass für das Mitglied kein Neustart geplant ist.

Hinweis

Wird als Attribut des Mitglieds angezeigt.

Wird angezeigt, wenn für den Knoten ein Neustart geplant ist.

Tags
Enthält die für das Patroni-Mitglied gesetzten Tags. Ein leerer Wert zeigt an, dass entweder keine Tags konfiguriert wurden oder diese auf die Standardwerte gesetzt sind.

Hinweis

Wird als Attribut des Mitglieds angezeigt.

Wird angezeigt, wenn der Knoten benutzerdefinierte Tags oder Standard-Tags mit abweichenden Werten hat.

Scheduled switchover
Zeitstempel des geplanten Switchovers für den Patroni-Cluster, sofern vorhanden.

Hinweis

Wird am Tabellenende angezeigt.

Wird nur angezeigt, wenn ein Switchover geplant ist.

Maintenance mode

Ob die Cluster-Überwachung derzeit pausiert ist.

Hinweis

Wird am Tabellenende angezeigt.

Wird nur angezeigt, wenn der Cluster pausiert ist.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

Falls nicht angegeben, versucht patronictl , den Wert aus der Konfiguration scope zu lesen, sofern sie vorhanden ist.

--group
Informationen zu Mitgliedern der angegebenen Citus-Gruppe anzeigen.

CITUS_GROUP ist die ID der Citus-Gruppe.

-W
Informationen automatisch alle 2 Sekunden aktualisieren.

-w / --watch
Informationen automatisch im angegebenen Intervall aktualisieren.

TIME ist das Aktualisierungsintervall in Sekunden.

Beispiele

Die Topologie des Clusters batman anzeigen – postgresql1 und postgresql2 replizieren von postgresql0:

$ patronictl -c postgres0.yml topology batman
+ Cluster: batman (7277694203142172922) ---+-----------+----+-------------+-----+------------+-----+
| Member        | Host           | Role    | State     | TL | Receive LSN | Lag | Replay LSN | Lag |
+---------------+----------------+---------+-----------+----+-------------+-----+------------+-----+
| postgresql0   | 127.0.0.1:5432 | Leader  | running   |  8 |             |     |            |     |
| + postgresql1 | 127.0.0.1:5433 | Replica | streaming |  8 |   0/40004E8 |   0 |  0/40004E8 |   0 |
| + postgresql2 | 127.0.0.1:5434 | Replica | streaming |  8 |   0/40004E8 |   0 |  0/40004E8 |   0 |
+---------------+----------------+---------+-----------+----+-------------+-----+------------+-----+

patronictl version

Aufrufschema

version
  [ CLUSTER_NAME [, ... ] ]
  [ MEMBER_NAME [, ... ] ]
  [ --group CITUS_GROUP ]

Beschreibung

patronictl version ermittelt die Version der Anwendung patronictl . Zusätzlich kann die Ausgabe Versionsinformationen zu Patroni-Clustern und ihren Mitgliedern enthalten.

Parameter

CLUSTER_NAME
Name des Patroni-Clusters.

MEMBER_NAME
Name des Mitglieds des Patroni-Clusters.

--group
Einen Patroni-Cluster mit der angegebenen Citus-Gruppe berücksichtigen.

CITUS_GROUP ist die ID der Citus-Gruppe.

Beispiele

Nur die Version von patronictl abrufen:

$ patronictl -c postgres0.yml version
patronictl version 4.0.0

Die Version von patronictl und aller Mitglieder des Clusters batman abrufen:

$ patronictl -c postgres0.yml version batman
patronictl version 4.0.0

postgresql0: Patroni 4.0.0 PostgreSQL 16.4
postgresql1: Patroni 4.0.0 PostgreSQL 16.4
postgresql2: Patroni 4.0.0 PostgreSQL 16.4

Die Version von patronictl und der Mitglieder postgresql1 und postgresql2 des Clusters batman abrufen:

$ patronictl -c postgres0.yml version batman postgresql1 postgresql2
patronictl version 4.0.0

postgresql1: Patroni 4.0.0 PostgreSQL 16.4
postgresql2: Patroni 4.0.0 PostgreSQL 16.4

6 - Replikaterstellung und Cluster-Initialisierung

Replikaterstellung, Cluster-Initialisierung und benutzerdefinierte Erstellungsverfahren.

Patroni ermöglicht es, die Erstellung neuer Replikate anzupassen. Ebenso lässt sich festlegen, wie ein neuer, leerer Cluster initialisiert wird. Die beiden Vorgänge sind klar voneinander getrennt: Patroni erstellt Replikate nur dann, wenn der Schlüssel initialize für den Cluster im DCS vorhanden ist. Fehlt der Schlüssel initialize, führt Patroni die Cluster-Initialisierung ausschließlich auf dem ersten Knoten aus, der die Sperre für diesen Schlüssel erlangt.


Cluster-Initialisierung

PostgreSQL stellt den Befehl initdb zum Initialisieren eines neuen Clusters bereit; Patroni ruft ihn standardmäßig auf. In bestimmten Fällen, insbesondere beim Erstellen eines neuen Clusters als Kopie eines bestehenden, muss die eingebaute Methode durch eigene Aktionen ersetzt werden. Patroni kann benutzerdefinierte Skripte zur Cluster-Initialisierung ausführen und ihnen die erforderlichen Argumente wie Clustername und Pfad zum Datenverzeichnis übergeben. Dies wird im Abschnitt bootstrap der Patroni-Konfiguration festgelegt. Beispiel:

bootstrap:
    method: <custom_bootstrap_method_name>
    <custom_bootstrap_method_name>:
        command: <path_to_custom_bootstrap_script> [param1 [, ...]]
        keep_existing_recovery_conf: False
        no_params: False
        recovery_conf:
            recovery_target_action: promote
            recovery_target_timeline: latest
            restore_command: <method_specific_restore_command>

Jede benutzerdefinierte Initialisierungsmethode muss über die Einstellung method benannt werden und im gleichnamigen Abschnitt einen command definieren. Die spezielle Methode initdb aktiviert das Standardverhalten; in diesem Fall kann der Parameter method vollständig entfallen. Für command kann ein absoluter Pfad, ein Pfad relativ zum Arbeitsverzeichnis von Patroni oder ein in PATH verfügbarer Befehlsname angegeben werden. Zusätzlich zu den festen Parametern aus den Konfigurationsdateien übergibt Patroni zwei clusterspezifische Parameter:

--scope
Name des zu initialisierenden Clusters

--datadir
Pfad zum Datenverzeichnis der zu initialisierenden Clusterinstanz

Die Übergabe dieser beiden zusätzlichen Optionen lässt sich deaktivieren, indem der spezielle Parameter no_params auf True gesetzt wird.

Gibt das Initialisierungsskript 0 zurück, versucht Patroni, die damit erstellte PostgreSQL-Instanz zu konfigurieren und zu starten. Schlägt ein Zwischenschritt fehl oder gibt das Skript einen Wert ungleich null zurück, betrachtet Patroni die Initialisierung als fehlgeschlagen, räumt auf und gibt die initialize-Sperre frei, damit ein anderer Knoten die Initialisierung versuchen kann.

Ist im selben Abschnitt wie die benutzerdefinierte Initialisierungsmethode ein Block recovery_conf definiert, erzeugt Patroni vor dem Start der neu initialisierten Instanz eine recovery.conf (oder setzt bei PostgreSQL >= 12 die Recovery-Einstellungen in der Postgres-Konfiguration). Eine solche Recovery-Konfiguration sollte üblicherweise mindestens einen Parameter recovery_target_* enthalten und recovery_target_action auf promote setzen.

Ist keep_existing_recovery_conf definiert und auf True gesetzt, entfernt Patroni eine vorhandene Datei recovery.conf nicht (PostgreSQL <= 11). Ebenso entfernt Patroni in diesem Fall weder eine vorhandene recovery.signal noch eine standby.signal und überschreibt auch die konfigurierten Recovery-Einstellungen nicht (PostgreSQL >= 12). Dies ist bei der Initialisierung aus einem Backup mit Werkzeugen wie pgBackRest nützlich, die selbst die passende Recovery-Konfiguration erzeugen.

Alle weiteren Schlüssel-Wert-Paare in der Konfiguration der benutzerdefinierten Initialisierungsmethode werden außerdem als Argumente im Format --name=value an command übergeben. Beispiel:

bootstrap:
    method: <custom_bootstrap_method_name>
    <custom_bootstrap_method_name>:
        command: <path_to_custom_bootstrap_script>
        arg1: value1
        arg2: value2

Dadurch wird der konfigurierte command zusätzlich mit den Befehlszeilenargumenten --arg1=value1 --arg2=value2 aufgerufen.

Hinweis

Initialisierungsmethoden werden weder verkettet, noch wird bei einem Fehlschlag der gewählten Methode auf die Standardmethode zurückgegriffen.

Ein neuer Patroni-Cluster lässt sich beispielsweise mit folgender Konfiguration aus einem Barman-Backup initialisieren:

bootstrap:
    method: barman
    barman:
        keep_existing_recovery_conf: true
        command: patroni_barman --api-url https://barman-host:7480 recover
        barman-server: my_server
        ssh-command: ssh postgres@patroni-host
Hinweis

patroni_barman recover setzt voraus, dass auf dem Barman-Host sowohl Barman als auch pg-backup-api konfiguriert sind, damit barman recover über die Backup-API aus der Ferne ausgeführt werden kann. Das obige Beispiel verwendet nur einen Teil der verfügbaren Parameter. Weitere Informationen liefert patroni_barman recover --help.


Replikate erstellen

Patroni verwendet das bewährte pg_basebackup, um neue Replikate zu erstellen. Dafür ist eine laufende PostgreSQL-Quellinstanz erforderlich; eine eingebaute Bereinigung veralteter Backup-Dateien ist nicht vorhanden. Manche Anwender bevorzugen andere Backup-Lösungen wie WAL-E, pgBackRest, Barman oder eigene Skripte. Um all diese Fälle abzudecken, unterstützt Patroni benutzerdefinierte Skripte zum Klonen eines neuen Replikats. Sie werden im Konfigurationsblock postgresql eingerichtet:

postgresql:
    create_replica_methods:
        - <method name>
    <method name>:
        command: <command name>
        keep_data: True
        no_params: True
        no_leader: 1

Beispiel: wal_e

postgresql:
    create_replica_methods:
        - wal_e
        - basebackup
    wal_e:
        command: patroni_wale_restore
        no_leader: 1
        envdir: '{{WALE_ENV_DIR}}'
        use_iam: 1
    basebackup:
        max-rate: '100M'

Beispiel: pgbackrest

postgresql:
    create_replica_methods:
        - pgbackrest
        - basebackup
    pgbackrest:
        command: /usr/bin/pgbackrest --stanza=<scope> --delta restore
        keep_data: True
        no_params: True
    basebackup:
        max-rate: '100M'

Beispiel: Barman

postgresql:
    create_replica_methods:
        - barman
        - basebackup
    barman:
        command: patroni_barman --api-url https://barman-host:7480 recover
        barman-server: my_server
        ssh-command: ssh postgres@patroni-host
    basebackup:
        max-rate: '100M'
Hinweis

patroni_barman recover setzt voraus, dass auf dem Barman-Host sowohl Barman als auch pg-backup-api konfiguriert sind, damit barman recover über die Backup-API aus der Ferne ausgeführt werden kann. Das obige Beispiel verwendet nur einen Teil der verfügbaren Parameter. Weitere Informationen liefert patroni_barman recover --help.

create_replica_methods legt die verfügbaren Methoden zur Replikaterstellung und ihre Ausführungsreihenfolge fest. Patroni beendet die Versuche bei der ersten Methode, die 0 zurückgibt. Für jede Methode sollte ein eigener Abschnitt in der Konfigurationsdatei den auszuführenden Befehl und alle zu übergebenden benutzerdefinierten Parameter aufführen. Sämtliche Parameter werden im Format --name=value übergeben. Zusätzlich zu den benutzerdefinierten Parametern übergibt Patroni einige clusterspezifische:

--scope
Cluster, zu dem dieses Replikat gehört

--datadir
Pfad zum Datenverzeichnis des Replikats

--role
Immer ‘replica’

--connstring
Verbindungszeichenfolge zum Clustermitglied, von dem geklont werden soll (Primärserver oder anderes Replikat). Der Benutzer in der Verbindungszeichenfolge kann SQL-Befehle und Befehle des Replikationsprotokolls ausführen.

Ist der spezielle Parameter no_leader aktiviert, darf Patroni die Methode zur Replikaterstellung auch dann aufrufen, wenn weder ein Leader noch Replikate laufen. In diesem Fall wird eine leere Verbindungszeichenfolge übergeben. Dies ist nützlich, um einen zuvor laufenden Cluster aus einem Binärbackup wiederherzustellen.

Ist der spezielle Parameter keep_data aktiviert, leert Patroni das PGDATA-Verzeichnis vor dem Aufruf der Wiederherstellung nicht.

Ist der spezielle Parameter no_params aktiviert, werden dem benutzerdefinierten Befehl keine clusterspezifischen Parameter automatisch hinzugefügt. Benutzerdefinierte Parameter werden weiterhin übergeben.

Die Methode basebackup ist ein Sonderfall: Sie wird verwendet, wenn create_replica_methods leer ist, kann aber auch ausdrücklich in create_replica_methods aufgeführt werden. Diese Methode initialisiert ein neues Replikat mit pg_basebackup. Das Basisbackup wird vom Leader bezogen, es sei denn, es gibt Replikate mit dem Tag clonefrom; dann dient eines dieser Replikate als Quelle für pg_basebackup. Die Methode funktioniert ohne Konfiguration, es kann jedoch ein Konfigurationsabschnitt basebackup angegeben werden. Es gelten dieselben Regeln wie für die Konfiguration anderer Methoden: Dort sollten nur lange Optionen (mit –) angegeben werden. Patroni akzeptiert weder das Überschreiben der Verbindungseinstellungen noch Optionen für Backups im tar-Format oder mit clientseitiger Komprimierung. Ab PostgreSQL 15 wird serverseitige Komprimierung mit compress: server-gzip oder compress: server-zstd unterstützt. Patroni filtert von ihm selbst gesteuerte Optionen und andere Komprimierungseinstellungen als serverseitige Komprimierung heraus, führt aber keine vollständige Validierung aller Optionsnamen und -werte durch. Werden symbolische Links für das WAL-Verzeichnis verwendet, muss der Benutzer außerdem den richtigen Pfad für --waldir als Option angeben, damit der symbolische Link nach dem Aufbau oder der Neuinitialisierung des Replikats erhalten bleibt. Diese Option wird allerdings erst seit v10 unterstützt.

Die basebackup-Parameter können entweder als Zuordnung (Schlüssel-Wert-Paare) oder als Liste angegeben werden. Jedes Listenelement kann ein Schlüssel-Wert-Paar oder ein einzelner Schlüssel sein (für Optionen ohne Wert, etwa --verbose). Die folgenden 2 Beispiele zeigen beide Formen:

postgresql:
    basebackup:
        max-rate: '100M'
        checkpoint: 'fast'

und

postgresql:
    basebackup:
        - verbose
        - max-rate: '100M'
        - waldir: /pg-wal-mount/external-waldir

Schlagen alle Methoden zur Replikaterstellung fehl, versucht Patroni im nächsten Durchlauf der Ereignisschleife erneut alle Methoden der Reihe nach.

7 - Replikationsmodi

Von Patroni verwaltete asynchrone und synchrone Replikationsmodi.

Patroni verwendet die Streaming-Replikation von PostgreSQL. Weitere Informationen dazu stehen in der Postgres-Dokumentation . Standardmäßig konfiguriert Patroni PostgreSQL für asynchrone Replikation. Die Wahl des Replikationsverfahrens hängt von den geschäftlichen Anforderungen ab. Sowohl asynchrone als auch synchrone Replikation sowie andere HA-Lösungen sollten geprüft werden, um die passende Lösung zu bestimmen.


Dauerhaftigkeit im asynchronen Modus

Im asynchronen Modus darf der Cluster einige bereits festgeschriebene Transaktionen verlieren, um die Verfügbarkeit zu gewährleisten. Fällt der Primärserver aus oder wird er aus einem anderen Grund unerreichbar, stuft Patroni automatisch einen hinreichend funktionsfähigen Standby zum Primärserver hoch. Alle Transaktionen, die noch nicht auf diesen Standby repliziert wurden, verbleiben auf dem bisherigen Primärserver in einer „abgezweigten Zeitleiste“ und sind praktisch nicht wiederherstellbar1.

Die Menge der potenziell verlorenen Transaktionen wird durch den Parameter maximum_lag_on_failover gesteuert. Da die Position im Transaktionsprotokoll des Primärservers nicht in Echtzeit erfasst wird, ist der tatsächliche Datenverlust bei einem Failover im schlimmsten Fall auf maximum_lag_on_failover Bytes des Transaktionsprotokolls zuzüglich der in den letzten ttl Sekunden geschriebenen Daten begrenzt (im Durchschnitt loop_wait/2 Sekunden). Im normalen, stabilen Betrieb liegt die Replikationsverzögerung jedoch typischerweise deutlich unter einer Sekunde.

Standardmäßig berücksichtigt Patroni bei Leader-Wahlen nicht die aktuelle Zeitleiste der Replikate, was in manchen Fällen unerwünscht sein kann. Wird check_timeline auf true gesetzt, kann ein Knoten mit einer älteren Zeitleiste als der zuletzt bekannten Cluster-Zeitleiste oder mit einer nicht bestimmbaren Zeitleiste nicht neuer Leader werden.


Synchrone Replikation von PostgreSQL

Die synchrone Replikation von Postgres kann mit Patroni verwendet werden. Sie gewährleistet die Konsistenz im Cluster, indem sie bestätigt, dass Schreibvorgänge auf einem Sekundärserver gespeichert wurden, bevor dem verbundenen Client Erfolg gemeldet wird. Der Preis dafür sind höhere Latenzen und ein geringerer Schreibdurchsatz. Dieser Durchsatz wird von der Netzwerkleistung beeinflusst.

In gehosteten Rechenzentrumsumgebungen (wie AWS, Rackspace oder jedem Netzwerk außerhalb der eigenen Kontrolle) erhöht synchrone Replikation die Schwankungen der Schreibleistung erheblich. Kann der Leader seine Follower nicht mehr erreichen, wird er faktisch schreibgeschützt.

Für einen einfachen Test der synchronen Replikation folgende Zeilen zum Abschnitt parameters der YAML-Konfigurationsdateien hinzufügen:

synchronous_commit: "on"
synchronous_standby_names: "*"

Bei synchroner PostgreSQL-Replikation mindestens drei Postgres-Datenknoten verwenden, um die Schreibverfügbarkeit beim Ausfall eines Hosts zu gewährleisten.

Synchrone PostgreSQL-Replikation garantiert nicht unter allen Umständen, dass keine Transaktionen verloren gehen. Fallen der Primärserver und der derzeit als synchrones Replikat dienende Sekundärserver gleichzeitig aus, wird ein dritter Knoten hochgestuft, der möglicherweise nicht alle Transaktionen enthält.


Synchroner Modus

Darf eine Anwendung keine festgeschriebenen Transaktionen verlieren, kann der synchronous_mode von Patroni aktiviert werden. Bei aktiviertem synchronous_mode stuft Patroni einen Standby nur dann hoch, wenn sicher ist, dass er alle Transaktionen enthält, deren erfolgreiches Festschreiben dem Client möglicherweise bereits bestätigt wurde2. Das bedeutet, dass das System für Schreibzugriffe unverfügbar sein kann, obwohl einige Server erreichbar sind. Systemadministratoren können weiterhin manuelle Failover-Befehle verwenden, um einen Standby hochzustufen, auch wenn dadurch Transaktionen verloren gehen.

Das Aktivieren von synchronous_mode garantiert nicht unter allen Umständen, dass Commits auf mehreren Knoten dauerhaft gespeichert werden. Ist kein geeigneter Standby verfügbar, nimmt der Primärserver weiterhin Schreibvorgänge an, garantiert aber deren Replikation nicht. Fällt der Primärserver in diesem Modus aus, wird kein Standby hochgestuft. Sobald der bisherige Primärhost zurückkehrt, wird er automatisch hochgestuft, sofern kein Systemadministrator ein manuelles Failover durchgeführt hat. Durch dieses Verhalten ist der synchrone Modus auch für Cluster mit 2 Knoten geeignet.

Ist synchronous_mode aktiviert, der strikte Modus deaktiviert und stürzt der einzige synchrone Standby ab, blockieren Commits, bis der nächste Patroni-Durchlauf den Primärserver in den Einzelbetrieb versetzt (Schreibverzögerung im schlimmsten Fall ttl Sekunden, im Durchschnitt loop_wait/2 Sekunden). Ein manuelles Herunterfahren oder Neustarten eines Standbys unterbricht die Commit-Verarbeitung nicht. Vor dem Herunterfahren von PostgreSQL signalisiert der Standby dem Primärserver, ihn von seiner Aufgabe als synchroner Standby zu entbinden.

Muss unbedingt gewährleistet sein, dass jeder Schreibvorgang auf mindestens zwei Knoten dauerhaft gespeichert wird, zusätzlich zu synchronous_mode die Option synchronous_mode_strict aktivieren. Dieser Parameter verhindert, dass Patroni die synchrone Replikation auf dem Primärserver deaktiviert, wenn keine Kandidaten für einen synchronen Standby verfügbar sind. Synchrone Commits blockieren, bis ein synchrones Replikat verfügbar ist; Transaktionen mit den synchronous_commit-Werten off oder local umgehen diese Wartezeit.

Im prioritätsbasierten synchronen Modus (synchronous_mode: on) setzt Patroni 4.1.5 bei aktiviertem striktem Modus synchronous_standby_names auf *, wenn kein geeigneter synchroner Standby verfügbar ist, und gibt die Warnung "No standbys available!" aus. Commits warten dadurch weiterhin auf einen synchronen Standby. Der Platzhalter beschränkt Bestätigungen nicht auf die zuvor in /sync gespeicherten Mitgliedsnamen.

Ist das Tag nosync auf true gesetzt, schließt Patroni den Standby von seiner Auswahl synchroner Standbys aus. Dies wird für Standbys mit langsamer Netzwerkverbindung empfohlen, die als synchrone Standbys die Leistung beeinträchtigen würden. Das Tag nostream auf true zu setzen, hat dieselbe Wirkung.

Der synchrone Modus lässt sich mit patronictl edit-config oder über die REST-Schnittstelle von Patroni ein- und ausschalten. Eine Anleitung steht unter Dynamische Konfiguration .

Hinweis: Aufgrund der Implementierung der synchronen Replikation in PostgreSQL können auch mit synchronous_mode_strict Transaktionen verloren gehen. Wird ein PostgreSQL-Backend abgebrochen, während es auf die Bestätigung der Replikation wartet (durch ein Abbruchpaket infolge einer clientseitigen Zeitüberschreitung oder durch einen Backend-Ausfall), werden die Transaktionsänderungen für andere Backends sichtbar. Diese Änderungen sind noch nicht repliziert und können bei der Hochstufung eines Standbys verloren gehen.


Synchroner Replikationsfaktor

Mit dem Parameter synchronous_node_count verwaltet Patroni die Anzahl synchroner Standby-Datenbanken. Sein Standardwert ist 1. Ist synchronous_mode auf off gesetzt, hat er keine Wirkung. Bei aktiviertem Modus steuert Patroni die genaue Anzahl synchroner Standby-Datenbanken anhand von synchronous_node_count und passt beim Hinzukommen und Ausscheiden von Mitgliedern sowohl den Zustand im DCS als auch synchronous_standby_names in PostgreSQL an. Sind weniger geeignete Knoten verfügbar, kann Patroni weniger synchrone Standbys als angefordert verwenden; im strikten Quorum-Modus warten Commits jedoch weiterhin auf die konfigurierte Anzahl von Standby-Bestätigungen.


Maximaler Rückstand eines synchronen Knotens

Standardmäßig hält Patroni an Knoten fest, die laut Sicht pg_stat_replication als synchronous gelten, selbst wenn andere Knoten weiter fortgeschritten sind. Dadurch wird die Anzahl der Änderungen an synchronous_standby_names minimiert. Dieses Verhalten lässt sich mit maximum_lag_on_syncnode ändern. Der Parameter steuert, wie weit ein Replikat zurückliegen darf, um noch als „synchron“ zu gelten.

Bei mehr als einem Standby verwendet Patroni die höchste Replikat-LSN, andernfalls die aktuelle WAL-LSN des Leaders. Der Standardwert ist -1; bei einem Wert von 0 oder weniger unternimmt Patroni nichts, um einen beeinträchtigten synchronen Standby auszutauschen. Den Wert ausreichend hoch wählen, damit Patroni synchrone Standbys bei hohem Transaktionsaufkommen nicht zu häufig austauscht.


Implementierung des synchronen Modus

Im synchronen Modus verwaltet Patroni den Synchronisationszustand im DCS (Schlüssel /sync). Er enthält den zuletzt bekannten Primärserver und die aktuellen synchronen Standby-Datenbanken. Für Aktualisierungen gelten strenge Reihenfolgevorgaben, um folgende Invarianten zu gewährleisten:

  • Ein Knoten muss immer dann als letzter Leader gekennzeichnet sein, wenn er Schreibtransaktionen annehmen kann. Ein Absturz von Patroni oder ein nicht herunterfahrendes PostgreSQL kann diese Invariante verletzen.
  • Solange ein Knoten im DCS-Schlüssel /sync als synchroner Standby veröffentlicht ist, muss er in PostgreSQL als synchroner Standby eingestellt sein.
  • Ein Knoten, der weder Leader noch aktueller synchroner Standby ist, darf sich nicht automatisch hochstufen.

Bei einer nicht leeren Menge synchroner Standbys weist Patroni synchronous_standby_names einen oder mehrere synchrone Standby-Knoten gemäß synchronous_node_count zu.

Bei jedem Durchlauf der HA-Schleife bewertet Patroni die Auswahl der synchronen Standby-Knoten neu. Sind die aktuell aufgeführten synchronen Standby-Knoten verbunden und haben sie nicht darum gebeten, ihren synchronen Status aufzuheben, bleiben sie ausgewählt. Andernfalls werden die für synchrone Replikation verfügbaren Clustermitglieder ausgewählt, die bei der Replikation am weitesten fortgeschritten sind.

Beispiel:

Schlüssel /config im DCS

synchronous_mode: on
synchronous_node_count: 2
...

Schlüssel /sync im DCS

{
    "leader": "node0",
    "sync_standby": "node1,node2"
}

postgresql.conf

synchronous_standby_names = 'FIRST 2 (node1,node2)'

Im obigen Beispiel gelten nur node1 und node2 als nachweislich synchron. Nur sie dürfen automatisch hochgestuft werden, wenn der Primärserver (node0) ausfällt.


Quorum-Commit-Modus

Ab PostgreSQL v10 unterstützt Patroni Quorum-basierte synchrone Replikation.

In diesem Modus verwaltet Patroni den Synchronisationszustand im DCS. Er enthält den zuletzt bekannten Primärserver, die für ein Quorum erforderliche Knotenzahl und die derzeit zur Quorum-Abstimmung berechtigten Knoten. Im stabilen Zustand stimmen der Leader und alle synchronen Standbys ab. Bei Aktualisierungen gelten strenge Reihenfolgevorgaben bezüglich Knotenhochstufung und synchronous_standby_names. So enthält zu jedem Zeitpunkt jede Teilmenge der Stimmberechtigten, die ein Quorum erreichen kann, mindestens einen Knoten mit dem letzten erfolgreichen Commit.

Bei jedem Durchlauf der HA-Schleife bewertet Patroni anhand der Knotenverfügbarkeit und der gewünschten Clusterkonfiguration die Auswahl synchroner Standbys sowie das Quorum neu. In PostgreSQL-Versionen nach 9.6 werden alle geeigneten Knoten als synchrone Standbys hinzugefügt, sobald ihre Replikation den Leader eingeholt hat.

Quorum-Commit hilft, die Latenzen im ungünstigsten Fall selbst im Normalbetrieb zu verringern, da andere Standbys eine höhere Replikationslatenz zu einem einzelnen Standby ausgleichen können.

Der Quorum-basierte synchrone Modus lässt sich aktivieren, indem synchronous_mode mit patronictl edit-config oder über die REST-Schnittstelle von Patroni auf quorum gesetzt wird. Eine Anleitung steht unter Dynamische Konfiguration .

Andere Parameter wie synchronous_node_count, maximum_lag_on_syncnode und synchronous_mode_strict funktionieren weiterhin wie bei synchronous_mode=on.

Ist im Quorum-Commit-Modus die Menge synchroner Standbys leer und erfordert der strikte Modus Bestätigungen von N Standbys, setzt Patroni 4.1.5 synchronous_standby_names auf ANY N (*).

Beispiel:

Schlüssel /config im DCS

synchronous_mode: quorum
synchronous_node_count: 2
...

Schlüssel /sync im DCS

{
    "leader": "node0",
    "sync_standby": "node1,node2,node3",
    "quorum": 1
}

postgresql.conf

synchronous_standby_names = 'ANY 2 (node1,node2,node3)'

Fällt der Primärserver (node0) im obigen Beispiel aus, haben zwei der Knoten node1, node2, node3 die letzte Transaktion empfangen; es ist jedoch unbekannt, welche. Um festzustellen, ob node1 die letzte Transaktion empfangen hat, muss seine LSN mit der LSN mindestens eines Knotens (quorum=1 im Schlüssel /sync) aus node2 und node3 verglichen werden. Liegt node1 gegenüber mindestens einem von ihnen nicht zurück, lässt sich garantieren, dass bei der Hochstufung von node1 kein für Benutzer sichtbarer Datenverlust auftritt.


  1. Die Daten sind noch vorhanden, ihre Wiederherstellung erfordert aber manuelle Arbeit durch Spezialisten für Datenrettung. Darf Patroni mit use_pg_rewind zurücksetzen, wird die abgezweigte Zeitleiste automatisch gelöscht, um den ausgefallenen Primärserver wieder in den Cluster aufzunehmen. Damit use_pg_rewind richtig funktioniert, muss der Cluster mit data page checksums (Option --data-checksums für initdb) initialisiert worden sein und/oder wal_log_hints muss auf on gesetzt sein. ↩︎

  2. Clients können das Verhalten je Transaktion mit der PostgreSQL-Einstellung synchronous_commit ändern. Transaktionen mit den synchronous_commit-Werten off und local können bei einem Failover verloren gehen, werden aber nicht durch Replikationsverzögerungen blockiert. ↩︎

8 - Standby-Cluster

Einrichtung und Verhalten eines Standby-Clusters sowie Replikation von einem entfernten Primärserver.

Patroni unterstützt mit der Funktion „Standby-Cluster“ auch kaskadierende Replikation in ein entferntes Rechenzentrum (eine Region). Ein solcher Cluster besteht aus:

  • einem „Standby-Leader“, der sich weitgehend wie ein normaler Cluster-Leader verhält, aber von einem entfernten Knoten repliziert.
  • kaskadierenden Replikaten, die vom Standby-Leader replizieren.

Der Standby-Leader hält und aktualisiert eine Leader-Sperre im DCS. Läuft diese Sperre ab, wählen die kaskadierenden Replikate einen anderen Leader aus den Standbys.

Zwischen dem Standby-Cluster und dem Primärcluster, von dem er repliziert, besteht keine weitere Beziehung. Insbesondere dürfen sie nicht denselben DCS-Scope verwenden, wenn sie denselben DCS nutzen. Außer den Replikationsinformationen wissen sie nichts voneinander. Der Standby-Cluster erscheint außerdem nicht in der Ausgabe von patronictl_list oder patronictl_topology auf dem Primärcluster.

Für mehr Flexibilität lassen sich die Methoden zur Erstellung eines Replikats und zur Wiederherstellung von WAL-Einträgen im „Standby-Modus“ über den Schlüssel create_replica_methods im Abschnitt standby_cluster festlegen. Davon getrennt ist die Replikaterstellung, wenn der Cluster abgekoppelt ist und als normaler Cluster arbeitet: Sie wird durch create_replica_methods im Abschnitt postgresql gesteuert. Sowohl die „Standby“- als auch die „normalen“ create_replica_methods verweisen auf Schlüssel im Abschnitt postgresql.

Zur Konfiguration eines solchen Clusters muss in der Patroni-Konfiguration der Abschnitt standby_cluster angegeben werden:

bootstrap:
    dcs:
        standby_cluster:
            host: 1.2.3.4
            port: 5432
            primary_slot_name: patroni
            create_replica_methods:
            - basebackup

Diese Optionen werden nur einmal während der Cluster-Initialisierung angewendet. Danach können sie ausschließlich über den DCS geändert werden.

Patroni erwartet postgresql.conf oder postgresql.conf.backup im PGDATA des entfernten Primärservers und startet nicht, wenn diese Datei nach einem Basisbackup fehlt. Liegt die postgresql.conf des entfernten Primärservers an einem anderen Ort, muss sie eigenständig nach PGDATA kopiert werden.

Werden Replikationsslots im Standby-Cluster verwendet, muss der entsprechende Replikationsslot auch im Primärcluster angelegt werden. Die Implementierung des Standby-Clusters erledigt dies nicht automatisch. Mit der Funktion für permanente Replikationsslots von Patroni kann im Primärcluster ein Replikationsslot verwaltet werden, dessen Name primary_slot_name entspricht – oder dessen Standardwert, falls primary_slot_name nicht angegeben ist.

Bietet der entfernte Standort keinen einzelnen Endpunkt für die Verbindung zum Primärserver, können alle Hosts des Quellclusters im Abschnitt standby_cluster.host aufgelistet werden. Enthält standby_cluster.host mehrere durch Kommas getrennte Hosts, führt Patroni Folgendes aus:

  • Es ergänzt primary_conninfo auf dem Standby-Leader um target_session_attrs=read-write.
  • Es verwendet target_session_attrs=read-write, wenn geprüft wird, ob pg_rewind erforderlich ist, oder wenn pg_rewind auf allen Knoten des Standby-Clusters ausgeführt wird.
  • Damit pg_rewind erfolgreich funktioniert, muss der Cluster mit data page checksums (Option --data-checksums für initdb) initialisiert worden sein und/oder wal_log_hints muss auf on gesetzt sein. Andernfalls funktioniert pg_rewind nicht ordnungsgemäß.

Ein Standby-Cluster kann auch von einem anderen Standby-Cluster oder einem Standby-Mitglied des Primärclusters replizieren. Dafür muss im Abschnitt standby_cluster.host genau ein Host angegeben werden. Dabei ist jedoch zu beachten, dass pg_rewind in diesem Fall auf dem Standby-Cluster fehlschlägt.

Warnung

Mitgliedsnamen (das Feld name in der Patroni-Konfiguration jedes Knotens) müssen im Primärcluster und in allen mit ihm verbundenen Standby-Clustern eindeutig sein.

Patroni setzt synchronous_standby_names auf dem Primärserver anhand der Mitgliedsnamen. Diese werden zugleich als application_name der jeweiligen Replikationsverbindung in pg_stat_replication verwendet. Hat ein Knoten eines Standby-Clusters denselben Namen wie ein Mitglied des Primärclusters, sieht PostgreSQL zwei Verbindungen mit identischen application_name-Werten. Durch diese Mehrdeutigkeit kann PostgreSQL die Anforderung an synchrone Replikation mit der Verbindung des Standby-Clusters statt mit der des vorgesehenen Primärcluster-Mitglieds erfüllen. PostgreSQL bestätigt Transaktionen dadurch vorzeitig als synchron festgeschrieben, obwohl sie auf dem richtigen Standby noch nicht dauerhaft gespeichert sind.

Dieser Fehler bleibt unbemerkt: Die Replikation läuft weiter und es werden keine Fehler protokolliert, doch der Cluster arbeitet faktisch ohne gültigen synchronen Standby. Fällt der Primärserver aus, droht Datenverlust.

9 - Watchdog-Unterstützung

Watchdog-Integration und Hinweise zum Fencing für Patroni-Cluster.

Laufen mehrere PostgreSQL-Server gleichzeitig als Primärserver, können durch auseinanderlaufende Zeitleisten Transaktionen verloren gehen. Diese Situation wird auch als Split-Brain bezeichnet. Um sie zu vermeiden, muss Patroni sicherstellen, dass PostgreSQL nach Ablauf des Leader-Schlüssels im DCS keine Transaktions-Commits mehr annimmt. Unter normalen Umständen versucht Patroni dies zu erreichen, indem es PostgreSQL stoppt, sobald die Aktualisierung der Leader-Sperre aus irgendeinem Grund fehlschlägt. Dies kann jedoch aus verschiedenen Gründen scheitern:

  • Patroni ist aufgrund eines Fehlers oder Speichermangels abgestürzt oder wurde versehentlich von einem Systemadministrator beendet.
  • PostgreSQL fährt zu langsam herunter.
  • Patroni kommt wegen hoher Systemlast, einer vom Hypervisor pausierten VM oder anderer Infrastrukturprobleme nicht zur Ausführung.

Um auch unter diesen Bedingungen korrektes Verhalten zu gewährleisten, unterstützt Patroni Watchdog-Geräte. Dies sind Software- oder Hardwaremechanismen, die das gesamte System zurücksetzen, wenn innerhalb eines bestimmten Zeitraums kein Keepalive-Heartbeat eintrifft. Sie bieten eine zusätzliche Absicherung, falls die üblichen Split-Brain-Schutzmechanismen von Patroni versagen.

Patroni versucht, den Watchdog vor der Hochstufung von PostgreSQL zum Primärserver zu aktivieren. Schlägt dies fehl und steht der Watchdog-Modus auf required, verweigert der Knoten die Leader-Rolle. Auch bei der Entscheidung über die Teilnahme an einer Leader-Wahl prüft Patroni, ob die Watchdog-Konfiguration die Leader-Rolle überhaupt zulässt. Nach der Herabstufung von PostgreSQL (etwa bei einem manuellen Failover) deaktiviert Patroni den Watchdog wieder. Ebenso wird der Watchdog deaktiviert, während Patroni pausiert ist.

Standardmäßig stellt Patroni den Watchdog so ein, dass er 5 Sekunden vor Ablauf der TTL auslöst. Mit den Standardwerten loop_wait=10 und ttl=30 hat die HA-Schleife dadurch mindestens 15 Sekunden (ttl - safety_margin - loop_wait) Zeit zum Abschluss, bevor das System zwangsweise zurückgesetzt wird. Für DCS-Zugriffe ist standardmäßig eine Zeitüberschreitung von 10 Sekunden konfiguriert. Ist der DCS beispielsweise wegen Netzwerkproblemen nicht verfügbar, bleiben Patroni und PostgreSQL damit mindestens 5 Sekunden (ttl - safety_margin - loop_wait - retry_timeout), um alle Clientverbindungen zu beenden.

Der Sicherheitsabstand ist die Zeit, die Patroni zwischen der Aktualisierung des Leader-Schlüssels und dem Keepalive für den Watchdog reserviert. Patroni versucht, unmittelbar nach Bestätigung der Aktualisierung des Leader-Schlüssels ein Keepalive zu senden. Wird der Patroni-Prozess genau im entscheidenden Moment längere Zeit angehalten, kann sich das Keepalive um mehr als den Sicherheitsabstand verzögern, ohne den Watchdog auszulösen. Dadurch entsteht ein Zeitfenster, in dem der Watchdog nicht vor Ablauf des Leader-Schlüssels auslöst und die Garantie somit nicht mehr gilt. Damit der Watchdog unter allen Umständen sicher auslöst, safety_margin auf -1 setzen. Dadurch beträgt die Watchdog-Frist ttl // 2, also die Hälfte der TTL. Wird diese Garantie benötigt, sollte wahrscheinlich ttl erhöht und/oder loop_wait sowie retry_timeout verringert werden.

Derzeit werden Watchdogs nur über die Linux-Watchdog-Geräteschnittstelle unterstützt.


Software-Watchdog unter Linux einrichten

Die Standardkonfiguration von Patroni versucht unter Linux, /dev/watchdog zu verwenden, sofern Patroni darauf zugreifen kann. Für die meisten Anwendungsfälle ist der im Linux-Kernel enthaltene Software-Watchdog ausreichend sicher.

Zum Aktivieren des Software-Watchdogs vor dem Start von Patroni folgende Befehle als root ausführen:

modprobe softdog
# Replace postgres with the user you will be running patroni under
chown postgres /dev/watchdog

Für Tests kann es hilfreich sein, Neustarts durch das zusätzliche Argument soft_noboot=1 in der modprobe-Befehlszeile zu deaktivieren. Dann schreibt der Watchdog lediglich eine über dmesg sichtbare Zeile in den Kernel-Ringpuffer.

Nach erfolgreicher Aktivierung protokolliert Patroni Informationen über den Watchdog.

10 - Cluster-Verwaltung pausieren und fortsetzen

Verhalten beim Pausieren und Fortsetzen der Patroni-Cluster-Verwaltung.


Ziel

Unter bestimmten Umständen muss Patroni die Verwaltung des Clusters vorübergehend aussetzen, den Clusterzustand aber weiterhin im DCS speichern. Mögliche Anwendungsfälle sind seltene Eingriffe wie Hauptversionsupgrades oder die Wiederherstellung nach Datenbeschädigungen. Dabei werden Knoten häufig aus Gründen gestartet und gestoppt, die Patroni nicht kennt. Einige Knoten werden möglicherweise sogar vorübergehend hochgestuft, wodurch die Annahme verletzt wird, dass nur ein Primärserver läuft. Patroni muss sich daher vom laufenden Cluster „abkoppeln“ können und eine Entsprechung zum Wartungsmodus von Pacemaker bereitstellen.


Implementierung

Im pausierten Modus ändert Patroni den Zustand von PostgreSQL nicht, mit folgenden Ausnahmen:

  • Für jeden Knoten wird der Mitgliedsschlüssel im DCS mit den aktuellen Clusterinformationen aktualisiert. Dazu führt Patroni auf einem laufenden Mitgliedsknoten schreibgeschützte Abfragen aus.
  • Für den Postgres-Primärserver mit der Leader-Sperre aktualisiert Patroni diese Sperre. Ist der Knoten mit der Leader-Sperre kein Primärserver mehr (d. h. nach einer manuellen Herabstufung), gibt Patroni die Sperre frei, statt den Knoten wieder hochzustufen.
  • Manuelle, nicht zeitgesteuerte Neustarts, Failover/Switchover und Neuinitialisierungen sind erlaubt. Zeitgesteuerte Aktionen sind nicht erlaubt. Ein manuelles Switchover ist nur erlaubt, wenn der Zielknoten angegeben wird.
  • Erkennt Patroni „parallele“ Primärserver, gibt es eine Warnung aus, stuft den Primärserver ohne Leader-Sperre jedoch nicht herab.
  • Gibt es im Cluster keine Leader-Sperre, erlangt der laufende Primärserver die Sperre. Gibt es mehrere Primärserver, gewinnt der erste, der die Sperre erlangt. Gibt es überhaupt keinen Primärserver, versucht Patroni nicht, Replikate hochzustufen. Von dieser Regel gibt es eine Ausnahme: Fehlt die Leader-Sperre, weil sich der bisherige Primärserver infolge einer manuellen Hochstufung selbst herabgestuft hat, darf nur der in der Hochstufungsanfrage genannte Kandidat die Leader-Sperre übernehmen. Wird die neue Leader-Sperre vergeben (d. h. nach der manuellen Hochstufung eines Replikats), stellt Patroni sicher, dass Replikate, die zuvor vom bisherigen Leader gestreamt haben, auf den neuen wechseln.
  • Ist Postgres gestoppt, versucht Patroni nicht, es zu starten. Wird Patroni gestoppt, versucht es nicht, die von ihm verwaltete Postgres-Instanz zu stoppen.
  • Patroni versucht nicht, Replikationsslots zu entfernen, die weder ein anderes Clustermitglied repräsentieren noch in der Konfiguration der permanenten Slots aufgeführt sind.

Benutzerhandbuch

patronictl unterstützt die Befehle pause und resume .

Es kann auch eine PATCH /config-Anfrage mit {"pause": true/false/null} an die REST-API von Patroni gesendet werden, um den Schlüssel {namespace}/{cluster}/config im DCS zu aktualisieren.

11 - DCS-Failsafe-Modus

Verhalten, Voraussetzungen und betriebliche Einschränkungen des DCS-Failsafe-Modus.


Das Problem

Patroni stützt sich bei der Leader-Wahl und der Erkennung von Netzwerkpartitionen stark auf den verteilten Konfigurationsspeicher (DCS). Ein Knoten darf Postgres also nur dann als Primärserver betreiben, wenn er die Leader-Sperre im DCS aktualisieren kann. Schlägt diese Aktualisierung fehl, wird Postgres sofort herabgestuft und schreibgeschützt gestartet. Wie wahrscheinlich dieses „Problem“ auftritt, hängt vom verwendeten DCS ab. Bei etcd, das ausschließlich für Patroni genutzt wird, ist die Wahrscheinlichkeit beispielsweise nahezu null; bei der K8s-API (mit etcd als Speicher) kann es häufiger auftreten.


Gründe für die aktuelle Implementierung

Eine Aktualisierung der Leader-Sperre kann hauptsächlich aus zwei Gründen fehlschlagen:

  1. Netzwerkpartitionierung
  2. Ausfall des DCS

Im Allgemeinen kann ein einzelner Knoten diese beiden Fälle nicht unterscheiden. Deshalb nimmt Patroni den schlimmsten Fall an: eine Netzwerkpartitionierung. Bei einem partitionierten Netzwerk können andere Knoten des Patroni-Clusters die Leader-Sperre erfolgreich übernehmen und Postgres zum Primärserver hochstufen. Um Split-Brain zu vermeiden, wird der bisherige Primärserver herabgestuft, bevor die Leader-Sperre abläuft.


DCS-Failsafe-Modus

Dafür wird die neue spezielle Option failsafe_mode eingeführt. Sie kann nur über die globale dynamische Konfiguration aktiviert werden, die im DCS-Schlüssel /config gespeichert ist. Wenn der Failsafe-Modus aktiviert ist und die Aktualisierung der Leader-Sperre im DCS aus einem anderen Grund als einer Abweichung bei Version, Wert oder Index fehlschlägt, kann Postgres weiter als Primärserver laufen, sofern es alle bekannten Clustermitglieder über die REST-API von Patroni erreichen kann.


Implementierungsdetails

  • Im DCS wird ein neuer, dauerhafter Schlüssel namens /failsafe eingeführt.
  • Der Schlüssel /failsafe enthält alle zu einem bestimmten Zeitpunkt bekannten Mitglieder des jeweiligen Patroni-Clusters.
  • Der aktuelle Leader verwaltet den Schlüssel /failsafe.
  • Ein Mitglied darf nur dann an der Leader-Wahl teilnehmen und neuer Leader werden, wenn es im Schlüssel /failsafe enthalten ist.
  • Besteht der Cluster aus einem einzigen Knoten, enthält der Schlüssel /failsafe ein einziges Mitglied.
  • Bei einem DCS-Ausfall kontaktiert der bestehende Primärserver alle im Schlüssel /failsafe aufgeführten Mitglieder über die REST-API POST /failsafe. Er kann weiter als Primärserver laufen, wenn alle Replikate dies bestätigen.
  • Antwortet eines der Mitglieder nicht, wird der Primärserver herabgestuft.
  • Replikate werten eingehende REST-API-Anfragen an POST /failsafe als Zeichen dafür, dass der Primärserver noch aktiv ist. Diese Information wird für ttl Sekunden zwischengespeichert.

Häufig gestellte Fragen

  • Warum MUSS der aktuelle Primärserver ALLE anderen Mitglieder erreichen? Können wir uns hier nicht auf ein Quorum verlassen?

    Das ist eine gute Frage! Das Problem ist, dass DCS und Patroni unterschiedliche Sichtweisen auf das Quorum haben können. DCS-Knoten müssen gleichmäßig über die Verfügbarkeitszonen verteilt sein; für Patroni gibt es keine solche Regel und vor allem keinen Mechanismus, um sie einzuführen und durchzusetzen. Befindet sich die Mehrheit der Patroni-Knoten einschließlich des Primärservers im unterlegenen Teil des partitionierten Netzwerks und die Minderheit im siegreichen Teil, muss der Primärserver herabgestuft werden. Nur durch die Prüfung ALLER anderen Mitglieder lässt sich diese Situation erkennen.

  • Was geschieht, wenn ein Knoten oder Pod beendet wird, während der DCS ausgefallen ist?

    Ist der DCS nicht erreichbar, wird in jedem Durchlauf der Heartbeat-Schleife (alle loop_wait Sekunden) geprüft, ob ALLE anderen Clustermitglieder erreichbar sind. Wird ein Pod oder Knoten beendet, schlägt diese Prüfung fehl und Postgres wird in den schreibgeschützten Zustand herabgestuft. Es kehrt erst dann zum normalen Betrieb zurück, wenn der DCS wiederhergestellt ist.

  • Was geschieht, wenn alle Mitglieder des Patroni-Clusters verloren gehen, während der DCS ausgefallen ist?

    Patroni kann so konfiguriert werden, dass es ein neues Replikat aus einem Backup erstellt, auch wenn der Cluster keinen Leader hat. Ist das neue Mitglied jedoch nicht im Schlüssel /failsafe enthalten, kann es weder die Leader-Sperre übernehmen noch hochgestuft werden.

  • Was geschieht, wenn der Primärserver den Zugriff auf den DCS verliert, die Replikate aber nicht?

    Der Primärserver führt den Failsafe-Code aus und kontaktiert alle bekannten Replikate. Diese werten die Information als Zeichen dafür, dass der Primärserver aktiv ist, und starten auch dann keine Leader-Wahl, wenn die Leader-Sperre im DCS abgelaufen ist.

  • Wie wird der Failsafe-Modus aktiviert?

    Vor der Aktivierung von failsafe_mode sicherstellen, dass die Patroni-Version auf allen Mitgliedern aktuell ist. Anschließend kann entweder die REST-API PATCH /config oder patronictl edit-config -s failsafe_mode=true verwendet werden.

12 - Patroni mit Kubernetes verwenden

Patroni mit Kubernetes-Objekten, Labels und Diensterkennung verwenden.

Patroni kann Kubernetes-Objekte verwenden, um den Clusterzustand zu speichern und den Leader-Schlüssel zu verwalten. Damit kann Postgres in einer Kubernetes-Umgebung ohne zusätzlichen Konsistenzspeicher betrieben werden; insbesondere ist keine zusätzliche etcd-Installation nötig. Patroni kann zwei verschiedene Arten von Kubernetes-Objekten zum Speichern der Leader- und Konfigurationsschlüssel verwenden. Die Auswahl erfolgt über kubernetes.use_endpoints oder die Umgebungsvariable PATRONI_KUBERNETES_USE_ENDPOINTS.


Endpoints verwenden

Obwohl dieser Modus empfohlen wird, ist er aus Kompatibilitätsgründen standardmäßig deaktiviert. Ist er aktiviert, speichert Patroni die Clusterkonfiguration und den Leader-Schlüssel in den Feldern metadata: annotations der jeweils angelegten Endpoints. Der Wechsel des Leaders ist sicherer als mit ConfigMaps, weil sowohl die Annotationen mit den Leader-Informationen als auch die tatsächlichen Adressen des laufenden Leader-Pods gleichzeitig in einem Schritt aktualisiert werden.


ConfigMaps verwenden

In diesem Modus erstellt Patroni ConfigMaps anstelle von Endpoints und speichert die Schlüssel in deren Metadaten. Der Wechsel des Leaders erfordert mindestens zwei Aktualisierungen: eine für die Leader-ConfigMap und eine weitere für den jeweiligen Endpoint.

Um den Datenverkehr zum Postgres-Leader zu leiten, muss der Kubernetes-Service für Postgres einen Label-Selektor mit dem in der Patroni-Konfiguration festgelegten role_label verwenden.

In einigen Fällen, etwa unter OpenShift, gibt es keine Alternative zu ConfigMaps.


Konfiguration

Die Kubernetes-Einstellungen und -Umgebungsvariablen von Patroni werden in den allgemeinen Kapiteln der Dokumentation beschrieben.

Rollen-Label anpassen

Standardmäßig setzt Patroni auf dem Pod, in dem es läuft, zur Rolle des Knotens passende Labels, beispielsweise role=primary. Schlüssel und Wert des Labels lassen sich mit kubernetes.role_label, kubernetes.leader_label_value, kubernetes.follower_label_value und kubernetes.standby_leader_label_value anpassen.

Beim Wechsel von den standardmäßigen Rollen-Labels zu eigenen Labels lässt sich die Ausfallzeit mit folgenden Migrationsschritten verringern:

  1. Dem Pod mit kubernetes.tmp_role_label ein temporäres Label (etwa tmp_role) hinzufügen, das den ursprünglichen Rollenwert verwendet. Nach dem Neustart der Pods setzt Patroni folgende Labels:
labels:
  cluster-name: foo
  role: primary
  tmp_role: primary
  1. Nachdem alle Pods aktualisiert wurden, den Service-Selektor auf das temporäre Label umstellen.
selector:
  cluster-name: foo
  tmp_role: primary
  1. Das eigene Rollen-Label hinzufügen (z. B. kubernetes.leader_label_value=leader setzen). Nach dem Neustart der Pods setzt Patroni folgende neue Labels:
labels:
  cluster-name: foo
  role: leader
  tmp_role: primary
  1. Nachdem alle Pods erneut aktualisiert wurden, den Service-Selektor auf den neuen Rollenwert umstellen.
selector:
  cluster-name: foo
  role: leader
  1. Abschließend das temporäre Label aus der Konfiguration entfernen und alle Pods aktualisieren.
labels:
  cluster-name: foo
  role: leader

Beispiele

  • Der Ordner kubernetes im Patroni-Repository enthält Beispiele für das Docker-Image und das Kubernetes-Manifest zum Testen einer Patroni-Installation mit Kubernetes. Im aktuellen Zustand können wegen Berechtigungsproblemen keine PersistentVolumes verwendet werden.
  • Ein voll ausgestattetes Docker-Image mit Unterstützung für Persistent Volumes bietet das Spilo-Projekt .
  • Es gibt außerdem ein Helm-Chart zur Bereitstellung des Spilo-Images mit Patroni unter Kubernetes.
  • Für den Betrieb vieler Datenbankcluster mit Patroni und Spilo bietet sich das Projekt postgres-operator an. Es implementiert das Operator-Muster zur Verwaltung von Spilo-Clustern.

13 - Citus-Unterstützung

Einzelheiten zur Patroni-Integration für Citus-Koordinator- und Worker-Gruppen.

Patroni vereinfacht die Bereitstellung von Citus-Clustern mit mehreren Knoten erheblich.


Kurzüberblick (TL;DR)

Es müssen nur wenige einfache Regeln beachtet werden:

  1. Die PostgreSQL-Datenbankerweiterung Citus muss auf allen Knoten verfügbar sein. Die älteste unterstützte Citus-Version ist 10.0. Um alle Vorteile transparenter Switchover und Worker-Neustarts zu nutzen, wird jedoch mindestens Citus 11.2 empfohlen.
  2. Der Cluster-Name (scope) muss auf allen Citus-Knoten identisch sein!
  3. Die Superuser-Zugangsdaten müssen auf dem Koordinator und allen Worker-Knoten identisch sein, und pg_hba.conf sollte den Superuser-Zugriff zwischen allen Knoten erlauben.
  4. Der Zugriff auf die REST API des Koordinators sollte von den Worker-Knoten aus erlaubt sein. Beispielsweise sollten die Zugangsdaten identisch sein, und sofern Client-Zertifikate konfiguriert sind, muss der Koordinator die Zertifikate der Worker-Knoten akzeptieren.
  5. Den folgenden Abschnitt zu patroni.yaml hinzufügen:
citus:
  group: X  # 0 for coordinator and 1, 2, 3, etc for workers
  database: citus  # must be the same on all nodes

Anschließend muss nur noch Patroni gestartet werden; es übernimmt den Rest:

  1. Patroni setzt bootstrap.dcs.synchronous_mode auf quorum , sofern nicht ausdrücklich ein anderer Wert festgelegt ist.
  2. Die Erweiterung citus wird automatisch zu shared_preload_libraries hinzugefügt.
  3. Wenn max_prepared_transactions in der globalen dynamischen Konfiguration nicht ausdrücklich gesetzt ist, setzt Patroni den Wert automatisch auf 2*max_connections.
  4. Der GUC-Wert citus.local_hostname wird von localhost auf den Wert geändert, den Patroni für die Verbindung zur lokalen PostgreSQL-Instanz verwendet. Dieser Wert sollte in manchen Fällen von localhost abweichen, da PostgreSQL dort möglicherweise nicht lauscht.
  5. Die mit citus.database angegebene Datenbank wird automatisch erstellt; anschließend wird CREATE EXTENSION citus ausgeführt.
  6. Die aktuellen Superuser-Zugangsdaten werden zur Tabelle pg_dist_authinfo hinzugefügt, um die Kommunikation zwischen Knoten zu ermöglichen. Diese Daten müssen ebenfalls aktualisiert werden, wenn später username/password/sslcert/sslkey des Superusers geändert werden!
  7. Der Primärserver des Koordinators erkennt die Primärserver der Worker automatisch und fügt sie mit der Funktion citus_add_node() zur Tabelle pg_dist_node hinzu.
  8. Patroni pflegt pg_dist_node auch dann, wenn auf dem Koordinator- oder einem Worker-Cluster ein Failover oder Switchover erfolgt.

patronictl

Koordinator- und Worker-Cluster sind physisch getrennte PostgreSQL-/Patroni-Cluster, die lediglich mithilfe der PostgreSQL-Datenbankerweiterung Citus logisch zusammengefasst werden. Daher lassen sie sich in den meisten Fällen nicht als eine einzige Einheit verwalten.

Im Verhalten von patronictl ergeben sich zwei wesentliche Unterschiede zum üblichen Verhalten, wenn patroni.yaml den Abschnitt citus enthält:

  1. list und topology geben standardmäßig alle Mitglieder des Citus-Verbunds aus (Koordinatoren und Worker). Die neue Spalte Group zeigt an, zu welcher Citus-Gruppe sie gehören.
  2. Für alle Befehle von patronictl gibt es die neue Option --group. Bei einigen Befehlen kann der Standardwert für die Gruppe aus patroni.yaml übernommen werden. Beispielsweise aktiviert patronictl pause den Wartungsmodus standardmäßig für die group, die im Abschnitt citus festgelegt ist. Bei patronictl switchover oder patronictl remove muss die Gruppe hingegen ausdrücklich angegeben werden.

Beispiel einer Ausgabe von patronictl list für einen Citus-Cluster:

postgres@coord1:~$ patronictl list demo
+ Citus cluster: demo ----------+----------------+---------+----+-------------+-----+------------+-----+
| Group | Member  | Host        | Role           | State   | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------+---------+-------------+----------------+---------+----+-------------+-----+------------+-----+
|     0 | coord1  | 172.27.0.10 | Replica        | running |  1 |   0/41C0368 |   0 |  0/41C0368 |   0 |
|     0 | coord2  | 172.27.0.6  | Quorum Standby | running |  1 |   0/41C0368 |   0 |  0/41C0368 |   0 |
|     0 | coord3  | 172.27.0.4  | Leader         | running |  1 |             |     |            |     |
|     1 | work1-1 | 172.27.0.8  | Quorum Standby | running |  1 |   0/31D3198 |   0 |  0/31D3198 |   0 |
|     1 | work1-2 | 172.27.0.2  | Leader         | running |  1 |             |     |            |     |
|     2 | work2-1 | 172.27.0.5  | Quorum Standby | running |  1 |   0/31CDFC0 |   0 |  0/31CDFC0 |   0 |
|     2 | work2-2 | 172.27.0.7  | Leader         | running |  1 |             |     |            |     |
+-------+---------+-------------+----------------+---------+----+-------------+-----+------------+-----+

Mit der zusätzlichen Option --group ändert sich die Ausgabe wie folgt:

postgres@coord1:~$ patronictl list demo --group 0
+ Citus cluster: demo (group: 0, 7179854923829112860) -+-------------+-----+------------+-----+
| Member | Host        | Role           | State   | TL | Receive LSN | Lag | Replay LSN | Lag |
+--------+-------------+----------------+---------+----+-------------+-----+------------+-----+
| coord1 | 172.27.0.10 | Replica        | running |  1 |   0/41C0368 |   0 |  0/41C0368 |   0 |
| coord2 | 172.27.0.6  | Quorum Standby | running |  1 |   0/41C0368 |   0 |  0/41C0368 |   0 |
| coord3 | 172.27.0.4  | Leader         | running |  1 |             |     |            |     |
+--------+-------------+----------------+---------+----+-------------+-----+------------+-----+

postgres@coord1:~$ patronictl list demo --group 1
+ Citus cluster: demo (group: 1, 7179854923881963547) -+-------------+-----+------------+-----+
| Member  | Host       | Role           | State   | TL | Receive LSN | Lag | Replay LSN | Lag |
+---------+------------+----------------+---------+----+-------------+-----+------------+-----+
| work1-1 | 172.27.0.8 | Quorum Standby | running |  1 |   0/31D3198 |   0 |  0/31D3198 |   0 |
| work1-2 | 172.27.0.2 | Leader         | running |  1 |             |     |            |     |
+---------+------------+----------------+---------+----+-------------+-----+------------+-----+

Switchover eines Citus-Workers

Bei einem Switchover eines Citus-Worker-Knotens bietet Citus die Möglichkeit, diesen für die Anwendung nahezu transparent durchzuführen. Da sich die Anwendung mit dem Koordinator verbindet, der wiederum Verbindungen zu den Worker-Knoten herstellt, kann Citus den SQL-Datenverkehr auf dem Koordinator für die Shards eines Worker-Knotens pausieren. Der Switchover erfolgt dann, während der Datenverkehr auf dem Koordinator zurückgehalten wird. Der Datenverkehr wird fortgesetzt, sobald ein neuer Primärserver des Workers bereit ist, lesende und schreibende Abfragen anzunehmen.

Beispiel für patronictl switchover auf einem Worker-Cluster:

postgres@coord1:~$ patronictl switchover demo
+ Citus cluster: demo ----------+----------------+---------+----+-------------+-----+------------+-----+
| Group | Member  | Host        | Role           | State   | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------+---------+-------------+----------------+---------+----+-------------+-----+------------+-----+
|     0 | coord1  | 172.27.0.10 | Replica        | running |  1 |   0/41C0368 |   0 |  0/41C0368 |   0 |
|     0 | coord2  | 172.27.0.6  | Quorum Standby | running |  1 |   0/41C0368 |   0 |  0/41C0368 |   0 |
|     0 | coord3  | 172.27.0.4  | Leader         | running |  1 |             |     |            |     |
|     1 | work1-1 | 172.27.0.8  | Leader         | running |  1 |             |     |            |     |
|     1 | work1-2 | 172.27.0.2  | Quorum Standby | running |  1 |   0/31D3198 |   0 |  0/31D3198 |   0 |
|     2 | work2-1 | 172.27.0.5  | Quorum Standby | running |  1 |   0/31CDFC0 |   0 |  0/31CDFC0 |   0 |
|     2 | work2-2 | 172.27.0.7  | Leader         | running |  1 |             |     |            |     |
+-------+---------+-------------+----------------+---------+----+-------------+-----+------------+-----+
Citus group: 2
Primary [work2-2]:
Candidate ['work2-1'] []:
When should the switchover take place (e.g. 2024-08-26T08:02 )  [now]:
Current cluster topology
+ Citus cluster: demo (group: 2, 7179854924063375386) -+-------------+-----+------------+-----+
| Member  | Host       | Role           | State   | TL | Receive LSN | Lag | Replay LSN | Lag |
+---------+------------+----------------+---------+----+-------------+-----+------------+-----+
| work2-1 | 172.27.0.5 | Quorum Standby | running |  1 |   0/31CDFC0 |   0 |  0/31CDFC0 |   0 |
| work2-2 | 172.27.0.7 | Leader         | running |  1 |             |     |            |     |
+---------+------------+----------------+---------+----+-------------+-----+------------+-----+
Are you sure you want to switchover cluster demo, demoting current primary work2-2? [y/N]: y
2024-08-26 07:02:40.33003 Successfully switched over to "work2-1"
+ Citus cluster: demo (group: 2, 7179854924063375386) --------+---------+------------+---------+
| Member  | Host       | Role    | State   | TL | Receive LSN |     Lag | Replay LSN |     Lag |
+---------+------------+---------+---------+----+-------------+---------+------------+---------+
| work2-1 | 172.27.0.5 | Leader  | running |  1 |             |         |            |         |
| work2-2 | 172.27.0.7 | Replica | stopped |    |     unknown | unknown |    unknown | unknown |
+---------+------------+---------+---------+----+-------------+---------+------------+---------+

postgres@coord1:~$ patronictl list demo
+ Citus cluster: demo ----------+----------------+---------+----+-------------+-----+------------+-----+
| Group | Member  | Host        | Role           | State   | TL | Receive LSN | Lag | Replay LSN | Lag |
+-------+---------+-------------+----------------+---------+----+-------------+-----+------------+-----+
|     0 | coord1  | 172.27.0.10 | Replica        | running |  1 |   0/41C0368 |   0 |  0/41C0368 |   0 |
|     0 | coord2  | 172.27.0.6  | Quorum Standby | running |  1 |   0/41C0368 |   0 |  0/41C0368 |   0 |
|     0 | coord3  | 172.27.0.4  | Leader         | running |  1 |             |     |            |     |
|     1 | work1-1 | 172.27.0.8  | Leader         | running |  1 |             |     |            |     |
|     1 | work1-2 | 172.27.0.2  | Quorum Standby | running |  1 |   0/31D3198 |   0 |  0/31D3198 |   0 |
|     2 | work2-1 | 172.27.0.5  | Leader         | running |  2 |             |     |            |     |
|     2 | work2-2 | 172.27.0.7  | Quorum Standby | running |  2 |   0/31CDFC0 |   0 |  0/31CDFC0 |   0 |
+-------+---------+-------------+----------------+---------+----+-------------+-----+------------+-----+

Auf der Koordinatorseite sieht das wie folgt aus:

# The worker primary notifies the coordinator that it is going to execute "pg_ctl stop".
2024-08-26 07:02:38,636 DEBUG: query(BEGIN, ())
2024-08-26 07:02:38,636 DEBUG: query(SELECT pg_catalog.citus_update_node(%s, %s, %s, true, %s), (3, '172.19.0.7-demoted', 5432, 10000))
# From this moment all application traffic on the coordinator to the worker group 2 is paused.

# The old worker primary is assigned as a secondary.
2024-08-26 07:02:40,084 DEBUG: query(SELECT pg_catalog.citus_update_node(%s, %s, %s, true, %s), (7, '172.19.0.7', 5432, 10000))

# The future worker primary notifies the coordinator that it acquired the leader lock in DCS and about to run "pg_ctl promote".
2024-08-26 07:02:40,085 DEBUG: query(SELECT pg_catalog.citus_update_node(%s, %s, %s, true, %s), (3, '172.19.0.5', 5432, 10000))

# The new worker primary just finished promote and notifies coordinator that it is ready to accept read-write traffic.
2024-08-26 07:02:41,485 DEBUG: query(COMMIT, ())
# From this moment the application traffic on the coordinator to the worker group 2 is unblocked.

Sekundärknoten

Ab Patroni v4.0.0 werden auch Citus-Sekundärknoten ohne das Tag noloadbalance in pg_dist_node registriert. Um Sekundärknoten für schreibgeschützte Abfragen zu verwenden, müssen Anwendungen jedoch den GUC citus.use_secondary_nodes ändern.


Ein Blick in den DCS

Der Citus-Cluster (Koordinator und Worker) wird im DCS als Verbund logisch zusammengehörender Patroni-Cluster gespeichert:

/service/batman/              # scope=batman
/service/batman/0/            # citus.group=0, coordinator
/service/batman/0/initialize
/service/batman/0/leader
/service/batman/0/members/
/service/batman/0/members/m1
/service/batman/0/members/m2
/service/batman/1/            # citus.group=1, worker
/service/batman/1/initialize
/service/batman/1/leader
/service/batman/1/members/
/service/batman/1/members/m3
/service/batman/1/members/m4
...

Dieser Ansatz wurde gewählt, weil sich bei den meisten DCS damit der gesamte Citus-Cluster mit einer einzigen rekursiven Leseanfrage abrufen lässt. Nur die Citus-Koordinatorknoten lesen den gesamten Baum, da sie die Worker-Knoten erkennen müssen. Worker-Knoten lesen lediglich den Teilbaum ihrer eigenen Gruppe und können in manchen Fällen auch den Teilbaum der Koordinatorgruppe lesen.


Citus auf Kubernetes

Da Kubernetes keine hierarchischen Strukturen unterstützt, muss die Citus-Gruppe in alle K8s-Objekte aufgenommen werden, die Patroni erstellt:

batman-0-leader  # the leader config map for the coordinator
batman-0-config  # the config map holding initialize, config, and history "keys"
...
batman-1-leader  # the leader config map for worker group 1
batman-1-config
...

Das Namensschema lautet also: ${scope}-${citus.group}-${type}.

Patroni erkennt alle Kubernetes-Objekte über den Label-Selektor . Daher müssen alle Pods mit Patroni&Citus sowie Endpoints/ConfigMaps Labels, die dem gemeinsamen Label-Selektor entsprechen haben, und Patroni muss über die Kubernetes-Einstellungen oder Umgebungsvariablen für ihre Verwendung konfiguriert werden.

Einige Beispiele für die Konfiguration von Patroni über Umgebungsvariablen der Pods:

  1. Für den Koordinator-Cluster
apiVersion: v1
kind: Pod
metadata:
  labels:
    application: patroni
    citus-group: "0"
    citus-type: coordinator
    cluster-name: citusdemo
  name: citusdemo-0-0
  namespace: default
spec:
  containers:
  - env:
    - name: PATRONI_SCOPE
      value: citusdemo
    - name: PATRONI_NAME
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: metadata.name
    - name: PATRONI_KUBERNETES_POD_IP
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: status.podIP
    - name: PATRONI_KUBERNETES_NAMESPACE
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: metadata.namespace
    - name: PATRONI_KUBERNETES_LABELS
      value: '{application: patroni}'
    - name: PATRONI_CITUS_DATABASE
      value: citus
    - name: PATRONI_CITUS_GROUP
      value: "0"
  1. Für den Worker-Cluster der Gruppe 2
apiVersion: v1
kind: Pod
metadata:
  labels:
    application: patroni
    citus-group: "2"
    citus-type: worker
    cluster-name: citusdemo
  name: citusdemo-2-0
  namespace: default
spec:
  containers:
  - env:
    - name: PATRONI_SCOPE
      value: citusdemo
    - name: PATRONI_NAME
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: metadata.name
    - name: PATRONI_KUBERNETES_POD_IP
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: status.podIP
    - name: PATRONI_KUBERNETES_NAMESPACE
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: metadata.namespace
    - name: PATRONI_KUBERNETES_LABELS
      value: '{application: patroni}'
    - name: PATRONI_CITUS_DATABASE
      value: citus
    - name: PATRONI_CITUS_GROUP
      value: "2"

In beiden Beispielen ist das Label citus-group gesetzt. Anhand dieses Labels erkennt Patroni, zu welcher Citus-Gruppe ein Objekt gehört. Zusätzlich gibt es die Umgebungsvariable PATRONI_CITUS_GROUP mit demselben Wert wie das Label citus-group. Wenn Patroni neue Kubernetes-Objekte (ConfigMaps oder Endpoints) erstellt, versieht es diese automatisch mit dem Label citus-group: ${env.PATRONI_CITUS_GROUP}:

apiVersion: v1
kind: ConfigMap
metadata:
  name: citusdemo-0-leader  # Is generated as ${env.PATRONI_SCOPE}-${env.PATRONI_CITUS_GROUP}-leader
  labels:
    application: patroni    # Is set from the ${env.PATRONI_KUBERNETES_LABELS}
    cluster-name: citusdemo # Is automatically set from the ${env.PATRONI_SCOPE}
    citus-group: '0'        # Is automatically set from the ${env.PATRONI_CITUS_GROUP}

Ein vollständiges Beispiel für die Bereitstellung von Patroni auf Kubernetes mit Citus-Unterstützung findet sich im Ordner kubernetes des Patroni-Repositories.

Dabei sind zwei Dateien relevant:

  1. Dockerfile.citus
  2. citus_k8s.yaml

Citus-Upgrades und PostgreSQL-Hauptversions-Upgrades

Zunächst die Dokumentation zum Aktualisieren der Citus-Version lesen. Im Ablauf gibt es eine kleine Änderung: Beim Upgrade muss PostgreSQL mit patronictl restart anstelle von systemctl restart neu gestartet werden.

Ein PostgreSQL-Hauptversions-Upgrade mit Citus ist etwas komplexer. Dafür müssen die Verfahren aus der Citus-Dokumentation zu Hauptversions-Upgrades mit denen aus der Patroni-Dokumentation zu PostgreSQL-Hauptversionsupgrade kombiniert werden. Dabei ist zu beachten, dass ein Citus-Cluster aus mehreren Patroni-Clustern (Koordinator und Worker) besteht, die alle unabhängig voneinander aktualisiert werden müssen.

14 - Eine eigenständige Instanz in einen Patroni-Cluster überführen

Vorgehen zur Übernahme bestehender PostgreSQL-Daten in einen Patroni-Cluster.

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:

  1. 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.

    -- Patroni superuser
    -- Replace PATRONI_SUPERUSER_USERNAME and PATRONI_SUPERUSER_PASSWORD accordingly
    CREATE USER PATRONI_SUPERUSER_USERNAME WITH SUPERUSER ENCRYPTED PASSWORD 'PATRONI_SUPERUSER_PASSWORD';
    
    -- Patroni replication user
    -- Replace PATRONI_REPLICATION_USERNAME and PATRONI_REPLICATION_PASSWORD accordingly
    CREATE USER PATRONI_REPLICATION_USERNAME WITH REPLICATION ENCRYPTED PASSWORD 'PATRONI_REPLICATION_PASSWORD';
    
    -- Patroni rewind user, if you intend to enable use_pg_rewind in your Patroni configuration
    -- Replace PATRONI_REWIND_USERNAME and PATRONI_REWIND_PASSWORD accordingly
    CREATE USER PATRONI_REWIND_USERNAME WITH ENCRYPTED PASSWORD 'PATRONI_REWIND_PASSWORD';
    GRANT EXECUTE ON function pg_catalog.pg_ls_dir(text, boolean, boolean) TO PATRONI_REWIND_USERNAME;
    GRANT EXECUTE ON function pg_catalog.pg_stat_file(text, boolean) TO PATRONI_REWIND_USERNAME;
    GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text) TO PATRONI_REWIND_USERNAME;
    GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, boolean) TO PATRONI_REWIND_USERNAME;
  2. 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:

    1. 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.
    2. 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_slots zu aktivieren und die bestehenden Replikationsslots über den Konfigurationseintrag slots als permanent zu konfigurieren. Bei aktiviertem use_slots erstellt 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 .
    3. Patroni über die systemd-Service-Unit patroni starten. Es erkennt automatisch, dass Postgres bereits läuft, und beginnt mit der Überwachung der Instanz.
  3. 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:

    1. Die Standby-Knoten sofort neu starten.
    2. Den Neustart des Primärknotens für ein Wartungsfenster planen.
  4. Wurden in Schritt 2.2. permanente Slots konfiguriert, sollten sie mit dem Befehl patronictl edit-config cluster-name aus der Konfiguration slots entfernt werden, sobald die restart_lsn der von Patroni angelegten Slots die restart_lsn der ursprünglichen Slots für die jeweiligen Mitglieder eingeholt hat. Durch das Entfernen aus der Konfiguration slots kann Patroni die ursprünglichen Slots aus dem Cluster löschen, sobald sie nicht mehr benötigt werden. Die folgende Beispielabfrage zeigt die restart_lsn zweier Slots zum Vergleich:

    -- Assume original_slot_for_member_x is the name of the slot in your original
    -- cluster for replicating changes to member X, and slot_for_member_x is the
    -- slot created by Patroni for that purpose. You need restart_lsn of
    -- slot_for_member_x to be >= restart_lsn of original_slot_for_member_x
    SELECT slot_name,
           restart_lsn
    FROM pg_replication_slots
    WHERE slot_name IN (
        'original_slot_for_member_x',
        'slot_for_member_x'
    )

Upgrade auf eine neue PostgreSQL-Hauptversion

Ein Upgrade auf eine neue Hauptversion mit pg_upgrade erfolgt nach folgendem Verfahren:

  1. Patroni stoppen.
  2. Die PostgreSQL-Binärdateien aktualisieren und pg_upgrade auf dem Primärknoten ausführen.
  3. patroni.yml aktualisieren.
  4. 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.
  5. 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.
  6. Patroni auf dem Primärknoten starten.
  7. Auf den Standby-Knoten die PostgreSQL-Binärdateien und patroni.yml aktualisieren sowie data_dir leeren.
  8. 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_addresses und port in postgresql.conf sowie postgresql.listen in patroni.yml überprüfen. Auch pg_hba.conf sollte 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 directory an.

    Je nach Verwaltung der PostgreSQL-Konfiguration kann dies verschiedene Ursachen haben. Wurde postgresql.config_dir angegeben, erzeugt Patroni die pg_hba.conf anhand der Einstellungen im Abschnitt bootstrap nur bei der Initialisierung eines neuen Clusters. In diesem Szenario war PGDATA nicht leer, daher fand keine Initialisierung statt. Diese Datei muss bereits vorher vorhanden sein.

15 - Integration mit anderen Werkzeugen

Integration von Patroni mit externen Backup- und Orchestrierungswerkzeugen.

Patroni lässt sich mit anderen Werkzeugen der eigenen Umgebung integrieren. Die Liste der Beispiele in diesem Abschnitt ist nicht abschließend, gibt aber Anregungen für solche Integrationen.


Barman

Patroni liefert die Anwendung patroni_barman, die mit pg-backup-api kommuniziert und so Barman-Operationen aus der Ferne ermöglicht.

Diese Anwendung verfügt derzeit über die Unterbefehle: recover und config-switch.

patroni_barman recover

Der Unterbefehl recover kann als benutzerdefinierte Bootstrap-Methode oder als benutzerdefinierte Replikat-Erstellungsmethode verwendet werden. Weitere Informationen hierzu finden Sie in Replikaterstellung und Cluster-Initialisierung .

patroni_barman config-switch

Der Unterbefehl config-switch ist als on_role_change-Callback in Patroni vorgesehen. Als Beispiel nehmen wir an, dass Sie WALs von Ihrem aktuellen Primärserver auf Ihren Barman-Host streamen. Im Falle eines Failovers im Cluster möchten Sie möglicherweise den WAL-Stream von dem neuen Primärserver starten. Dies erreichen Sie, indem Sie patroni_barman config-switch als on_role_change-Callback verwenden.

Hinweis

Dieser Unterbefehl basiert auf dem barman config-switch-Befehl, der dafür verantwortlich ist, die Konfiguration eines Barman-Servers durch Anwenden eines vordefinierten Modells auf ihn zu überschreiben. Dieser Befehl ist seit Barman 3.10 verfügbar. Weitere Einzelheiten finden Sie in der Barman-Dokumentation.

Dies ist ein Beispiel dafür, wie Sie Patroni konfigurieren können, um ein Konfigurationsmodell anzuwenden, falls dieser Patroni-Knoten zum Primärserver hochgestuft wird:

postgresql:
    callbacks:
        on_role_change: >
            patroni_barman
                --api-url YOUR_API_URL
                config-switch
                --barman-server YOUR_BARMAN_SERVER_NAME
                --barman-model YOUR_BARMAN_MODEL_NAME
                --switch-when promoted
Hinweis

patroni_barman config-switch erfordert, dass sowohl Barman als auch pg-backup-api auf dem Barman-Host konfiguriert sind, damit ein entfernter barman config-switch über die Backup-API ausgeführt werden kann. Außerdem müssen die anzuwendenden Barman-Modelle bereits konfiguriert sein. Das obige Beispiel verwendet eine Teilmenge der verfügbaren Parameter. Weitere Informationen erhalten Sie durch Ausführen von patroni_barman config-switch --help und durch Konsultation der Barman-Dokumentation.

16 - Sicherheitshinweise

Sicherheitshinweise für DCS, REST-API und den Umgang mit Zugangsdaten.

Ein Patroni-Cluster verfügt über zwei Schnittstellen, die vor unbefugtem Zugriff geschützt werden müssen: der verteilte Konfigurationsspeicher (DCS) und die REST-API von Patroni.


Schutz des DCS

Sowohl Patroni als auch patronictl speichern Daten im DCS und lesen sie daraus.

Auch wenn der DCS keine sensiblen Informationen enthält, ermöglicht er die Änderung einiger Einstellungen von Patroni/Postgres. Daher sollte zuerst der DCS selbst geschützt werden.

Die Details zum Schutz hängen vom verwendeten Typ des DCS ab. Die Authentifizierungs- und Verschlüsselungsparameter (Token/Basic-Auth/Client-Zertifikate) für die unterstützten DCS-Typen sind in den Einstellungen beschrieben.

Die allgemeine Empfehlung ist, TLS für die gesamte Kommunikation mit dem DCS zu aktivieren.


Schutz der REST-API

Der Schutz der REST-API ist eine komplexere Aufgabe.

Patroni selbst verwendet seine REST-API während der Leader-Wahl. Das Werkzeug patronictl nutzt sie für Failover, Switchover, Neuinitialisierungen, Neustarts und das Neuladen der Konfiguration. HAProxy oder andere Load-Balancer verwenden sie für HTTP-Health-Checks; außerdem kann sie zur Überwachung dienen.

Aus Sicherheitsperspektive enthält die REST-API sichere (GET-Anfragen, die nur Informationen abrufen) und unsichere (PUT-, POST-, PATCH- und DELETE-Anfragen, die den Zustand von Knoten ändern) Endpunkte.

Die unsicheren Endpunkte können durch HTTP-Basic-Auth geschützt werden, indem die Parameter restapi.authentication.username und restapi.authentication.password gesetzt werden. Es gibt keine Möglichkeit, die sicheren Endpunkte zu schützen, ohne TLS zu aktivieren.

Wenn TLS für die REST-API aktiviert und eine PKI eingerichtet ist, ist eine gegenseitige Authentifizierung zwischen API-Server und API-Client für alle Endpunkte möglich.

Die Parameter im Abschnitt restapi ermöglichen die TLS-Client-Authentifizierung beim Server. Je nach Wert des Parameters verify_client erfordert der API-Server eine erfolgreiche Überprüfung des Clientzertifikats sowohl für sichere als auch für unsichere API-Aufrufe (verify_client: required), nur für unsichere API-Aufrufe (verify_client: optional), oder für keine API-Aufrufe (verify_client: none).

Die Parameter im Abschnitt ctl ermöglichen die TLS-Server-Authentifizierung beim Client (dem Werkzeug patronictl , das dieselbe Konfiguration wie Patroni verwendet). Mit insecure: true wird die Überprüfung des Serverzertifikats durch den Client deaktiviert. Weitere Details zu den TLS-Client-Parametern finden Sie in Einstellungen .

Der Schutz der PostgreSQL-Datenbank selbst vor unbefugtem Zugriff liegt außerhalb des Umfangs dieses Dokuments und wird unter https://www.postgresql.org/docs/current/client-authentication.html behandelt.

17 - Hochverfügbarkeit über mehrere Rechenzentren

Hochverfügbarkeitsarchitekturen mit Patroni-Replikation über mehrere Rechenzentren.

Die Hochverfügbarkeit eines PostgreSQL-Clusters über mehrere Rechenzentren basiert auf synchroner oder asynchroner Replikation (siehe Replikationsmodi ).

In beiden Fällen sind folgende Grundsätze wichtig:

  • Postgres kann nur dann als Primärserver oder Standby-Leader laufen, wenn es den Leader-Schlüssel besitzt und aktualisieren kann.
  • Die Anzahl der etcd-, ZooKeeper- oder Consul-Knoten sollte ungerade sein: 3 oder 5!

Synchrone Replikation

Ein Cluster über mehrere Rechenzentren (DC), der den Ausfall einer Zone automatisch verkraften soll, benötigt mindestens 3 Zonen.

Das Architekturdiagramm sieht folgendermaßen aus:

Bild

Ein Cluster aus etcd, ZooKeeper oder Consul muss über die verschiedenen Rechenzentren verteilt werden, mit mindestens 3 Knoten und jeweils einem Knoten pro Zone.

Für Postgres müssen mindestens 2 Knoten in unterschiedlichen Rechenzentren bereitgestellt werden. Anschließend muss synchronous_mode: true in der globalen dynamischen Konfiguration gesetzt werden.

Dies aktiviert synchrone Replikation; der Primärserver wählt einen der Knoten als synchronen Knoten aus.


Asynchrone Replikation

Bei nur zwei Rechenzentren ist es besser, zwei unabhängige etcd-Cluster zu betreiben und im zweiten Rechenzentrum einen Patroni-Standby-Cluster einzurichten. Fällt der erste Standort aus, kann der standby_cluster MANUELL hochgestuft werden.

Das Architekturdiagramm sieht folgendermaßen aus:

Bild

Eine automatische Hochstufung ist nicht möglich, da DC2 den Zustand von DC1 niemals sicher bestimmen kann.

In diesem Szenario sollte pg_ctl promote nicht verwendet werden. Stattdessen muss der funktionsfähige Cluster „manuell hochgestuft“ werden, indem der Abschnitt standby_cluster aus der dynamischen Konfiguration entfernt wird.

Warnung

Läuft der Quellcluster noch und wird der Standby-Cluster hochgestuft, entsteht eine Split-Brain-Situation.

Um zum „ursprünglichen“ Zustand zurückzukehren, gibt es nur zwei Möglichkeiten:

  • Den Abschnitt standby_cluster wieder hinzufügen. Dies löst pg_rewind aus. Damit pg_rewind ordnungsgemäß funktioniert, muss der Cluster mit data page checksums (Option --data-checksums für initdb) initialisiert worden sein und/oder wal_log_hints muss auf on gesetzt sein. Dennoch kann pg_rewind aus anderen Gründen fehlschlagen.
  • Den Standby-Cluster vollständig neu aufbauen.

Vor der Hochstufung des Standby-Clusters muss manuell sichergestellt werden, dass der Quellcluster heruntergefahren ist (STONITH). Sobald DC1 wieder verfügbar ist, muss dessen Cluster in einen Standby-Cluster umgewandelt werden.

Zuvor kann die Datenbank manuell untersucht werden, um alle Änderungen zu extrahieren, die zwischen dem Ausfall der Netzwerkverbindung von DC1 zu DC2 und dem manuellen Stoppen des Clusters in DC1 erfolgt sind.

Die extrahierten Änderungen können anschließend auch manuell auf den Cluster in DC2 angewendet werden.

18 - Häufige Fragen

Häufig gestellte Fragen zum Betrieb von Patroni und zur Fehlerbehebung.

Dieser Abschnitt beantwortet die am häufigsten gestellten Fragen zu Patroni. Die Unterabschnitte behandeln jeweils unterschiedliche Themenbereiche.

Wir hoffen, dass sich damit die meisten Fragen klären lassen. Bei weiteren Fragen oder unerwarteten Problemen erläutern die Abschnitte Austausch und Fehler melden , wie Unterstützung angefragt oder Probleme gemeldet werden können.


Vergleich mit anderen HA-Lösungen

Warum benötigt Patroni einen separaten Cluster aus DCS-Knoten, während andere Lösungen wie repmgr ohne ihn auskommen?
HA-Lösungen lassen sich auf verschiedene Weise implementieren, jeweils mit Vor- und Nachteilen.

Software wie repmgr lässt die Knoten miteinander kommunizieren, um zu entscheiden, wann Maßnahmen ergriffen werden sollten.

Patroni stützt sich dagegen auf den im DCS gespeicherten Zustand. Der DCS dient Patroni als maßgebliche Informationsquelle für die Entscheidung, was zu tun ist.

Ein separater DCS-Cluster kann die Architektur aufwendiger machen. Dieser Ansatz verringert jedoch auch die Wahrscheinlichkeit von Split-Brain-Situationen im Postgres-Cluster.

Wie unterscheidet sich Patroni bei der Verwaltung von Postgres von anderen HA-Lösungen?
Patroni verwaltet sowohl die Hochverfügbarkeit des Postgres-Clusters als auch Postgres selbst.

Wenn noch keine Postgres-Knoten existieren, übernimmt Patroni die Initialisierung des Primärservers und der Standby-Knoten sowie die Verwaltung ihrer Postgres-Konfiguration. Existieren die Postgres-Knoten bereits, übernimmt Patroni die Verwaltung des Clusters.

Darüber hinaus verfügt Patroni über Selbstheilungsfunktionen. Wenn ein Primärserver ausfällt, führt Patroni ein Failover zu einem Replikat durch und versucht außerdem, den bisherigen Primärserver als Replikat des neuen Primärservers wieder einzubinden. Ebenso versucht Patroni, ein ausgefallenes Replikat wieder einzubinden.

Deshalb bezeichnen wir Patroni als „Vorlage für HA-Lösungen“. Es geht über die Verwaltung physischer Replikation hinaus und verwaltet Postgres als Ganzes.


DCS

Kann derselbe etcd-Cluster Daten von zwei oder mehr Patroni-Clustern speichern?
Ja, das ist möglich!

Informationen zu einem Patroni-Cluster werden im DCS unter einem Pfad gespeichert, dessen Präfix aus den Patroni-Einstellungen namespace und scope besteht.

Solange die Kombinationen aus namespace und scope der verschiedenen Patroni-Cluster nicht kollidieren, sollte derselbe DCS-Cluster Informationen zu mehreren Patroni-Clustern speichern können.

Was geschieht, wenn verschiedene Patroni-Cluster dieselbe Kombination aus namespace und scope sowie denselben DCS-Cluster verwenden?
Hat der zweite Cluster eine andere Postgres-Systemkennung, erkennt Patroni unter diesem DCS-Pfad inkompatible Daten. Außerhalb des Pause-Modus beendet es sich, statt den zweiten Cluster zu verwalten, weil es davon ausgeht, dass der gespeicherte Zustand zu einem anderen Cluster gehört und Patroni falsch konfiguriert wurde.

Für unterschiedliche Patroni-Cluster, die denselben DCS-Cluster nutzen, müssen unterschiedliche Kombinationen aus namespace / scope verwendet werden.

Was geschieht beim Verlust des DCS-Clusters?
Der DCS speichert im Wesentlichen den Status und die dynamische Konfiguration des Patroni-Clusters.

Als unmittelbare Folge wechseln alle Patroni-Cluster, die diesen DCS nutzen, in den schreibgeschützten Modus – sofern der DCS-Failsafe-Modus nicht aktiviert ist.

Was ist beim Verlust des DCS-Clusters zu tun?
Nach dem Verlust des DCS-Clusters sind drei Ergebnisse möglich:

  1. Der DCS-Cluster wird vollständig wiederhergestellt: Auf Patroni-Seite ist nichts zu tun. Sobald der DCS-Cluster wiederhergestellt ist, sollte auch Patroni wieder funktionsfähig werden;
  2. Der DCS-Cluster wird an derselben Stelle neu erstellt, und die Endpunkte bleiben unverändert. Auf Patroni-Seite sind keine Änderungen erforderlich;
  3. Ein neuer DCS-Cluster mit anderen Endpunkten wird erstellt. Die DCS-Endpunkte müssen in der Patroni-Konfiguration jedes Patroni-Knotens aktualisiert werden.

In den Szenarien 2. und 3. erstellt Patroni die Statusinformationen anhand des aktuellen Cluster-Zustands neu. Außerdem stellt es die dynamische Konfiguration im DCS aus der Backup-Datei patroni.dynamic.json wieder her, die im Postgres-Datenverzeichnis jedes Mitglieds des Patroni-Clusters gespeichert ist.

Was geschieht, wenn die Mehrheit im DCS-Cluster verloren geht?
Der DCS reagiert nicht mehr, woraufhin Patroni den aktuellen lesenden und schreibenden Postgres-Knoten herabstuft.

Dabei ist zu beachten: Patroni stützt seine Aktionen im Cluster auf den Zustand des DCS.

Mit dem DCS-Failsafe-Modus lassen sich die Auswirkungen dieser Situation abmildern.


patronictl

Muss patronictl auf dem Patroni-Host ausgeführt werden?
Nein, das ist nicht erforderlich.

Bei Zugriff auf den Patroni-Host ist es praktisch, patronictl dort auszuführen, da dieselbe Konfigurationsdatei des Agenten patroni auch für patronictl verwendet werden kann.

patronictl ist jedoch im Wesentlichen ein Client und kann auch auf entfernten Rechnern ausgeführt werden. Es benötigt lediglich eine ausreichende Konfiguration, um den DCS und die REST API der Patroni-Mitglieder zu erreichen.

Warum werden die Informationen zu einem Patroni-Mitglied nicht mehr in der Ausgabe von patronictl list angezeigt?
Die von patronictl list angezeigten Informationen basieren auf dem Inhalt des DCS.

Wenn Informationen zu einem Mitglied aus dem DCS verschwunden sind, läuft der Patroni-Agent auf diesem Knoten sehr wahrscheinlich nicht mehr oder kann nicht mit dem DCS kommunizieren.

Da das Mitglied die Informationen nicht aktualisieren kann, laufen sie im DCS schließlich ab. Folglich erscheint das Mitglied nicht mehr in der Ausgabe von patronictl list .

Warum sind die Informationen zu einem Patroni-Mitglied in der Ausgabe von patronictl list nicht aktuell?
Die von patronictl list angezeigten Informationen basieren auf dem Inhalt des DCS.

Standardmäßig aktualisiert Patroni diese Informationen etwa alle loop_wait Sekunden. Selbst wenn alles ordnungsgemäß funktioniert, können die im DCS gespeicherten Informationen also bis zu loop_wait Sekunden hinter dem tatsächlichen Zustand zurückliegen.

Dies gilt jedoch nicht ausnahmslos. Manche Patroni-Operationen aktualisieren die DCS-Informationen sofort.


Konfiguration

Was unterscheidet die dynamische von der lokalen Konfiguration?
Die dynamische (oder globale) Konfiguration wird im DCS gespeichert und auf alle Mitglieder des Patroni-Clusters angewendet. Sie sollte der bevorzugte Ort für Konfigurationseinstellungen sein.

Knotenspezifische Einstellungen oder Werte, die die globale Konfiguration überschreiben sollen, sollten nur auf dem jeweiligen Patroni-Mitglied als lokale Konfiguration gesetzt werden. Diese lokale Konfiguration kann über die Konfigurationsdatei oder über Umgebungsvariablen festgelegt werden.

Weitere Informationen unter Konfiguration .

Welche Konfigurationsarten gibt es in Patroni, und welche haben Vorrang?
Es gibt folgende Arten:

  • Dynamische Konfiguration: gilt für alle Mitglieder;
  • Lokale Konfiguration: gilt für das lokale Mitglied und überschreibt die dynamische Konfiguration;
  • Umgebungskonfiguration: gilt für das lokale Mitglied und überschreibt sowohl die dynamische als auch die lokale Konfiguration.

Hinweis: Einige Postgres-GUCs können nur global, also über die dynamische Konfiguration, gesetzt werden. Außerdem erzwingt Patroni für manche GUCs einen fest programmierten Wert.

Weitere Informationen unter Konfiguration .

Gibt es eine Hilfe zum Erstellen der Patroni-Konfigurationsdatei?
Ja.

Mit patroni --generate-sample-config kann eine Patroni-Beispielkonfiguration erstellt werden. patroni --generate-config erstellt eine Patroni-Konfiguration auf Basis einer bestehenden Postgres-Instanz.

Weitere Einzelheiten finden sich unter Beispielkonfiguration erzeugen und Konfiguration erzeugen .

Parameter unter bootstrap.dcs wurden geändert, aber Patroni wendet die Änderungen nicht auf die Cluster-Mitglieder an. Woran liegt das?
Die unter bootstrap.dcs konfigurierten Werte werden nur bei der Initialisierung eines neuen Clusters verwendet. Während dieser Initialisierung werden sie in den DCS geschrieben.

Nach Abschluss der Initialisierung lässt sich die dynamische Konfiguration nur noch über den DCS ändern.

Weitere Einzelheiten folgen in der nächsten Frage.

Wie lässt sich die dynamische Konfiguration ändern?
Dafür muss die Konfiguration im DCS geändert werden. Dies ist auf folgende Weise möglich:

Wie lässt sich die lokale Konfiguration ändern?
Dafür muss die Konfigurationsdatei des jeweiligen Patroni-Mitglieds geändert und dem Patroni-Agenten das Signal SIGHUP gesendet werden. Dies ist auf folgende Weise möglich:

  • Eine POST-Anfrage an den REST-API-Endpunkt zum Neuladen senden; oder

  • patronictl reload ausführen; oder

  • Dem Patroni-Prozess lokal das Signal SIGHUP senden:

    • Wurde Patroni über systemd gestartet, kann der Befehl systemctl reload PATRONI_UNIT.service verwendet werden, wobei PATRONI_UNIT der Name des Patroni-Dienstes ist; oder
    • Wurde Patroni auf andere Weise gestartet, muss der Prozess patroni ermittelt und kill -s HUP PID ausgeführt werden. Dabei ist PID die Prozess-ID des Prozesses patroni.

Hinweis: In manchen Fällen funktioniert das Neuladen mit patronictl reload möglicherweise nicht:

  • Abgelaufene REST-API-Zertifikate: Dies lässt sich mit der Option -k von patronictl umgehen;
  • Falsche Zugangsdaten: beispielsweise wenn die Zugangsdaten für restapi oder ctl in der Konfigurationsdatei geändert werden und dieselbe Datei für Patroni und patronictl verwendet wird.

Wie lässt sich die Umgebungskonfiguration ändern?
Patroni liest die Umgebungskonfiguration nur beim Start ein.

Nach einer Änderung der Umgebungskonfiguration muss daher der jeweilige Patroni-Agent neu gestartet werden.

Darauf achten, kein Failover im Cluster auszulösen! Hierzu kann patronictl pause hilfreich sein.

Wie lassen sich wiederholte Heartbeat-Protokollzeilen im Normalbetrieb reduzieren?

Wenn wiederholte Zeilen wie Lock owner: ... und no action. I am ... die Protokolle überladen, log.deduplicate_heartbeat_logs: true konfigurieren.

Dies kann entweder in der Patroni-YAML-Datei (Protokollierungseinstellungen ) oder mit PATRONI_LOG_DEDUPLICATE_HEARTBEAT_LOGS=true festgelegt werden.

Dabei ist zu beachten: Das Unterdrücken wiederholter Heartbeat-Meldungen reduziert das Protokollvolumen. Es entfällt aber auch die Sicht auf den Heartbeat jedes einzelnen Schleifendurchlaufs, die bei der Diagnose eines Failovers hilfreich sein kann.

Was geschieht, wenn ein Postgres-GUC geändert wird, der ein Neuladen erfordert?
Wenn die dynamische oder lokale Konfiguration wie in den vorherigen Fragen beschrieben geändert wird, übernimmt Patroni das Neuladen der Postgres-Konfiguration.

Was geschieht, wenn ein Postgres-GUC geändert wird, der einen Neustart erfordert?
Patroni markiert die betroffenen Mitglieder mit dem Flag pending restart.

Wann und wie die Mitglieder neu gestartet werden, muss selbst festgelegt werden. Der Neustart ist auf folgende Weise möglich:

Hinweis: Einige Postgres-GUCs erfordern eine besondere Reihenfolge beim Neustart der Postgres-Knoten. Weitere Einzelheiten finden sich unter GUCs für gemeinsam genutzten Speicher .

Was unterscheidet etcd und etcd3 in der Patroni-Konfiguration?
etcd verwendet die API-Version 2 von etcd, während etcd3 die API-Version 3 von etcd verwendet.

Zu beachten ist, dass Informationen, die mit API-Version 2 gespeichert wurden, nicht mit API-Version 3 verwaltet werden können und umgekehrt.

Die Verwendung von etcd3 anstelle von etcd wird empfohlen, weil:

  • API-Version 2 ab etcd v3.4 standardmäßig deaktiviert ist;
  • API-Version 2 mit etcd v3.6 vollständig entfernt wurde.

use_slots ist in der Patroni-Konfiguration aktiviert. Wenn ein Cluster-Mitglied eine Zeit lang offline ist, wird sein Replikationsslot jedoch auf dem vorgelagerten Knoten gelöscht. Wie lässt sich das vermeiden?
Es gibt zwei Möglichkeiten:

  1. member_slots_ttl kann angepasst werden (Standardwert 30min, verfügbar seit Patroni 4.0.0 und ab PostgreSQL 11). Replikationsslots abwesender Mitglieder werden dann nicht entfernt, solange ihre Ausfallzeit unter dem konfigurierten Grenzwert liegt.
  2. Für die Mitglieder können permanente physische Replikationsslots konfiguriert werden.

Seit Patroni 3.2.0 können Slots für Mitglieder als permanente, von Patroni verwaltete Slots eingerichtet werden.

Ab PostgreSQL 11 erstellt Patroni die permanenten physischen Slots auf allen Knoten, entfernt sie nicht und rückt ihre LSN auf allen Knoten entsprechend der vom Mitglied bereits konsumierten LSN vor.

Wird das betreffende Mitglied später entfernt, liegt die Anpassung der Konfiguration permanenter Slots in Ihrer Verantwortung. Andernfalls behält Patroni die Slots dauerhaft bei.

Hinweis: Auch vor Patroni 3.2.0 konnten Slots für Mitglieder als permanente physische Slots konfiguriert werden. Sie wurden jedoch nur auf dem aktuellen Leader verwaltet. Bei einem Failover oder Switchover wurden diese Slots auf dem neuen Leader erstellt. Dies garantierte aber nicht, dass dort alle WAL-Segmente für den abwesenden Knoten vorhanden waren.

Hinweis: Selbst mit Patroni 3.2.0 kann eine kleine Race Condition auftreten. Direkt bei der Erstellung auf dem Replikat kann der Slot weiter fortgeschritten sein als derselbe Slot auf dem Leader. Wenn niemand den Slot konsumiert, können nach einem Failover deshalb weiterhin Dateien fehlen. Daher wird die Konfiguration kontinuierlicher Archivierung empfohlen, um benötigtes WAL wiederherstellen oder PITR durchführen zu können.

Was unterscheidet loop_wait, retry_timeout und ttl?
Patroni führt regelmäßig einen sogenannten HA-Zyklus durch. Dabei prüft es den Zustand des Clusters anhand mehrerer Kontrollen und ergreift abhängig vom Ergebnis gegebenenfalls Maßnahmen, etwa ein Failover zu einem Standby.

loop_wait legt fest, wie lange Patroni in Sekunden vor dem nächsten HA-Prüfzyklus warten sollte.

retry_timeout legt die Wartezeit für Wiederholungsversuche beim DCS und bei Postgres fest. Reagiert der DCS beispielsweise länger als retry_timeout Sekunden nicht, kann Patroni den Primärserver vorsorglich herabstufen.

ttl legt die Lease-Dauer des leader-Locks im DCS fest. Kann der aktuelle Leader die Lease während seiner HA-Zyklen länger als ttl nicht erneuern, läuft sie ab. Dadurch wird eine leader race im Cluster ausgelöst.

Hinweis: Beim Ändern dieser Einstellungen ist zu beachten, dass Patroni die im Abschnitt Dynamische Konfiguration beschriebenen Regeln und Mindestwerte erzwingt.


Verwaltung von Postgres

Können Postgres-GUCs direkt in der Postgres-Konfiguration geändert werden?
Ja, dies sollte jedoch vermieden werden.

Patroni verwaltet die Postgres-Konfiguration und kann Änderungen an den Konfigurationsdateien später überschreiben.

Es gibt einige Möglichkeiten, die Konfiguration außerhalb der Verwaltung durch Patroni anzupassen:

  • Postgres-GUCs über $PGDATA/postgresql.base.conf ändern; oder
  • postgresql.custom_conf festlegen. Diese Datei wird dann anstelle von postgresql.base.conf verwendet und kann extern verwaltet werden; oder
  • GUCs mit ALTER SYSTEM / ALTER DATABASE / ALTER USER ändern.

Weitere Informationen finden sich im Abschnitt Wichtige Konfigurationsregeln .

In jedem Fall wird empfohlen, die gesamte Postgres-Konfiguration über Patroni zu verwalten. Das zentralisiert die Verwaltung und erleichtert bei Bedarf die Fehlersuche in Patroni.

Können Postgres-Knoten direkt neu gestartet werden?
Nein, Postgres sollte nicht direkt verwaltet werden!

Jeder Versuch, den Postgres-Server ohne Patroni neu zu starten, kann ein Failover im Cluster auslösen.

Wenn der Postgres-Server verwaltet werden muss, sind dafür die von Patroni bereitgestellten Verfahren zu verwenden.

Kann Patroni die Verwaltung eines bestehenden Postgres-Clusters übernehmen?
Ja, das ist möglich!

Eine ausführliche Anleitung findet sich unter Bestehende Daten übernehmen .

Wie verwaltet Patroni Postgres?
Patroni startet und stoppt Postgres durch Aufruf der ausführbaren Postgres-Dateien wie pg_ctl und postgres.

Daher MÜSSEN alle anderen Instanzen deaktiviert werden, die Postgres-Cluster verwalten könnten, etwa systemd-Units wie postgresql.service. Nur Patroni sollte Postgres-Instanzen im Cluster starten, stoppen und hochstufen können. Andernfalls können Split-Brain-Situationen entstehen. Fällt beispielsweise der als Primärserver laufende Knoten aus und die Unit postgresql.service ist aktiviert, kann diese Postgres wieder starten und dadurch einen Split Brain verursachen.


Konzepte und Voraussetzungen

Welche Anwendungen gehören zu Patroni?
Patroni wird im Wesentlichen mit zwei Anwendungen ausgeliefert:

  • patroni: Der Patroni-Agent verwaltet einen Postgres-Knoten;
  • patronictl : Ein Befehlszeilenwerkzeug zur Interaktion mit einem Patroni-Cluster (Switchover, Neustarts, Konfigurationsänderungen usw.). Weitere Informationen finden sich unter patronictl .

Was ist ein standby cluster in Patroni?
Ein Cluster, in dem kein Postgres-Primärserver läuft, also kein Mitglied mit Lese- und Schreibzugriff.

Solche Cluster replizieren Daten aus einem anderen Cluster und sind in der Regel für die Replikation zwischen Rechenzentren nützlich.

Der Leader des Clusters ist ein Standby, der Änderungen von einem entfernten Postgres-Knoten repliziert. Die übrigen Standbys sind für kaskadierende Replikation von diesem Leader-Mitglied konfiguriert.

Hinweis: Der Standby-Cluster weiß nichts über den Quellcluster, von dem er repliziert. Er kann sogar restore_command anstelle von WAL-Streaming verwenden und einen vollständig unabhängigen DCS-Cluster nutzen.

Weitere Einzelheiten finden sich unter Standby-Cluster .

Was ist ein leader in Patroni?
Ein leader in Patroni koordiniert gewissermaßen den Cluster.

In einem regulären Patroni-Cluster ist der leader der Knoten mit Lese- und Schreibzugriff.

In einem Patroni-Standby-Cluster repliziert der leader (auch als standby leader bezeichnet) von einem entfernten Postgres-Knoten und gibt diese Änderungen per kaskadierender Replikation an die anderen Mitglieder des Standby-Clusters weiter.

Benötigt Patroni eine Mindestanzahl an Postgres-Knoten im Cluster?
Nein, Patroni kann mit beliebig vielen Postgres-Knoten betrieben werden.

Dabei ist zu beachten: Patroni ist vom DCS entkoppelt.

Was bedeutet Pause in Patroni?
Mit der von Patroni angebotenen Pause kann seine Verwaltung von Postgres vorübergehend zurückgenommen werden.

Dies ist vor allem bei Wartungsarbeiten am Cluster nützlich, wenn Patroni keine HA-Entscheidungen treffen soll, etwa ein Failover zu einem Standby beim Stoppen des Primärservers.

Weitere Informationen finden sich unter Pause .


Automatisches Failover

Wie funktioniert automatisches Failover in Patroni?
Das automatische Failover von Patroni basiert auf der sogenannten leader race.

Patroni speichert den Cluster-Status im DCS, darunter einen leader-Lock, der den Namen des Patroni-Mitglieds enthält, das aktuell der leader des Clusters ist.

Dieser leader-Lock hat eine Gültigkeitsdauer. Erneuert der Leader-Knoten die Lease des leader-Locks nicht rechtzeitig, läuft der Schlüssel im DCS schließlich ab.

Wenn der leader-Lock abläuft, wird die sogenannte leader race ausgelöst: Alle Knoten prüfen, ob sie die besten Kandidaten für die Übernahme der Rolle leader sind. Zu diesen Prüfungen gehören Aufrufe der REST API aller anderen Patroni-Mitglieder.

Alle Patroni-Mitglieder, die sich als besten Kandidaten für die Übernahme des leader-Locks ermitteln, versuchen, ihn zu übernehmen. Das erste Patroni-Mitglied, das den leader-Lock übernehmen kann, stuft sich zum Knoten mit Lese- und Schreibzugriff (oder zum standby leader) hoch. Die anderen werden so konfiguriert, dass sie ihm folgen.

Kann automatisches Failover im Patroni-Cluster vorübergehend deaktiviert werden?
Ja, das ist möglich!

Dazu kann der Cluster vorübergehend pausiert werden. Dies ist typischerweise bei Wartungsarbeiten nützlich.

Um automatisches Failover wieder zu aktivieren, muss lediglich die Pause des Clusters aufgehoben werden.

Weitere Informationen finden sich unter Pause .


Initialisierung und Erstellung von Standbys

Wie erstellt Patroni einen Postgres-Primärserver und einen Postgres-Standby?
Standardmäßig initialisiert Patroni einen neuen Cluster mit initdb und erstellt Standby-Knoten mit pg_basebackup aus einer Kopie des Mitglieds leader.

Dieses Verhalten lässt sich durch eigene Bootstrap-Methoden und Methoden zur Replikaterstellung anpassen.

Eigene Methoden sind beispielsweise nützlich, um Backups wiederherzustellen, die mit Werkzeugen wie pgBackRest oder Barman erstellt wurden.

Ausführliche Informationen finden sich unter Benutzerdefinierter Bootstrap und Benutzerdefinierte Replikaterstellung .


Überwachung

Wie lässt sich ein Patroni-Cluster überwachen?
Patroni stellt über seine REST API einige praktische Endpunkte bereit:

  • /metrics: stellt Überwachungsmetriken in einem von Prometheus lesbaren Format bereit;
  • /patroni: stellt den Status des lokalen Patroni/Postgres-Knotens im JSON-Format bereit. Die Informationen ähneln stark denen des Endpunkts /metrics.

Diese Endpunkte können für Überwachungsprüfungen verwendet werden.

19 - Versionshinweise

Chronologische Versionshinweise und Änderungshistorie von Patroni.


Version 4.1.5

Veröffentlicht am 2026-08-12

Verbesserungen der Kompatibilität

  • Kompatibilität mit PostgreSQL 14.24, 15.19, 16.15, 17.11, 18.6 (Alexander Kukushkin)

    Die neue GUC output_plugin_libraries wurde hinzugefügt. Sie beschränkt die Ausgabe-Plugins für die logische Dekodierung.

Verbesserungen

  • Verbindungsabbrüche der REST API auf Stufe DEBUG statt WARNING protokollieren (Kyle McLaren)

    Die üblichen Varianten von „Client hat die Verbindung während des Schreibens getrennt“ werden unterdrückt, ohne die Behandlung tatsächlicher Fehler zu beeinträchtigen, die nicht die Verbindung betreffen.

Fehlerbehebungen

  • Ausrichtung bei der Validierung von thread_stack_size korrigieren (Sundong Kim)

    Der Wert aligned im Schemaeintrag für thread_stack_size wurde von 65535 auf 65536 korrigiert. Zuvor lehnte patroni --validate-config fast jeden realistischen Wert ab, einschließlich des Standardwerts 524288, den der Daemon selbst anwendet.

  • Bei der Validierung von synchronous_mode auch 'quorum' und Zeichenketten mit booleschen Werten akzeptieren (Eray Araz)

    patroni --validate-config lehnte zuvor Werte für synchronous_mode wie quorum und boolesche Zeichenketten im PostgreSQL-Stil ab, die zur Laufzeit akzeptiert werden.

Version 4.1.4

Veröffentlicht am 2026-07-07

Fehlerbehebungen

  • Die Umgebungsvariable NOTIFY_SOCKET vor Verwendung des Pakets systemd prüfen (Polina Bungina)

    Das Paket wird nur dann importiert und verwendet, wenn die Umgebungsvariable NOTIFY_SOCKET gesetzt ist. Dadurch wird die Ausnahme FileNotFoundError: [Errno 2] No such file or directory vermieden.

  • Die Abfrage von pg_replication_slots vereinheitlichen (Polina Bungina)

    Eine fehlerhafte Behandlung der Werte failover und synced führte beim Entfernen fehlerhafter logischer Replikations-Slots zu KeyError-Ausnahmen.

  • Versionsabhängige Authentifizierungsparameter bei der Konfigurationserzeugung berücksichtigen (Polina Bungina)

    Der Befehl patroni --generate-config entfernt anhand der über eine PostgreSQL-Verbindung ermittelten Version alle nicht anwendbaren Authentifizierungsparameter, die versehentlich aus der Umgebung übernommen wurden.

  • pg_rewind behandeln, während eine PostgreSQL-Instanz als Standby startet (Alexander Kukushkin)

    Wenn eine PostgreSQL-Instanz läuft, aber noch keine Verbindungen annimmt, wird auf die Informationen von pg_controldata zurückgegriffen.

  • Prometheus-Metriktyp für patroni_postgres_timeline korrigieren (Huseyin Demir)

    Die Metrik patroni_postgres_timeline wird als gauge statt als counter deklariert, da sie nicht immer monoton steigt (sie kann beispielsweise auf 0 zurückgesetzt werden, wenn eine PostgreSQL-Instanz nicht läuft).

  • Watchdog erst stoppen, wenn alle Client-Backends vollständig beendet sind (Alexander Kukushkin)

    Wenn primary_stop_timeout kürzer als die minimale Watchdog-Zeitüberschreitung war und die Zeitüberschreitung beim Stoppen tatsächlich eintrat, deaktivierte Patroni zuvor den Watchdog, bevor alle Client-Backends beendet waren.

  • Zeitüberschreitung einer Anweisung bei der Überwachungsabfrage behandeln (Alexander Kukushkin)

    Bei einer Zeitüberschreitung der Anweisung wird auf die zwischengespeicherte Rolle zurückgegriffen, um eine Herabstufung des Primärservers zu vermeiden. Außerdem wird pg_stat_statements.track für die Überwachungsabfrage zwingend auf none gesetzt, um aufwendige GC-Aufrufe von pg_stat_statements zu vermeiden.

  • Von Patroni verwaltete Replikations-Slots mit wal_status=lost löschen (Alexander Kukushkin)

    Replikations-Slots mit wal_status=lost sind nicht mehr verwendbar. Patroni löscht solche Slots jetzt und erstellt sie bei Bedarf neu.

  • Rollendarstellung im Validierungsfehler für patronictl-Mitglieder korrigieren (Polina Bungina)

    In der Ausnahmemeldung wird die korrekte Zeichenkettendarstellung verwendet. So werden fehlerhaft formatierte Meldungen wie Error: No CtlPostgresqlRole.REPLICA among provided members vermieden.

Version 4.1.3

Veröffentlicht am 2026-05-05

Verbesserungen der Stabilität

  • Falsch bezeichneten etcd-Fehler korrekt behandeln (Ants Aasma)

    Aktuelle etcd-Versionen lösen den Fehler Unknown aus, wenn während der Aktualisierung der Lease der etcd-Leader verloren geht. Patroni überschreibt den gemeldeten Fehlercode jetzt mit Unavailable.

Fehlerbehebungen

  • Version der ausführbaren Datei verwenden, wenn die Datei PG_VERSION fehlt (Polina Bungina)

    In manchen Fällen, etwa bei einem benutzerdefinierten Bootstrap, befindet sich die Datei PG_VERSION möglicherweise nicht im Datenverzeichnis. Patroni behandelte die Version in diesem Fall als 0.0, was in Teilen der versionsabhängigen Logik zu Problemen führte. Mit dieser Korrektur versucht Patroni in solchen Fällen, die Version über die ausführbare Datei zu ermitteln.

  • Initialisierung der Protokollierung umstrukturieren, damit frühe Protokollmeldungen nicht verloren gehen (Alexander Kukushkin)

    PatroniLogger wird vor dem Laden von Config erstellt, um frühe Protokollmeldungen zu erfassen.

  • MONOTONIC_USEC in die systemd-Benachrichtigung RELOADING=1 aufnehmen (Alexander Kukushkin)

    systemd 257+ verlangt bei Diensten mit Type=notify-reload neben RELOADING=1 auch MONOTONIC_USEC. Ohne diese Angabe bleibt systemctl reload unbegrenzt hängen.

Verbesserungen

  • Crash-Recovery im Einzelbenutzermodus überspringen, wenn backup_label vorhanden ist (Vadim Ponomarev)

    Beim Start eines Replikats, das aus einem externen Backup wiederhergestellt wurde (ohne benutzerdefinierte Bootstrap-Methode), wird die Crash-Recovery im Einzelbenutzermodus übersprungen. PostgreSQL übernimmt sie stattdessen beim normalen Start.

  • Bei Ausführung unter systemd ohne das Paket python-systemd warnen (Alexander Kukushkin)

    Statt beim Start „systemd integration is not supported“ zu protokollieren, wird auf NOTIFY_SOCKET geprüft. Eine Warnung erfolgt nur, wenn Patroni tatsächlich unter systemd läuft und das Paket python-systemd nicht installiert ist.

Version 4.1.2

Veröffentlicht am 2026-04-21

Verbesserungen der Systemd-Unterstützung

  • Unterstützung für den systemd-Unit-Typ notify-reload hinzufügen (Ronan Dunklau)

    Durch die Benachrichtigungen RELOADING=1 und READY=1 an systemd kann systemctl reload warten, bis Patroni das Neuladen der Konfiguration tatsächlich verarbeitet hat.

  • Beim Herunterfahren die Benachrichtigung STOPPING=1 an systemd senden (Alexander Kukushkin)

    Patroni benachrichtigt systemd jetzt entsprechend dem systemd-notify-Protokoll korrekt darüber, dass es heruntergefahren wird.

  • Benachrichtigungen von PostgreSQL an systemd verhindern (Alexander Kukushkin)

    NotifyAccess=all wurde aus der systemd-Unit-Beispieldatei entfernt. Beim Start von PostgreSQL wird NOTIFY_SOCKET aus der Umgebung gefiltert, damit PostgreSQL weder READY=1 noch STOPPING=1 an systemd sendet. Bei der Übernahme einer PostgreSQL-Instanz, die vor Patroni gestartet wurde und bereits NOTIFY_SOCKET besitzt, wird während des Herunterfahrens von PostgreSQL erneut READY=1 gesendet, um dessen STOPPING=1 entgegenzuwirken.

Version 4.1.1

Veröffentlicht am 2026-04-08

Verbesserungen der Stabilität

  • Kompatibilität mit Änderungen an Threads in python 3.11+ (Alexander Kukushkin)

    Das Starten und Stoppen von Threads zur Laufzeit wird vermieden. Thread-Pools für die REST API und für die Ausführung asynchroner Aufgaben wurden eingeführt. Die globalen Einstellungen thread_pool_size und restapi.thread_pool_size sind konfigurierbar.

  • Kompatibilität mit python 3.14 (Alexander Kukushkin)

    Tests werden mit python 3.14 ausgeführt und Kompatibilitätsprobleme behoben.

  • Kompatibilität mit den etcd-Sicherheitskorrekturen in v3.6.9, v3.5.28 und v3.4.42 (Alexander Kukushkin)

    Diese etcd-Versionen behoben CVEs und änderten das Verhalten so, dass das Lesen der Clustertopologie und Lease-Keepalives ohne Authentifizierung nicht mehr zulässig sind. Patroni berücksichtigt dies jetzt durch Authentifizierung bei der Erkennung von Mitgliedern und bei Lease-Keepalives, erneute Authentifizierung bei Authentifizierungsfehlern sowie entsprechende Wiederholungen von Anfragen.

  • Verbesserte Fehlerbehandlung für etcd3 (Alexander Kukushkin)

    Fehlerhafte JSON-Antworten werden behandelt, JSON-Fehler flexibler ausgewertet und interne etcd-Fehler besser gemeldet.

Fehlerbehebungen

  • Leader-Aktualisierung bei vorübergehendem Kubernetes-Fehler 403 wiederholen (Sophia Ruan, Alexander Kukushkin)

    Wenn die Kubernetes-API vorübergehend 403 Permission Denied zurückgibt (etwa bei vorübergehenden RBAC-Problemen), prüft Patroni jetzt, ob der aktuelle Knoten weiterhin Leader ist, und wiederholt die Leader-Aktualisierung innerhalb von retry_timeout, statt den Knoten sofort herabzustufen.

  • Problem beim Umbenennen des Leader-Knotens im synchronen Modus während einer Pause beheben (Alexander Kukushkin)

    Der Schlüssel /sync wurde nach dem Umbenennen des Leader-Knotens mit einem Patroni-Neustart während einer Pause (ohne Postgres-Neustart) nicht aktualisiert. Dadurch konnte Patroni nach dem nächsten Neustart ohne Pause keine Hochstufung durchführen.

  • pg_rewind-Prüfung auslösen, wenn derselbe Primärserver seine Timeline erhöht hat (Alexander Kukushkin)

    Eine solche Timeline-Erhöhung kann durch Crash-Recovery im Einzelbenutzermodus mit anschließender Hochstufung nach Übernahme des Leader-Schlüssels entstehen, während andere Replikatknoten vom DCS isoliert sind. In diesem Fall lösten die Replikatknoten den pg_rewind-Zustandsautomaten nicht aus, weil sich der Leader und damit primary_conninfo nicht geändert hatten.

  • Superuser-Passwort beim Bootstrap mit initdb nur schreiben, wenn es nicht leer ist (Michael Banck)

    Das Schreiben eines leeren Passworts beim Bootstrap mit initdb führte zu Problemen.

  • Fehler bei failover_priority mit synchronous_mode=on beheben (Alexander Kukushkin)

    Werte von tag.failover_priority wurden ignoriert, wenn synchronous_node_count > 1 galt.

  • Fehler beim Passwortvergleich in primary_conninfo beheben (Alexander Kukushkin)

    Ab PostgreSQL 10 verwendet Patroni in primary_conninfo eine Passwortdatei. Nach einer Änderung des Replikationspassworts in der YAML-Dateikonfiguration mit anschließendem Neuladen aktualisierte Patroni diese Passwortdatei nicht.

  • Replikat mit dem Tag nofailover im Pause-Modus nicht neu starten (Alexander Kukushkin)

    Patroni startete zuvor ein manuell heruntergefahrenes PostgreSQL-Replikat im Pause-Modus, wenn dessen Tag nofailover auf true gesetzt war.

  • check_recovery_conf() korrigieren, wenn PostgreSQL gerade startet (Alexander Kukushkin)

    Bei PostgreSQL v12 und neuer kann pg_settings nicht abgefragt werden, solange der Server noch startet und keine Verbindungen annimmt. Fehlende Recovery-Parameter werden jetzt beim Schreiben von postgresql.conf dem internen Zustand hinzugefügt. Außerdem wurde die Prüfung Postgresql.is_starting() in Ha.is_healthiest_node() wiederhergestellt.

  • Benutzeroptionen im Dictionary-Format für initdb/basebackup validieren (m4rrypro)

    Wenn Optionen für initdb oder basebackup als Dictionary statt als Liste angegeben wurden, wurde die Validierung durch option_is_allowed() umgangen, wodurch gesperrte Optionen verwendet werden konnten.

  • Serverseitige Komprimierung für die Option basebackup zulassen (m4rrypro)

    Die Option compress war für basebackup vollständig gesperrt. Seit PostgreSQL 15 ist serverseitige Komprimierung jedoch sinnvoll und funktioniert transparent mit dem Plain-Format. Clientseitige Komprimierung wird weiterhin abgelehnt.

  • PostgreSQL-Konfiguration während eines benutzerdefinierten Bootstraps nicht neu laden (Alexander Kukushkin)

    Ein benutzerdefinierter Bootstrap kann komplex sein und PostgreSQL mehrfach starten und stoppen. Das Neuladen der PostgreSQL-Konfiguration während dieses Vorgangs konnte zu unerwartetem Verhalten führen.

  • Prüfen, ob postgresql.parameters ein Dictionary ist (Alexander Kukushkin)

    Eine neue Konfiguration wird verworfen, wenn postgresql.parameters kein Dictionary ist.

Version 4.1.0

Veröffentlicht am 2025-09-23

Neue Funktionen

  • Unterstützung für den systemd-Unit-Typ „notify“ hinzufügen (Ronan Dunklau)

    Ohne den Unit-Typ notify ist es möglich, Patroni zu starten und ihm unmittelbar über systemd ein SIGHUP-Signal zu senden. Dadurch wird Patroni beendet, bevor es seine Signal-Handler einrichten konnte.

  • Informationen zu empfangener und wiedergegebener LSN sowie zum jeweiligen Rückstand in API und ctl bereitstellen (Polina Bungina)

    Der Patroni-REST-API-Endpunkt /cluster und der Befehl patronictl list liefern jetzt für jedes Replikatmitglied die empfangene LSN, die wiedergegebene LSN, den Empfangsrückstand und den Wiedergaberückstand.

  • Saubere Herabstufung zu einem Standby-Cluster sicherstellen (Polina Bungina)

    Das Hinzufügen des Abschnitts standby_cluster in der dynamischen Konfiguration führt zu einer sauberen Herabstufung des Clusters.

  • Die Befehle patronictl demote-cluster und promote-cluster implementieren (Polina Bungina)

    Die neuen Befehle zur Herabstufung und Hochstufung eines Clusters übernehmen sowohl die Bearbeitung der dynamischen Konfiguration als auch die Prüfung des Ergebnisstatus.

  • Tag sync_priority implementieren (Polina Bungina)

    Dieser Parameter steuert die Priorität eines Mitglieds bei der Auswahl synchroner Replikate, wenn synchronous_mode auf on gesetzt ist.

  • Option --print für --validate-config implementieren (Polina Bungina)

    Nach erfolgreicher Validierung wird die lokale Konfiguration ausgegeben, einschließlich der durch Umgebungsvariablen überschriebenen Einstellungen.

  • kubernetes.bootstrap_labels implementieren (Polina Bungina)

    Mit dieser Funktion können Labels definiert werden, die dem Pod eines Mitglieds in den Zuständen initializing new cluster, running custom bootstrap script, starting after custom bootstrap oder creating replica zugewiesen werden.

  • Konfigurationsoption zur Unterdrückung doppelter Heartbeat-Protokollmeldungen hinzufügen (Michael Morris)

    Ist die Option auf true gesetzt, werden aufeinanderfolgende identische Heartbeat-Protokollmeldungen nicht ausgegeben.

  • Optionales Attribut cluster_type für permanente Replikations-Slots hinzufügen (Michael Banck)

    Damit lässt sich festlegen, ob ein bestimmter permanenter Replikations-Slot immer oder nur auf einem Primär- beziehungsweise Standby-Cluster erstellt werden soll.

  • HTTP-Server-Header konfigurierbar machen (David Grierson)

    Der Konfigurationsparameter restapi.server_tokens wurde eingeführt. Er ermöglicht es, die im HTTP-Server-Header offengelegten Informationen einzuschränken.

  • Readiness-Prüfungen der API für die Replikation auf Replikatmitgliedern implementieren (Ants Aasma)

    Die bisherige Implementierung betrachtete Replikate als bereit, sobald PostgreSQL gestartet war. Mit dieser Änderung gilt ein Replikat-Pod erst dann als bereit, wenn PostgreSQL repliziert und nicht zu weit hinter dem Leader zurückliegt.

Verbesserungen

  • Protokollstufe für Fehler bei der Watchdog-Konfiguration senken (Ants Aasma)

    Die Protokollzeile Could not activate Linux watchdog device wird auf der Debug-Stufe ausgegeben, sofern der Watchdog nicht im Modus required konfiguriert ist. Zuvor wurde sie auf der Info-Stufe ausgegeben.

  • written_lsn und latest_end_lsn aus pg_stat_wal_receiver nutzen (Alexander Kukushkin)

    written_lsn, die tatsächliche Schreib-LSN, wird jetzt dem von pg_last_wal_receive_lsn() gelieferten Wert vorgezogen, der tatsächlich die Flush-LSN ist. latest_end_lsn verweist auf die auf dem Quellhost dauerhaft auf den Datenträger geschriebene WAL-Position. Bei einem Primärserver ermöglicht dies eine genauere Berechnung des Wiedergaberückstands, da die im DCS gespeicherten Werte nur alle loop_wait Sekunden aktualisiert werden.

  • Interaktionen mit Slots vermeiden, die mit der Option failover=true erstellt wurden (Alexander Kukushkin)

    Diese Änderung ist erforderlich, damit die Funktion für logische Failover-Slots vollständig funktioniert.

  • PostgreSQL-Zustand zum REST-API-Endpunkt /metrics hinzufügen (Ivan Filianin)

    Informationen zum Zustand der PostgreSQL-Instanz sind jetzt in der Ausgabe des REST-API-Endpunkts /metrics im Prometheus-Format verfügbar.


Version 4.0.7

Veröffentlicht am 2025-09-22

Neue Funktionen

  • Unterstützung für PostgreSQL 18 RC1 hinzufügen (Alexander Kukushkin)

    Die Validierungsregeln für GUCs wurden erweitert. Patroni behandelt den neuen Hintergrund-Worker für I/O jetzt korrekt.

Fehlerbehebungen

  • Mögliches Problem bei der Auflösung von localhost zu IPv6 unter Windows beheben (András Váczi)

    Bei der Konfiguration von listen_addresses in PostgreSQL beschränken 0.0.0.0 oder 127.0.0.1 die Adressen, auf denen PostgreSQL lauscht auf IPv4 und schließen IPv6 aus. Auf typischen Windows-Systemen wird localhost jedoch häufig standardmäßig zur IPv6-Adresse ::1 aufgelöst. Um Kompatibilität sicherzustellen, konfiguriert Patroni PostgreSQL auf Windows-Systemen jetzt so, dass es auf 127.0.0.1 statt auf localhost lauscht.

  • Globale Konfiguration nur zurückgeben, wenn der Schlüssel /config im DCS vorhanden ist (Alexander Kukushkin)

    Die Patroni-REST-API gab eine leere Konfiguration zurück, statt einen Fehler auszulösen, wenn der Schlüssel /config im DCS fehlte.

  • Fehler beheben, durch den bei nicht verfügbarem etcd der Failsafe-Modus nicht ausgelöst wurde (Alexander Kukushkin)

    Patroni behandelte etcd3-Ausnahmen nicht immer korrekt, weshalb der Failsafe-Modus nicht ausgelöst wurde.

  • Deadlock durch erneuten Eintritt in einen Signal-Handler beheben (Waynerv)

    Bei Patroni in einem Docker-Container mit PID=1 kam es in bestimmten Fällen nach dem Empfang von SIGCHLD zu einem Deadlock.

  • Einen (permanenten) physischen Slot neu erstellen, wenn er kein WAL reserviert (Israel Barth Rubio)

    Permanente physische Replikations-Slots, die außerhalb der Verwaltung durch Patroni ohne WAL-Reservierung erstellt wurden, verursachten den Fehler replication slot cannot be advanced. Um dies zu vermeiden, erstellt Patroni solche Slots jetzt neu.

  • Watch-Abbruchmeldungen in etcd3 korrekt behandeln (Alexander Kukushkin)

    Wenn etcd3 eine Abbruchmeldung an den Watch-Kanal sendet, wird die Verbindung nicht geschlossen. Dadurch verwendet Patroni veraltete Daten. Patroni löst dies jetzt, indem es die Schleife zum Lesen der in Blöcken übertragenen Antwort abbricht und die Verbindung auf seiner Seite schließt.

  • Mit pyopenssl umschlossene HTTPConnection-Sockets behandeln (Alexander Kukushkin)

    Patroni verwendete die durch python-etcd erzwungenen pyopenssl-Schnittstellen nicht korrekt.

Verbesserungen der Dokumentation

  • Hinweise zu Clustern mit 2 Knoten verbessern (Nikolay Samokhvalov)

    Das Verhalten beim Failover und die Anforderungen an den DCS wurden präzisiert.


Version 4.0.6

Veröffentlicht am 2025-06-06

Fehlerbehebungen

  • Fehler beim Failover von einem Leader mit höherer Priorität beheben (Alexander Kukushkin)

    Patroni ignoriert den früheren Leader mit höherer Priorität, wenn dieser dieselbe LSN wie der aktuelle Knoten meldet.

  • Berechtigungen für außerhalb von PGDATA erstellte Dateien postgresql.conf korrigieren (Michael Banck)

    Beim Erstellen der Datei postgresql.conf außerhalb des Verzeichnisses PGDATA wird der systemweite umask-Wert berücksichtigt.

  • Fehler beim Switchover mit synchronous_mode=quorum beheben (Alexander Kukushkin)

    Wenn ein Kandidat angegeben ist, werden die Quorum-Anforderungen nicht geprüft.

  • Veraltete etcd-Knoten durch Vergleich der Cluster-Amtszeit ignorieren (Alexander Kukushkin)

    Der zuletzt bekannte Wert von „raft_term“ des etcd-Clusters wird gespeichert und beim Ausführen von Client-Anfragen mit dem von einem etcd-Knoten gemeldeten Wert von „raft_term“ verglichen.

  • PostgreSQL-Konfigurationsdateien bei SIGHUP aktualisieren (Alexander Kukushkin)

    Zuvor ersetzte Patroni PostgreSQL-Konfigurationsdateien nur, wenn eine Änderung an der globalen oder lokalen Konfiguration erkannt wurde.

  • Von etcd3 ausgelöste Ausnahme Unavailable korrekt behandeln (Alexander Kukushkin)

    Patroni wiederholte solche Anfragen zuvor auf demselben etcd3-Knoten. Der Wechsel zu einem anderen Knoten ist jedoch die bessere Strategie.

  • Lease-Behandlung von etcd3 verbessern (Alexander Kukushkin)

    Patroni erneuert die etcd3-Lease mindestens einmal pro HA-Schleifendurchlauf.

  • Bei Statuscode 409 während des Versuchs, den Leader-Lock zu erwerben, die Annotationen erneut prüfen (Alexander Kukushkin)

    Dasselbe Verhalten wie beim Lesen des Leader-Objekts in Patroni-Version 4.0.3 wurde implementiert.

  • replay_lsn beim Vorrücken von Slots berücksichtigen (Polina Bungina)

    Slots auf Replikaten werden nicht über replay_lsn hinaus vorgerückt. Außerdem wird der Slot bis zur Position replay_lsn vorgerückt, wenn diese bereits größer als die confirmed_flush_lsn dieses Slots auf dem Replikat ist, das Replikat aber die tatsächliche LSN, an der sich der Slot auf dem Primärserver befindet, noch nicht wiedergegeben hat.

  • Ausführung von CHECKPOINT nach einer Hochstufung sicherstellen (Alexander Kukushkin)

    Es konnte vorkommen, dass die Checkpoint-Aufgabe beim Herabstufen nicht zurückgesetzt wurde, weil CHECKPOINT noch nicht abgeschlossen war. Dadurch wurde beim Auslösen der nächsten Hochstufung ein veraltetes result verwendet.

  • Gleichzeitige „offline“-Herabstufungen vermeiden (Alexander Kukushkin)

    Bei langsamem Herunterfahren konnte die nächste Heartbeat-Schleife erneut die Methode zur DCS-Fehlerbehandlung aufrufen. Dies führte zur Warnung AsyncExecutor is busy, demoting from the main thread und zu einem erneuten Start der Offline-Herabstufung.

  • Wert von data_dir vor dem Umbenennen des Datenverzeichnisses nach fehlgeschlagener Initialisierung normalisieren (Waynerv)

    Ein abschließender Schrägstrich im Parameterwert data_dir unterbricht dadurch nicht mehr das Umbenennen nach einer fehlgeschlagenen Initialisierung.

  • Prüfen, ob synchronous_standby_names den erwarteten Wert enthält (Alexander Kukushkin)

    Der Zustandsautomat für synchrone Replikation ohne Quorum prüfte zuvor den tatsächlichen Wert von synchronous_standby_names nicht. Dies führte dazu, dass ein veralteter Wert von synchronous_standby_names verwendet wurde, wenn pg_stat_replication eine Teilmenge von synchronous_standby_names war.


Version 4.0.5

Veröffentlicht am 2025-02-20

Verbesserungen der Stabilität

  • Kompatibilität mit python-json-logger>=3.1 (Alexander Kukushkin)

    Die durch Verwendung der alten API erzeugten Warnungen wurden beseitigt.

  • Kompatibilität mit Python 3.13 (Alexander Kukushkin)

    Tests werden mit Python 3.13 ausgeführt.

  • Kompatibilität mit pyinstaller>=4.4 (Joe Jensen)

    Wenn das Attribut toc von pyinstaller fehlt, wird auf das standardmäßige iter_modules zurückgegriffen.

  • Probleme bei der Unterstützung von PostgreSQL 9.5 behoben (Alexander Kukushkin)

    • Das Ausgabeformat von pg_rewind wird korrekt behandelt.
    • Es wird berücksichtigt, dass das Format von synchronous_standby_names keine Angabe von „num“ unterstützt.
  • Kompatibilität mit den neuesten Änderungen in urlparse (Alexander Kukushkin)

    urlparse akzeptiert keine URLs mit mehreren Hosts und den Zeichen [] mehr. Um das Problem zu umgehen, werden nach Möglichkeit die nativen Wrapper von PQconninfoParse() aus libpq verwendet. Die eigene Implementierung wird nur noch für ältere psycopg2-Versionen genutzt, die gegen eine veraltete libpq-Version gelinkt sind.

Fehlerbehebungen

  • Bei der Neustartbestätigung nur die tatsächlich neu zu startenden Mitglieder angezeigt (András Váczi)

    Zuvor listete die Bestätigung bei patronictl restart <clustername> --pending alle Mitglieder auf, unabhängig davon, ob bei ihnen ein Neustart ausstand.

  • Lang laufende Aufgaben beim Stoppen von Patroni abgebrochen und Datenverzeichnis bei fehlgeschlagenem Replikat-Bootstrap entfernt (Alexander Kukushkin)

    Zuvor konnte Patroni während eines Replikat-Bootstraps stoppen, während pg_basebackup / wal-g / pgBackRest / barman oder ähnliche Programme weiterliefen.

  • Clusternamen mit Schrägstrich in patronictl edit-config korrekt behandelt (Antoni Mur)

    Ein Schrägstrich in cluster_name wird durch einen Unterstrich ersetzt.

  • Zu frühes Löschen physischer Slots vermieden (Alexander Kukushkin)

    Nach einem Failover wird das Entfernen physischer Replikationsslots mit xmin aufgeschoben: auf dem neuen Primärserver bis zu dessen Hochstufung, auf Replikaten bis ein Leader im Cluster vorhanden ist.

  • Alle von subprocess in controldata() ausgelösten Ausnahmen behandelt (Alexander Kukushkin)

    Patroni behandelte nicht alle Ausnahmen korrekt, die beim Aufruf des Werkzeugs pg_controldata auftreten können.

  • Fehler behoben, durch den der Slot für einen früheren Leader beim Failover nicht erhalten blieb (Alexander Kukushkin)

    Patroni verlässt sich nicht mehr fälschlich auf die Anwesenheit von Mitgliedern im DCS, während beim Failover der Schlüssel /member des früheren Leaders genau zur selben Zeit abläuft.

  • Mehrere Fehler im Quorum-Zustandsautomaten behoben (Alexander Kukushkin)

    • Bei der Prüfung, ob funktionsfähige Knoten für die Leader-Wahl vorhanden sind, müssen vor der Herabstufung die Quorum-Anforderungen berücksichtigt werden. Andernfalls kann der frühere Leader in Recovery gelangen und nur von asynchronen Knoten umgeben sein.
    • QuorumStateResolver behandelte den Fall nicht korrekt, dass ein Replikatknoten schnell beitrat und sich wieder trennte.

Verbesserungen

  • Fehlermeldung für eine leere Konfigurationsdatei oder einen Inhalt, der kein Dictionary ist, verbessert (Julian)

    Bei der Prüfung, ob die Patroni-Konfigurationsdatei ein gültiges Mapping-Objekt enthält, wird eine aussagekräftigere Ausnahme ausgelöst.


Version 4.0.4

Veröffentlicht am 2024-11-22

Verbesserungen der Stabilität

  • Kompatibilität mit dem Modul py-consul hinzugefügt (Alexander Kukushkin)

    Das Modul python-consul wird seit Langem nicht mehr gepflegt; py-consul ist der offizielle Ersatz. Die Rückwärtskompatibilität mit python-consul bleibt erhalten.

  • Kompatibilität mit dem Modul prettytable>=3.12.0 hinzugefügt (Alexander Kukushkin)

    Warnungen zu veralteten Funktionen wurden behoben.

  • Kompatibilität mit dem Modul ydiff==1.4.2 (Alexander Kukushkin)

    Kompatibilitätsprobleme mit der neuesten Version wurden behoben, die Version in requirements.txt eingeschränkt und ein Kompatibilitätstest für die neueste Version eingeführt.

Fehlerbehebungen

  • Callback on_role_change nach fehlgeschlagener Recovery des Primärservers ausgeführt (Polina Bungina, Alexander Kukushkin)

    on_role_change wird zusätzlich für einen Primärserver aufgerufen, der nach einem Absturz nicht starten konnte. Dadurch steigt die Wahrscheinlichkeit, dass der Callback ausgeführt wird, auch wenn der anschließende Start als Replikat fehlschlägt.

  • Thread-Leck in patronictl list -W behoben (Alexander Kukushkin)

    Das DCS-Instanzobjekt wird zwischengespeichert, um das Thread-Leck zu vermeiden.

  • Nur unterstützte Parameter in die Verbindungszeichenkette geschrieben (Alexander Kukushkin)

    Patroni übergab zuvor in neueren Versionen eingeführte Parameter in der Verbindungszeichenkette, was zu Verbindungsfehlern führte.


Version 4.0.3

Veröffentlicht am 2024-10-18

Fehlerbehebungen

  • pgaudit bei der Benutzererstellung deaktiviert, damit Passwörter nicht offengelegt werden (kviset)

    Bei aktivierter Erweiterung pgaudit protokollierte Patroni bei der Erstellung die Passwörter für superuser, replication und rewind.

  • Problem bei gemischten Installationen mit Primärserver vor Patroni v4 und Replikaten mit v4+ behoben (Alexander Kukushkin)

    Wenn auf dem Leader eine Patroni-Version vor 4.0.0 läuft, wird xlog_location aus dem Schlüssel /members verwendet, statt die Slot-Position eines Mitglieds aus /status zu lesen. Das bisherige Verhalten führte zur Ansammlung von WAL auf Replikaten.

  • Gültige PostgreSQL-GUCs ohne Patroni-Validator nicht ignoriert (Polina Bungina)

    Wenn eine GUC keinen Patroni-Validator besitzt, aber tatsächlich gültig ist, wird sie weiterhin anhand von postgres --describe-config geprüft.

Verbesserungen

  • Bei Statuscode 409 beim Lesen des Leader-Objekts in K8s die Annotationen erneut geprüft (Alexander Kukushkin)

    Eine zusätzliche Aktualisierung wird vermieden, wenn Patroni die PATCH-Anfrage abgebrochen hat, diese das Ziel aber erfolgreich aktualisiert hat.

  • Clientseitige Verbindungsoption sslnegotiation unterstützt (Alexander Kukushkin)

    sslnegotiation wurde der endgültigen PostgreSQL-Version 17 hinzugefügt.


Version 4.0.2

Veröffentlicht am 2024-09-17

Fehlerbehebungen

  • Ausnahmen beim Auffinden von Dateien zur Konfigurationsvalidierung behandelt (Alexander Kukushkin)

    Verzeichnisse werden übersprungen, wenn Patroni keine ausreichenden Berechtigungen zum Auflisten besitzt.

  • Inaktive physische Hot-Replikationsslots halten kein xmin mehr fest (Alexander Kukushkin, Polina Bungina)

    Seit Version 3.2.0 erstellt Patroni auf Replikaten physische Replikationsslots für alle Mitglieder und rückt sie regelmäßig mit pg_replication_slot_advance() vor. Ist jedoch aus irgendeinem Grund hot_standby_feedback aktiviert und wird der Primärserver zum Replikat herabgestuft, wird der NOT NULL-Wert von xmin der nun inaktiven Slots an den neuen Primärserver zurückgemeldet. Dadurch rückt der xmin-Horizont nicht vor und vacuum kann tote Tupel nicht entfernen. Mit dieser Korrektur erstellt Patroni physische Replikationsslots neu, die inaktiv sein sollten, aber einen NOT NULL-Wert für xmin besitzen.

  • Unbehandelten DCSError während der Startphase behoben (Waynerv)

    Vor der Prüfung auf Eindeutigkeit des Knotennamens wird die Verbindung zum DCS sichergestellt.

  • GUCs aus CMDLINE_OPTIONS beim Abfragen von pg_settings ausdrücklich eingeschlossen (Alexander Kukushkin)

    Wenn Patroni einen laufenden Standby übernimmt, werden alle GUCs wiederhergestellt, die als Befehlszeilenparameter an postmaster übergeben werden. Dies ergänzt die Fehlerbehebung aus Patroni 3.2.2.

  • Fehler in der Anführungszeichenlogik von synchronous_standby_names behoben (Alexander Kukushkin)

    Laut PostgreSQL-Dokumentation müssen die Schlüsselwörter ANY und FIRST in doppelte Anführungszeichen gesetzt werden. Patroni tat dies zuvor nicht.

  • Überschreitung des Wertebereichs für Verbindungs-Keepalives behoben (hadizamani021)

    Der anhand von ttl berechnete Wert der Option keepalive überschreitet nicht mehr den für die aktuelle Plattform zulässigen Höchstwert.


Version 4.0.1

Veröffentlicht am 2024-08-30

Fehlerbehebung

  • Patroni erstellte unnötige Replikationsslots für sich selbst (Alexander Kukushkin)

    Dies geschah, wenn name Großbuchstaben oder Sonderzeichen enthielt.


Version 4.0.0

Veröffentlicht am 2024-08-29

Warnung
  • Diese Version schließt die Ablösung des Begriffs „master“ durch „primary“ ab. Damit sind einige inkompatible Änderungen verbunden; lesen Sie die Versionshinweise sorgfältig. Das Upgrade auf Patroni 4+ funktioniert nur zuverlässig, wenn Patroni 3.1.0 oder neuer verwendet wird. Ein direktes Upgrade von einer älteren Version auf 4+ ist möglich, kann aber zu unerwartetem Verhalten führen, wenn der Primärserver ausfällt, während die übrigen Knoten andere Patroni-Versionen ausführen.

Inkompatible Änderungen

  • Beim Entfernen des nicht inklusiven Begriffs „master“ aus dem Patroni-Code wurden folgende inkompatible Änderungen eingeführt:
    • Auf Kubernetes setzt Patroni das Label role standardmäßig auf primary. Um das bisherige Verhalten beizubehalten und Ausfallzeiten oder langwierige, komplexe Migrationen zu vermeiden, können die Parameter kubernetes.leader_label_value und kubernetes.standby_leader_label_value auf master gesetzt werden. Weitere Informationen finden sich hier .
    • Die Patroni-Rolle wird als primary statt als master in den DCS geschrieben.
    • Die von der Patroni-REST-API zurückgegebene Rolle wurde von master in primary geändert.
    • Die Patroni-REST-API akzeptiert role=master in Anfragen an die Endpunkte /switchover, /failover und /restart nicht mehr.
    • Der REST-API-Endpunkt /metrics meldet die Metrik patroni_master nicht mehr.
    • patronictl akzeptiert die Option --master für keinen Befehl mehr. Stattdessen sollten --leader oder --primary verwendet werden.
    • Die Option no_master in der deklarativen Konfiguration benutzerdefinierter Methoden zur Replikaterstellung wird nicht mehr als besondere Option behandelt; verwenden Sie stattdessen no_leader.
    • Das Skript patroni_wale_restore akzeptiert die Option --no_master nicht mehr.
    • Das Skript patroni_barman akzeptiert die Option --role=master nicht mehr.
    • Allen Callback-Skripten wird bei der Ausführung die Option role=primary statt role=master übergeben.
  • patronictl failover akzeptiert die seit Patroni 3.2.0 veraltete Option --leader nicht mehr.
  • Die seit Patroni 3.2.0 veraltete Funktion zur Benutzererstellung im Konfigurationsabschnitt bootstrap.users wurde entfernt.

Neue Funktionen

  • Quorumbasiertes Failover (Ants Aasma, Alexander Kukushkin)

    Diese Funktion implementiert quorumbasierte synchrone Replikation, die ab PostgreSQL v10 verfügbar ist. Sie hilft, selbst im Normalbetrieb die maximal auftretenden Latenzen zu verringern, weil eine höhere Replikationslatenz zu einem Standby durch andere Standbys ausgeglichen werden kann. Patroni implementiert zusätzliche Schutzmaßnahmen gegen jeden für Benutzer sichtbaren Datenverlust, indem es den Failover-Kandidaten anhand der zuletzt empfangenen Transaktion auswählt.

  • Citus-Sekundärknoten in pg_dist_node registriert (Alexander Kukushkin)

    Patroni verwaltet jetzt in pg_dist_node die Liste der Knoten mit role==replica, state==running und ohne den Tag noloadbalance.

  • Aufbewahrungsdauer der Replikationsslots von Mitgliedern konfigurierbar gemacht (Alexander Kukushkin)

    Der globale Konfigurationsparameter member_slots_ttl wird unterstützt. Er steuert, wie lange die Replikationsslots eines Mitglieds erhalten bleiben sollen, wenn dessen Mitgliedsschlüssel fehlt.

  • Berechtigungen für von Patroni erstellte Protokolldateien konfigurierbar gemacht (Alexander Kukushkin)

    Für von Patroni erstellte Protokolldateien können bestimmte Berechtigungen festgelegt werden. Ohne Angabe werden die Berechtigungen anhand des aktuellen Werts von umask gesetzt.

  • Kompatibilität mit PostgreSQL 17 beta3 (Alexander Kukushkin)

    Die Validierungsregeln für GUCs wurden erweitert. Patroni behandelt beim Herunterfahren alle neuen Hilfs-Backends und setzt dbname in primary_conninfo, da dies für die Synchronisierung logischer Replikationsslots erforderlich ist.

  • Option --ignore-listen-port für die Validierung der Patroni-Konfiguration implementiert (Sahil Naphade)

    Bei der Ausführung von patroni --validate-config können bereits belegte Ports ignoriert werden.

Verbesserungen

  • wal_log_hints konfigurierbar gemacht (Paul_Kim)

    Damit lässt sich der Mehraufwand durch aktiviertes wal_log_hints vermeiden, wenn use_pg_rewind auf off gesetzt ist.

  • Befehl pg_basebackup auf Stufe DEBUG protokolliert (Waynerv)

    Dies erleichtert die Diagnose fehlgeschlagener Initialisierungen.

Fehlerbehebungen

  • Permanente Slots für kaskadierende Knoten im Failsafe-Modus vorgerückt (Alexander Kukushkin)

    Bei aktiviertem Failsafe-Modus werden die Slots kaskadierender Replikate auf dem Primärserver korrekt vorgerückt. Dazu wird die Antwort der Replikate auf die REST-API-Anfrage POST /failsafe um deren xlog_location ergänzt.

  • Auswahl des aktuellen Knotens als synchronen Knoten verhindert (Alexander Kukushkin)

    Es kann „etwas“ vom aktuellen Primärserver streamen, dessen application_name dem Namen des Primärservers entspricht. Patroni behandelte diese Situation nicht korrekt. Dadurch konnte der Primärserver als synchroner Knoten deklariert werden, was anschließend Switchovers blockierte.

  • restapi.allowlist_include_members bei POST /failsafe ignoriert (Alexander Kukushkin)

  • Validierung von GUCs verbessert (Polina Bungina)

    Wegen der zusätzlichen Validierung durch postgres --describe-config konnten GUCs, die dort nicht aufgeführt waren, zuvor nicht über die Patroni-Konfiguration gesetzt werden. Diese Einschränkung wurde entfernt.

  • Bei erkannten Unix-Sockets eine Zeile mit localhost zur Datei .pgpass hinzugefügt (Alexander Kukushkin)

    Patroni ergänzt .pgpass um eine weitere Zeile, wenn der angegebene Parameter host mit / beginnt. Damit wird der Sonderfall abgedeckt, dass host dem Pfad des standardmäßigen Socket-Verzeichnisses entspricht.

  • Probleme bei der Protokollierung behoben (Waynerv)

    In den Protokollen der Failsafe-Behandlung wurde die korrekte Anfrage-URL festgelegt und die Reihenfolge der Zeitstempel im Protokoll der postmaster-Prüfung korrigiert.


Version 3.3.2

Veröffentlicht am 2024-07-11

Fehlerbehebungen

  • Natives synchrones Replikationsverhalten von Postgres korrigiert (Israel Barth Rubio)

    Seit Einführung von synchronous_mode in Patroni funktionierte die native synchrone Replikation von Postgres nicht. Mit dieser Korrektur setzt Patroni synchronous_standby_names auf den vom Benutzer konfigurierten Wert, sofern ein solcher vorhanden ist, wenn synchronous_mode deaktiviert ist.

  • Ungültigwerden logischer Slots auf einem Standby behandelt (Polina Bungina)

    Seit PG16 können logische Replikationsslots auf einem Standby aufgrund des Horizonts ungültig werden. Patroni erzwingt jetzt das Kopieren, also die Neuerstellung, ungültiger Slots.

  • Race Condition beim Vorrücken und Kopieren logischer Slots behoben (Alexander Kukushkin)

    Aufgrund dieses Fehlers konnte ein ungültiger logischer Replikationsslot mehrfach mit einem PostgreSQL-Neustart kopiert werden.


Version 3.3.1

Veröffentlicht am 2024-06-17

Verbesserungen der Stabilität

  • Kompatibilität mit Python 3.12 (Alexander Kukushkin)

    Ein neues Attribut von logging.LogRecord wird berücksichtigt.

Fehlerbehebungen

  • Endlose Rekursion bei der Verarbeitung von replicatefrom-Tags behoben (Alexander Kukushkin)

    Im Zuge dieser Korrektur wurden außerdem die Prüfung is_physical_slot() verbessert und die Dokumentation angepasst.

  • Falsche Rollenmeldungen in Standby-Clustern behoben (Alexander Kukushkin)

    synchronous_standby_names und synchrone Replikation funktionieren nur auf einem tatsächlichen Primärserver. Bei kaskadierender Replikation werden sie von Postgres schlicht ignoriert. Vor dieser Korrektur meldeten patronictl list und GET /cluster manche Knoten fälschlich als synchron.

  • Verfügbarkeit der GUC allow_in_place_tablespaces korrigiert (Polina Bungina)

    allow_in_place_tablespaces wurde nicht nur PostgreSQL 15 hinzugefügt, sondern auch auf PostgreSQL 10-14 zurückportiert.


Version 3.3.0

Veröffentlicht am 2024-04-04

Warnung

Alle älteren Patroni-Versionen sind mit ydiff>=1.3 inkompatibel.

Folgende Möglichkeiten stehen zur „Behebung“ des Problems zur Verfügung:

  1. Patroni auf die neueste Version aktualisieren
  2. Nach der Installation von Patroni ydiff<1.3 installieren
  3. Das Modul cdiff installieren

Neue Funktionen

  • Übergabe von auth_data an den Zookeeper-Client ermöglicht (Aras Mumcuyan)

    Damit können die für die Verbindung zu verwendenden Authentifizierungsdaten angegeben werden.

  • Contrib-Skript für die Integration von Barman hinzugefügt (Israel Barth Rubio)

    Die Anwendung patroni_barman ermöglicht die entfernte Ausführung von Barman-Operationen. Sie kann als benutzerdefinierte Bootstrap- oder Replikaterstellungsmethode oder als Callback on_role_change verwendet werden. Weitere Informationen finden sich hier .

  • Protokollformat JSON unterstützt (alisalemmi)

    Neben plain, dem Standard, unterstützt Patroni jetzt das Protokollformat json. Dafür muss die Bibliothek python-json-logger>=2.0.2 installiert sein.

  • Informationen zu pending_restart_reason angezeigt (Polina Bungina)

    Erweiterte Informationen zu den PostgreSQL-Parametern werden bereitgestellt, die das Setzen des Kennzeichens pending_restart verursacht haben. Sowohl patronictl list als auch der REST-API-Endpunkt /patroni zeigen jetzt die Parameternamen und deren Unterschiede als pending_restart_reason an.

  • Tag nostream implementiert (Grigory Smolkin)

    Wenn nostream auf true gesetzt ist, verwendet der Knoten nicht das Replikationsprotokoll zum Streamen von WAL, sondern die Archiv-Recovery, sofern restore_command konfiguriert ist. Außerdem werden das Kopieren und Synchronisieren permanenter logischer Replikationsslots auf dem Knoten selbst und allen seinen kaskadierenden Replikaten deaktiviert.

Verbesserungen

  • Validierung des Abschnitts log implementiert (Alexander Kukushkin)

    Bisher prüfte der Validator nicht, ob die angegebene Protokollierungskonfiguration korrekt war.

  • Protokollierung von Änderungen an PostgreSQL-Parametern verbessert (Polina Bungina)

    Alte Werte werden in ein menschenlesbares Format umgewandelt und Abweichungen zwischen pg_controldata und der globalen Patroni-Konfiguration protokolliert.

Fehlerbehebungen

  • Nicht zulässige Optionen von pg_basebackup korrekt herausgefiltert (Israel Barth Rubio)

    Aufgrund eines Fehlers filterte Patroni unzulässige Optionen für die Replikat-Bootstrap-Methode basebackup nicht korrekt heraus, wenn sie im Format - setting: value angegeben wurden.

  • Behandlung von etcd3-Authentifizierungsfehlern korrigiert (Alexander Kukushkin)

    Bei einem etcd3-Authentifizierungsfehler wird immer ein Wiederholungsversuch durchgeführt, sofern die Authentifizierung nicht unmittelbar vor Ausführung der Anfrage erfolgte. Außerdem werden Watcher bei erneuter Authentifizierung nicht neu gestartet.

  • Logik zum Auffinden von Validierungsdateien verbessert (Waynerv)

    Nach Möglichkeit wird die Bibliothek importlib verwendet, um Dateien mit verfügbaren Konfigurationsparametern zu finden, ab Python 3.9+. Diese Implementierung ist stabiler und beeinträchtigt keine Patroni-Distributionen auf Basis von zip-Archiven.

  • target_session_attrs nur bei mehreren Hosts im Abschnitt standby_cluster verwendet (Alexander Kukushkin)

    target_session_attrs=read-write wird auf dem Standby-Leader nur noch dann zu primary_conninfo hinzugefügt, wenn standby_cluster.host mehrere durch Kommas getrennte Hosts enthält.

  • Kompatibilitätscode für Version 1.3+ der Bibliothek ydiff hinzugefügt (Alexander Kukushkin)

    Patroni nutzt Teile der nicht öffentlichen API von ydiff, da dieses eigentlich als Terminalwerkzeug und nicht als Python-Modul gedacht ist. Die API-Änderung in 1.3 machte ältere Patroni-Versionen leider funktionsunfähig.


Version 3.2.2

Veröffentlicht am 2024-01-17

Fehlerbehebungen

  • Wiederherstellung des initialize-Schlüssels durch ein Replikat nach dem Löschen des DCS verhindert (Alexander Kukushkin)

    Dies geschah in der Methode, in der Patroni einen eigenständigen PG-Cluster übernehmen sollte.

  • Konsistentes Lesen beim Abruf eines gerade aktualisierten sync-Schlüssels aus Consul verwendet (Alexander Kukushkin)

    Consul bietet keine Schnittstelle, um ModifyIndex für einen gerade aktualisierten Schlüssel sofort zu ermitteln. Daher ist ein ausdrücklicher Lesevorgang erforderlich. Weil veraltete Leseergebnisse standardmäßig erlaubt sind, wurde dabei manchmal eine veraltete Schlüsselversion abgerufen.

  • Postgres-Konfiguration wird neu geladen, wenn ein Parameter, der einen Neustart erfordert, auf seinen ursprünglichen Wert zurückgesetzt wurde (Polina Bungina)

    Zuvor aktualisierte Patroni die Konfiguration nicht, sondern setzte lediglich pending_restart zurück.

  • Fälschlich invertierte Logik der Bestätigungsabfrage beim Failover zu einem asynchronen Kandidaten im synchronen Modus korrigiert (Polina Bungina)

    Das Problem bestand nur in patronictl .

  • Leader von Failover-Kandidaten in patronictl ausgeschlossen (Polina Bungina)

    In einem funktionsfähigen Cluster hat ein Failover zum vorhandenen Leader keine Wirkung.

  • Citus-Datenbank und -Erweiterung idempotent erstellt (Alexander Kukushkin, Zhao Junwang)

    Dadurch können sie im Skript post_bootstrap erstellt werden, wenn weitere Abhängigkeiten zur Citus-Datenbank hinzugefügt werden müssen.

  • Widersprüchlichen Tag nofailover nicht herausgefiltert (Polina Bungina)

    Die auf einem Knoten gesetzte Konfiguration {nofailover: false, failover_priority: 0} hinderte ihn an der Teilnahme an der Leader-Wahl. Er sollte jedoch teilnehmen dürfen, da der Tag nofailover Vorrang haben sollte.

  • Problem mit durch PyInstaller eingefrorenen Anwendungen behoben (Sophia Ruan)

    freeze_support() wurde nach argparse aufgerufen, weshalb Patroni Postgres nicht starten konnte.

  • Fehler im Konfigurationsgenerator für patronictl und Citus behoben (Israel Barth Rubio)

    Der Fehler verhinderte, dass über Umgebungsvariablen gesetzte Konfigurationsparameter für patronictl und Citus in die erzeugte Konfiguration geschrieben wurden.

  • Recovery-GUCs und einige von Patroni verwaltete Parameter bei der Übernahme eines laufenden Standbys wiederhergestellt (Alexander Kukushkin)

    Ab Postgres v12 konnte Patroni Postgres nicht neu starten und meldete einen fehlenden port in einer internen Struktur.

  • Korrekturen am Kennzeichen pending_restart (Polina Bungina)

    pending_restart wird während eines benutzerdefinierten Bootstraps mit recovery_target_action = promote nicht bereitgestellt. Dasselbe gilt, wenn jemand hot_standby oder wal_log_hints etwa über ALTER SYSTEM geändert hat.


Version 3.2.1

Veröffentlicht am 2023-11-30

Fehlerbehebungen

  • Zulässige Werte des Arguments --format in patronictl begrenzt (Alexander Kukushkin)

    Zuvor wurden beliebige Zeichenketten akzeptiert und bei einem unbekannten Wert keine Ausgabe erzeugt.

  • Vor Freigabe des Leader-Schlüssels wird geprüft, ob Replikatknoten beim Herunterfahren die Checkpoint-LSN erhalten haben (Alexander Kukushkin)

    Zuvor wurde in manchen Fällen die LSN des SWITCH-Eintrags verwendet, auf den bei aktiviertem Archivmodus ein CHECKPOINT folgt. Dadurch musste der frühere Primärserver manchmal pg_rewind ausführen; Datenverlust entstand dabei jedoch nicht.

  • Bei der Prüfung auf Eindeutigkeit des Knotennamens eine tatsächliche HTTP-Anfrage ausgeführt (Alexander Kukushkin)

    Beim Betrieb von Patroni in Containern kann der Datenverkehr über docker-proxy geleitet werden, das auf dem Port lauscht und eingehende Verbindungen annimmt. Dies führte zu falsch positiven Ergebnissen.

  • Citus-Unterstützung mit etcd v2 korrigiert (Alexander Kukushkin)

    Patroni konnte mit etcd v2 keinen neuen Citus-Cluster bereitstellen.

  • Verhalten von pg_rewind mit Postgres v16+ korrigiert (Alexander Kukushkin)

    In v16 änderte sich das Format der Fehlermeldung von pg_waldump, sodass Patroni pg_rewind auch dann aufrief, wenn dies nicht erforderlich war.

  • Fehler beim benutzerdefinierten Bootstrap behoben (Alexander Kukushkin)

    Patroni wandte das Argument --command, das selbst der Bootstrap-Befehl ist, fälschlich an.

  • Problem mit REST-API-Endpunkten für Health Checks behoben (Sophia Ruan)

    Nach einem Postgres-Neustart konnte der Zustand von Postgres als unknown zurückgegeben werden, weil Verbindungen nicht korrekt geschlossen worden waren.

  • Ausgabe von postgres --describe-config zwischengespeichert (Waynerv)

    Sie dient dazu, die für die Validierung der PostgreSQL-Konfiguration verfügbaren GUCs zu ermitteln. Eine Änderung dieser Liste während der Patroni-Laufzeit wird nicht erwartet.


Version 3.2.0

Veröffentlicht am 2023-10-25

Hinweis auf veraltete Funktionen

  • Die Unterstützung für bootstrap.users wird in Version 4.0.0 entfernt. Falls nach der Bereitstellung eines neuen Clusters Benutzer erstellt werden müssen, verwenden Sie dazu den Hook bootstrap.post_bootstrap.

Inkompatible Änderungen

  • Regel loop_wait + 2*retry_timeout <= ttl erzwungen und kleinste mögliche Werte fest vorgegeben (Alexander Kukushkin)

    Mindestwerte: loop_wait=2, retry_timeout=3, ttl=20. Kleinere Werte oder Werte, die die Regel verletzen, werden angepasst; eine Warnung wird in den Patroni-Protokollen ausgegeben.

Neue Funktionen

  • Failover-Priorität (Mark Pekala)

    Mit tags.failover_priority kann ein Knoten jetzt bei der Leader-Wahl bevorzugt werden. Weitere Einzelheiten enthält die Dokumentation zu Tags (ref tags).

  • patroni --generate-config [--dsn DSN] und patroni --generate-sample-config implementiert (Polina Bungina)

    Damit kann eine Konfigurationsdatei für einen laufenden PostgreSQL-Cluster oder eine Beispielkonfiguration für einen neuen Patroni-Cluster erzeugt werden.

  • Eigene Verbindung zu Postgres für die Patroni-REST-API verwendet (Alexander Kukushkin)

    Dies hilft, eine Blockierung der Heartbeat-Hauptschleife bei hoher Systemlast zu vermeiden.

  • Einige Endpunkte um den name des Knotens ergänzt (sskserk)

    Beim Überwachungsendpunkt wird name neben scope hinzugefügt; beim Metrikendpunkt wird name in die Tags aufgenommen.

  • Failover und Switchover strikt unterschieden (Polina Bungina)

    Protokollmeldungen werden präziser und ein Failover zu einem asynchronen Knoten in einem funktionsfähigen synchronen Cluster wird ermöglicht.

  • Verhalten permanenter physischer Replikationsslots an permanente logische Slots angeglichen (Alexander Kukushkin)

    Permanente physische Replikationsslots werden auf allen Knoten erstellt, die Leader werden dürfen. Auf Standby-Knoten wird restart_lsn der Slots mit pg_replication_slot_advance() vorgerückt.

  • Angabe des Namespace über das Argument --dcs in patronictl ermöglicht (Israel Barth Rubio)

    Dies kann nützlich sein, wenn patronictl ohne Konfigurationsdatei verwendet wird.

  • Zusätzliche Parameter in der Konfiguration benutzerdefinierter Bootstraps unterstützt (Israel Barth Rubio)

    Zuvor konnten benutzerdefinierte Argumente nur an command angehängt werden; jetzt lassen sie sich als Mapping angeben.

Verbesserungen

  • GUC citus.local_hostname wird auf denselben Wert gesetzt, den Patroni für die Verbindung zu Postgres verwendet (Alexander Kukushkin)

    In manchen Fällen benötigt Citus eine Verbindung zum lokalen Postgres. Standardmäßig wird dafür localhost verwendet, das jedoch nicht immer verfügbar ist.

Fehlerbehebungen

  • Einstellung synchronous_mode in einem Standby-Cluster ignoriert (Polina Bungina)

    Postgres unterstützt keine kaskadierende synchrone Replikation. Die Berücksichtigung von synchronous_mode führte daher zum Fehlschlagen eines Switchovers im Standby-Cluster.

  • SIGCHLD für den Callback on_reload behandelt (Alexander Kukushkin)

    Andernfalls entsteht ein Zombie-Prozess, der erst bei der nächsten Ausführung von on_reload aufgeräumt wird.

  • Fehler AuthOldRevision bei der Arbeit mit etcd v3 behandelt (Alexander Kukushkin, Kenny Do)

    Der Fehler wird ausgelöst, wenn etcd JWT verwendet und die Benutzerdatenbank in etcd aktualisiert wird.


Version 3.1.2

Veröffentlicht am 2023-09-26

Fehlerbehebungen

  • Fehler bei Prüfungen von wal_keep_size behoben (Alexander Kukushkin)

    Die GUC wal_keep_size besitzt normalerweise eine Einheit; Patroni konnte ihren Wert nicht in int umwandeln. Dadurch wurde anschließend der Wert von bootstrap.dcs nicht in den Schlüssel /config geschrieben.

  • Inkonsistenzen zwischen dem Schlüssel /sync und synchronous_standby_names erkannt und behoben (Alexander Kukushkin)

    Normalerweise aktualisiert Patroni /sync und synchronous_standby_names in einer genau festgelegten Reihenfolge. Bei einem Fehler oder wenn jemand synchronous_standby_names manuell zurücksetzte, geriet Patroni jedoch in einen inkonsistenten Zustand. Dadurch konnte ein Failover zu einem asynchronen Knoten erfolgen.

  • GUC-Werte bei der Übernahme eines laufenden Postgres gelesen (Alexander Kukushkin)

    Bei einem Neustart im Pause-Modus entfernte Patroni die GUC synchronous_standby_names aus postgresql.conf. Um dieses und ähnliche Probleme zu vermeiden, liest Patroni den GUC-Wert, wenn es einen bereits laufenden Postgres übernimmt.

  • Störende Warnungen bei der Prüfung auf Eindeutigkeit des Knotens unterdrückt (Alexander Kukushkin)

    Bei einem schnellen Patroni-Neustart erzeugt urllib3 Meldungen der Stufe WARNING.


Version 3.1.1

Veröffentlicht am 2023-09-20

Fehlerbehebungen

  • Failsafe-Zustand bei der Hochstufung zurückgesetzt (ChenChangAo)

    Erfolgte ein Switchover oder Failover kurz nach Aktivierung des Failsafe-Modus, stufte sich der neu hochgestufte Primärserver selbst herab, sobald Failsafe wieder inaktiv wurde.

  • Nutzlose Warnungen in patronictl unterdrückt (Alexander Kukushkin)

    Wenn patronictl dieselbe Datei patroni.yaml wie Patroni verwendet und auf das Verzeichnis PGDATA zugreifen kann, wurden möglicherweise störende Warnungen zu falschen Werten in der globalen Konfiguration angezeigt.

  • Synchronen Modus in einem Sonderfall ausdrücklich aktiviert (Alexander Kukushkin)

    Wenn keine Replikate vom Primärserver streamten, wurde der synchrone Modus tatsächlich nie aktiviert.

  • Fehler bei der Validierung ganzzahliger Werte von 0 behoben (Israel Barth Rubio)

    Meist verursachte dies keine Probleme, sondern nur Warnungen.

  • Keine logischen Slots für Standby-Cluster zurückgegeben (Alexander Kukushkin)

    Patroni kann in einem Standby-Cluster keine logischen Replikationsslots erstellen. Daher sollten sie ignoriert werden, wenn sie in der globalen Konfiguration definiert sind.

  • Anzeige des Docstrings in der Ausgabe von patronictl --help vermieden (Israel Barth Rubio)

    Das Modul click benötigt dafür einen besonderen Hinweis.

  • Fehler bei kubernetes.standby_leader_label_value behoben (Alexander Kukushkin)

    Diese Funktion hatte tatsächlich nie funktioniert.

  • Systemkennung des Clusters wieder in der Ausgabe von patronictl list angezeigt (Polina Bungina)

    Das Problem entstand bei der Implementierung der Citus-Unterstützung. Dort muss die Kennung ausgeblendet werden, da sie für den Coordinator und alle Worker unterschiedlich ist.

  • Methode write_leader_optime in der Kubernetes-Implementierung überschrieben (Alexander Kukushkin)

    Die Methode soll die LSN beim Herunterfahren in das Endpoint- oder ConfigMap-Objekt des Leaders schreiben, wenn kein funktionsfähiges Replikat als neuer Primärserver zur Verfügung steht.

  • Gestopptes Postgres wird während einer Pause nicht gestartet (Alexander Kukushkin)

    Aufgrund einer Race Condition nahm Patroni fälschlich an, der Standby müsse neu gestartet werden, weil sich Recovery-Parameter wie primary_conninfo geändert hätten.

  • Fehler im Befehl patronictl query behoben (Israel Barth Rubio)

    Der Befehl funktionierte nicht, wenn nur -m oder keines der Argumente -r und -m angegeben wurde.

  • Ganzzahlige Parameter auf der Befehlszeile zum Start von postgres korrekt behandelt (Polina Bungina)

    Wurden Werte als Zeichenketten angegeben und nicht in Ganzzahlen umgewandelt, wurde max_prepared_transactions für Citus-Cluster anhand von max_connections falsch berechnet.

  • Bei der Entscheidung über pg_rewind nicht auf pg_stat_wal_receiver vertraut (Alexander Kukushkin)

    Der von pg_stat_wal_receiver gemeldete Wert received_tli konnte der tatsächlich wiedergegebenen Timeline voraus sein. Dagegen ist die von IDENTIFY_SYSTEM über die Replikationsverbindung gemeldete Timeline immer korrekt.


Version 3.1.0

Veröffentlicht am 2023-08-03

Inkompatible Änderungen

  • Bedeutung von restapi.keyfile und restapi.certfile geändert (Alexander Kukushkin)

    Zuvor verwendete Patroni restapi.keyfile und restapi.certfile ersatzweise als Client-Zertifikate, wenn die entsprechenden Konfigurationsparameter im Abschnitt ctl fehlten.

Warnung

Wenn die Prüfung von Client-Zertifikaten aktiviert ist (restapi.verify_client ist auf required gesetzt), müssen außerdem gültige Client-Zertifikate in ctl.certfile, ctl.keyfile und ctl.keyfile_password angegeben werden. Ohne diese Angaben funktioniert Patroni nicht korrekt.

Neue Funktionen

  • Rollenlabel von Pods konfigurierbar gemacht (Waynerv)

    Die Werte können über kubernetes.leader_label_value, kubernetes.follower_label_value und kubernetes.standby_leader_label_value angepasst werden. Diese Funktion wird beim Wechsel von der Rolle master zu primary sehr nützlich sein. Weitere Informationen zur Funktion und den Migrationsschritten finden sich hier .

Verbesserungen

  • Verschiedene Verbesserungen an patroni --validate-config (Alexander Kukushkin)

    Die Parametervalidierung für verschiedene DCS sowie die Abschnitte bootstrap.dcs, ctl, restapi und watchdog wurde verbessert.

  • Postgres wird außerhalb der Recovery gestartet, wenn es während der Recovery bei laufendem Patroni abgestürzt ist (Alexander Kukushkin)

    Dies kann die Recovery-Zeit verkürzen und hilft, unnötige Timeline-Erhöhungen zu vermeiden.

  • Unnötige Aktualisierungen des Schlüssels /status vermieden (Alexander Kukushkin)

    Wenn keine permanenten logischen Slots vorhanden waren, aktualisierte Patroni /status bei jedem Heartbeat-Schleifendurchlauf, selbst wenn sich die LSN auf dem Primärserver nicht weiterbewegt hatte.

  • Verhindert, dass ein Primärserver mit veraltetem Zustand die Leader-Wahl gewinnt (Alexander Kukushkin)

    Wenn Patroni wegen Ressourcenmangels längere Zeit nicht reagiert hat, prüft es vor dem Erwerb der Leader-Sperre zusätzlich, ob auf keinem anderen Knoten Postgres hochgestuft wurde.

  • Validierung bestimmter PostgreSQL-Parameter sichtbar gemacht (Alexander Kukushkin, Feike Steenbergen)

    Wenn die Validierung von max_connections, max_wal_senders, max_prepared_transactions, max_locks_per_transaction, max_replication_slots oder max_worker_processes fehlschlug, verwendete Patroni einen geeigneten Standardwert. Zusätzlich wird jetzt eine Warnung ausgegeben.

  • Berechtigungen für in PGDATA erstellte Dateien und Verzeichnisse gesetzt (Alexander Kukushkin)

    Alle von Patroni erstellten Dateien hatten nur Lese- und Schreibberechtigungen für den Eigentümer. Dadurch funktionierten Backup-Werkzeuge nicht, die unter einem anderen Benutzer laufen und Gruppenleserechte benötigen. Patroni berücksichtigt jetzt die Berechtigungen von PGDATA und setzt die Berechtigungen aller innerhalb von PGDATA erstellten Dateien und Verzeichnisse korrekt.

Fehlerbehebungen

  • archive_command über eine Shell ausgeführt (Waynerv)

    Patroni kann vor einer Crash-Recovery im Einzelbenutzermodus oder vor pg_rewind einige WAL-Segmente archivieren. Enthielt archive_command Shell-Operatoren wie &&, funktionierte dies mit Patroni nicht.

  • Prüfungen beim Herunterfahren während eines Switchovers korrigiert (Polina Bungina)

    Es konnte vorkommen, dass der angegebene Kandidat noch streamte und den Shutdown-Checkpoint noch nicht erhalten hatte, der Leader-Schlüssel aber entfernt wurde, weil andere Knoten funktionsfähig waren.

  • Prüfung auf Primärserver korrigiert (Alexander Kukushkin)

    Während der Leader-Wahl konnten Replikate nicht erkennen, dass Postgres auf dem alten Leader weiterhin als Primärserver lief.

  • patronictl list korrigiert (Alexander Kukushkin)

    Das Feld für den Clusternamen fehlte in den Ausgabeformaten tsv, json und yaml.

  • Verhalten von pg_rewind nach einer Pause korrigiert (Alexander Kukushkin)

    Unter bestimmten Bedingungen konnte Patroni nach dem Verlassen des Wartungsmodus den fälschlich als Primärserver laufenden Knoten nicht mit pg_rewind wieder in den Cluster eingliedern.

  • Fehler in der etcd-v3-Implementierung behoben (Alexander Kukushkin)

    Der interne KV-Cache wird ungültig gemacht, wenn eine Schlüsselaktualisierung mit dem Feld create_revision/mod_revision aufgrund einer Revisionsabweichung fehlschlägt.

  • Verhalten von Replikaten in einem pausierten Standby-Cluster korrigiert (Alexander Kukushkin)

    Wenn der Leader-Schlüssel abläuft, folgen Replikate im Standby-Cluster nicht dem entfernten Knoten, sondern behalten primary_conninfo unverändert bei.


Version 3.0.4

Veröffentlicht am 2023-07-13

Neue Funktionen

  • Replikationsstatus von Standby-Knoten sichtbar gemacht (Alexander Kukushkin)

    Für PostgreSQL 9.6+ meldet Patroni den Replikationszustand als streaming, wenn der Standby von einem anderen Knoten streamt. Besteht keine Replikationsverbindung und ist restore_command gesetzt, wird in archive recovery gemeldet. Der Zustand ist in den Schlüsseln member im DCS, in der REST API und in der Ausgabe von patronictl list sichtbar.

Verbesserungen

  • Fehlermeldungen mit etcd v3 verbessert (Alexander Kukushkin)

    War ein etcd-v3-Cluster nicht erreichbar, meldete Patroni, dass es auf die Endpunkte /v2 nicht zugreifen könne.

  • Nach Möglichkeit Quorum-Lesezugriffe in patronictl verwendet (Alexander Kukushkin)

    etcd- oder Consul-Cluster konnten nur noch lesbar sein, während aus Sicht von patronictl alles in Ordnung war. Jetzt schlägt der Zugriff mit einer Fehlermeldung fehl.

  • Split-Brain durch doppelte Namen in der Konfiguration verhindert (Mark Pekala)

    Beim Start prüft Patroni, ob im DCS ein Knoten mit demselben Namen registriert ist, und versucht, dessen REST API abzufragen. Ist diese erreichbar, beendet sich Patroni mit einem Fehler. Dies schützt vor menschlichen Fehlern.

  • Postgres wird außerhalb der Recovery gestartet, wenn es bei laufendem Patroni abgestürzt ist (Alexander Kukushkin)

    Dies kann die Recovery-Zeit verkürzen und hilft, unnötige Timeline-Erhöhungen zu vermeiden.

Fehlerbehebungen

  • SSL-Zertifikate der REST API wurden bei Empfang von SIGHUP nicht neu geladen (Israel Barth Rubio)

    Die Regression wurde in 3.0.3 eingeführt.

  • Validierung ganzzahliger GUCs für Parameter wie max_connections korrigiert (Feike Steenbergen)

    Patroni akzeptierte numerische Werte in Anführungszeichen nicht. Die Regression wurde in 3.0.3 eingeführt.

  • Problem mit synchronous_mode behoben (Alexander Kukushkin)

    txid_current() wird mit synchronous_commit=off ausgeführt, damit es bei aktiviertem synchronous_mode_strict nicht versehentlich auf fehlende synchrone Standbys wartet.


Version 3.0.3

Veröffentlicht am 2023-06-22

Neue Funktionen

  • Kompatibilität mit PostgreSQL 16 beta1 (Alexander Kukushkin)

    Die Validierungsregeln für GUCs wurden erweitert.

  • Validator für PostgreSQL-GUCs erweiterbar gemacht (Israel Barth Rubio)

    Validierungsregeln werden aus YAML-Dateien im Verzeichnis patroni/postgresql/available_parameters/ geladen. Die Dateien werden alphabetisch sortiert und nacheinander angewendet. Damit sind benutzerdefinierte Validatoren für von der Standarddistribution abweichende Postgres-Distributionen möglich.

  • Option restapi.request_queue_size hinzugefügt (Andrey Zhidenkov, Aleksei Sukhov)

    Sie legt die Größe der Anfragewarteschlange für den von der Patroni-REST-API verwendeten TCP-Socket fest. Ist die Warteschlange voll, erhalten weitere Anfragen den Fehler “Connection denied”. Der Standardwert ist 5.

  • initdb beim Bootstrap eines neuen Clusters direkt aufgerufen (Matt Baker)

    Zuvor wurde es über pg_ctl aufgerufen, was eine besondere Behandlung der Anführungszeichen für die an initdb übergebenen Parameter erforderte.

  • Hook vor dem Stoppen hinzugefügt (Le Duane)

    Der Hook kann über postgresql.before_stop konfiguriert werden und wird unmittelbar vor pg_ctl stop ausgeführt. Sein Exit-Code beeinflusst den Vorgang des Herunterfahrens nicht.

  • Benutzerdefinierte Namen für Postgres-Programme unterstützt (Israel Barth Rubio, Polina Bungina)

    In einer benutzerdefinierten Postgres-Distribution können die Programme unter anderen Namen als in der Community-Distribution kompiliert sein. Benutzerdefinierte Programmnamen lassen sich über postgresql.bin_name.* und die Umgebungsvariablen PATRONI_POSTGRESQL_BIN_* konfigurieren.

Verbesserungen

  • Verschiedene Verbesserungen an patroni --validate-config (Polina Bungina)

    • bootstrap.initdb ist nun optional. Es ist nur für neue Cluster erforderlich, doch patroni --validate-config beanstandete bisher sein Fehlen in der Konfiguration.
    • Bei leerem oder nicht gesetztem postgresql.bin_dir wird kein Fehler ausgelöst. Stattdessen wird zunächst im standardmäßigen PATH nach Postgres-Programmen gesucht.
    • Der Abschnitt postgresql.authentication.rewind ist nun optional. Fehlt er, verwendet Patroni den Superuser.
  • Fehlermeldungen in patronictl verbessert (Israel Barth Rubio)

    Das Symbol \n wurde wörtlich statt als tatsächlicher Zeilenumbruch dargestellt.

Fehlerbehebungen

  • Problem in der Citus-Unterstützung behoben (Alexander Kukushkin)

    Wenn während eines Switchovers der REST-API-Aufruf vom hochgestuften Worker zum Coordinator fehlschlug, blieb die betreffende Citus-Gruppe auf unbestimmte Zeit blockiert.

  • etcd3-URL in der Option --dcs-url von patronictl zugelassen (Israel Barth Rubio)

    Der Versuch, über die Option --dcs-url von patronictl eine etcd3-URL zu übergeben, führte zu einer Ausnahme.


Version 3.0.2

Veröffentlicht am 2023-03-24

Warnung

Version 3.0.2 stellt die Unterstützung für Python-Versionen vor 3.6 ein.

Neue Funktionen

  • Status synchroner Standby-Replikate zum Endpunkt /metrics hinzugefügt (Thomas von Dein, Alexander Kukushkin)

    Zuvor wurden nur primary/standby_leader/replica gemeldet.

  • Benutzerfreundliche Behandlung von PAGER in patronictl (Israel Barth Rubio)

    Der Pager kann über die Umgebungsvariable PAGER konfiguriert werden, die die Standardprogramme less und more überschreibt.

  • HTTP-Statuscodes für wiederholbare K8s-Anfragen konfigurierbar gemacht (Alexander Kukushkin)

    Auf manchen verwalteten Plattformen kann der Statuscode 401 Unauthorized auftreten; das Problem behebt sich bisweilen nach einigen Wiederholungsversuchen.

Verbesserungen

  • hot_standby wird während eines benutzerdefinierten Bootstraps nur auf off gesetzt, wenn recovery_target_action auf promote gesetzt ist (Alexander Kukushkin)

    Dies war erforderlich, damit recovery_target_action=pause korrekt funktioniert.

  • Verhindert, dass der Callback on_reload andere Callbacks beendet (Alexander Kukushkin)

    on_start/on_stop/on_role_change dienen üblicherweise zum Hinzufügen und Entfernen einer virtuellen IP. on_reload sollte diese nicht beeinträchtigen.

  • AWS-Callback-Beispielskript auf IMDSFetcher umgestellt (Polina Bungina)

    IMDSv2 benötigt ein Token; IMDSFetcher kümmert sich transparent darum.

Fehlerbehebungen

  • patronictl switchover für einen Citus-Cluster auf Kubernetes korrigiert (Lukáš Lalinský)

    Der Befehl funktionierte für andere Namespaces als default nicht.

  • Bei unbekannter Hauptversion wird nicht in PGDATA geschrieben (Alexander Kukushkin)

    War PGDATA unmittelbar nach dem Start leer, etwa weil es noch nicht eingehängt war, nahm Patroni eine falsche PostgreSQL-Version an und erstellte fälschlich recovery.conf, selbst wenn die tatsächliche Hauptversion v10+ war.

  • Fehler bei Citus-Metadaten nach einem Coordinator-Failover behoben (Alexander Kukushkin)

    Der Aufruf von citus_set_coordinator_host() löst keine Metadatensynchronisierung aus, sodass die Änderung auf Worker-Knoten nicht sichtbar war. Das Problem wird durch den Wechsel zu citus_update_node() behoben.

  • Bei „Ausfall“ aller etcd-Knoten auf die Hosts aus der Konfigurationsdatei zurückgegriffen (Alexander Kukushkin)

    Die Topologie des etcd-Clusters kann sich im Laufe der Zeit ändern; Patroni versucht, ihr zu folgen. Sind irgendwann alle Knoten nicht mehr erreichbar, verwendet Patroni bei erneuten Verbindungsversuchen eine Kombination der Knoten aus der Konfiguration und der zuletzt bekannten Topologie.


Version 3.0.1

Veröffentlicht am 2023-02-16

Fehlerbehebungen

  • Korrekter Rollenname wird an ein Callback-Skript on_role_change übergeben. (Alexander Kukushkin, Polina Bungina)

    Patroni übergab bei der Hochstufung fälschlich die Rolle promoted an ein Callback-Skript on_role_change. Der übergebene Rollenname wurde wieder auf master geändert. Diese Regression wurde in 3.0.0 eingeführt.


Version 3.0.0

Veröffentlicht am 2023-01-30

Diese Version ergänzt die Integration mit Citus und ermöglicht es, vorübergehende DCS-Ausfälle ohne Herabstufung des Primärservers zu überstehen.

Warnung
  • Version 3.0.0 ist die letzte Version mit Unterstützung für Python 2.7. Die nächste Version wird Python-Versionen vor 3.7 nicht mehr unterstützen.

  • Die RAFT-Unterstützung ist veraltet. Sie wird nach besten Kräften weiter gepflegt, es wird jedoch weder eine Garantie noch Verantwortung für mögliche Probleme übernommen.

  • Diese Version ist der erste Schritt zur Ablösung von „master“ durch „primary“. Ein zuverlässiges Upgrade auf die nächste Hauptversion ist nur von mindestens Version 3.0.0 aus möglich.

Neue Funktionen

  • DCS-Failsafe-Modus (Alexander Kukushkin, Polina Bungina)

    Wenn diese Funktion aktiviert ist, kann ein Patroni-Cluster vorübergehende DCS-Ausfälle überstehen. Weitere Einzelheiten enthält die Dokumentation .

  • Citus-Unterstützung (Alexander Kukushkin, Polina Bungina, Jelte Fennema)

    Patroni ermöglicht die einfache Bereitstellung und Verwaltung von Citus -Clustern mit HA. Weitere Informationen finden sich hier .

Verbesserungen

  • Wiederkehrende Fehler beim Löschen unbekannter, aber aktiver Replikationsslots unterdrückt (Michael Banck)

    Patroni schreibt diese Protokollmeldungen weiterhin, jedoch nur auf Stufe DEBUG.

  • Nur eine Überwachungsabfrage pro HA-Schleifendurchlauf ausgeführt (Alexander Kukushkin)

    Bei aktivierter synchroner Replikation war dies bisher nicht der Fall.

  • Nur das zuletzt fehlgeschlagene Datenverzeichnis wird behalten (William Albertus Dembo)

    Nach einem fehlgeschlagenen Bootstrap benannte Patroni das Verzeichnis $PGDATA bisher mit einem Zeitstempelsuffix um. Jetzt lautet das Suffix .failed. Existiert ein solches Verzeichnis bereits, wird es vor dem Umbenennen entfernt.

  • Prüfung synchroner Replikationsverbindungen verbessert (Alexander Kukushkin)

    Wird ein neuer Host zu synchronous_standby_names hinzugefügt, wird er im DCS erst dann als synchron eingetragen, wenn er neben pg_stat_replication.sync_state = 'sync' auch zum Primärserver aufgeholt hat.

Entfernte Funktionen

  • patronictl scaffold entfernt (Alexander Kukushkin)

    Sein einziger Zweck war eine behelfsmäßige Möglichkeit, Standby-Cluster zu betreiben.


Version 2.1.7

Veröffentlicht am 2023-01-04

Fehlerbehebungen

  • Kleine Inkompatibilitäten mit älteren Python-Modulen behoben (Alexander Kukushkin)

    Sie verhinderten das Bauen oder Ausführen von Patroni unter Debian buster/Ubuntu bionic.


Version 2.1.6

Veröffentlicht am 2022-12-30

Verbesserungen

  • Störende Ausnahmen beim Schließen von SSL-Sockets behoben (Alexander Kukushkin)

    HAProxy schließt Verbindungen, sobald es den HTTP-Statuscode empfangen hat. Dadurch blieb Patroni keine Zeit, die SSL-Verbindung ordnungsgemäß zu schließen.

  • Beispiel-Dockerfile für arm64 angepasst (Polina Bungina)

    Die expliziten Angaben amd64 und x86_64 wurden entfernt; libnss_files.so.* wird nicht entfernt.

Sicherheitsverbesserungen

  • search_path=pg_catalog für Verbindungen außerhalb des Replikationsprotokolls erzwungen (Alexander Kukushkin)

    Da Patroni stark auf Superuser-Verbindungen angewiesen ist, soll es vor möglichen Angriffen über benutzerdefinierte Funktionen und/oder Operatoren im Schema public geschützt werden, die denselben Namen und dieselbe Signatur wie entsprechende Objekte in pg_catalog haben. Dazu wird search_path=pg_catalog für alle von Patroni erstellten Verbindungen außer Replikationsverbindungen erzwungen.

  • Aufzeichnung von Passwörtern in pg_stat_statements verhindert (Feike Steenbergen)

    Dazu wird beim Anlegen von Benutzern pg_stat_statements.track_utility=off gesetzt.

Fehlerbehebungen

  • proxy_address als optional deklariert (Denis Laxalde)

    Die Option ist tatsächlich nicht erforderlich.

  • Verhalten der Option insecure verbessert (Alexander Kukushkin)

    Die Option insecure von ctl funktionierte nicht richtig, wenn für REST-API-Anfragen Clientzertifikate verwendet wurden.

  • Watchdog-Konfiguration beim Bootstrap eines neuen Clusters aus bootstrap.dcs übernommen (Matt Baker)

    Bisher konfigurierte Patroni den Watchdog beim Bootstrap eines neuen Clusters zunächst mit Standardwerten, statt die zum Bootstrap des DCS verwendete Konfiguration zu übernehmen.

  • Behandlung von Dateiendungen bei der Suche nach ausführbaren Dateien unter WIN32 korrigiert (Martín Marqués)

    .exe wird nur angehängt, wenn der Dateiname noch keine Endung hat.

  • Einstellung der Consul-TTL korrigiert (Alexander Kukushkin)

    Beim Setzen des Werts im HTTPClient wurde ttl/2.0 verwendet, in der Eigenschaft der Klasse jedoch vergessen, den aktuellen Wert mit 2 zu multiplizieren. Dadurch war die Consul-TTL um den Faktor zwei falsch.

Entfernte Funktionen

  • patronictl configure entfernt (Polina Bungina)

    Eine separate Erstellung der patronictl -Konfiguration ist nicht mehr nötig.


Version 2.1.5

Veröffentlicht am 2022-11-28

Diese Version verbessert die Kompatibilität mit PostgreSQL 15 und erklärt die Unterstützung für etcd v3 für produktionsreif. Patroni auf Raft bleibt im Beta-Stadium.

Neue Funktionen

  • patroni --validate-config verbessert (Denis Laxalde)

    Bei ungültiger Konfiguration erfolgt der Abbruch mit Code 1; Fehler werden auf stderr ausgegeben.

  • Replikationsslots werden im pausierten Modus nicht entfernt (Alexander Kukushkin)

    Patroni erstellt oder entfernt physische Replikationsslots automatisch, wenn Mitglieder dem Cluster beitreten oder ihn verlassen. Im pausierten Modus werden Slots nicht mehr entfernt.

  • Anfragemethode HEAD für Überwachungsendpunkte unterstützt (Robert Cutajar)

    Wird sie anstelle von GET verwendet, gibt Patroni nur den HTTP-Statuscode zurück.

  • behave-Tests unter Windows unterstützt (Alexander Kukushkin)

    Der neue REST-API-Endpunkt POST /sigterm ermöglicht es, ein geordnetes Herunterfahren von Patroni (SIGTERM) unter Windows nachzubilden.

  • postgresql.proxy_address eingeführt (Alexander Kukushkin)

    Der Wert wird als proxy_url in den Mitgliedsschlüssel im DCS geschrieben und kann zur Diensterkennung verwendet werden.

Stabilitätsverbesserungen

  • pg_replication_slot_advance() wird aus einem Thread aufgerufen (Alexander Kukushkin)

    Auf stark ausgelasteten Clustern mit vielen logischen Replikationsslots beeinträchtigte der Aufruf von pg_replication_slot_advance() die HA-Hauptschleife und konnte zum Ablauf des Mitgliedsschlüssels führen.

  • Möglicherweise fehlende WAL-Dateien werden vor dem Aufruf von pg_rewind auf dem alten Primärserver archiviert (Polina Bungina)

    War der Primärserver nach einem Absturz längere Zeit ausgefallen, konnten einige WAL-Dateien sowohl im Archiv als auch auf dem neuen Primärserver fehlen. pg_rewind konnte diese Dateien vom alten Primärserver entfernen, sodass dieser nicht mehr als Standby gestartet werden konnte. Das Archivieren von WAL-Dateien im Zustand ready verringert dieses Risiko und verbessert die kontinuierliche Archivierung insgesamt.

  • Fehler 403 beim Versuch, einen Kubernetes-Service anzulegen, werden ignoriert (Nick Hudson, Polina Bungina)

    Erfolglose Versuche, den möglicherweise bereits vorhandenen Service anzulegen, überfluteten die Patroni-Protokolle.

  • Liveness-Prüfung verbessert (Alexander Kukushkin)

    Die Liveness-Prüfung schlägt fehl, wenn die Heartbeat-Schleife auf dem Primärserver länger als ttl oder auf einem Replikat länger als 2*ttl läuft. Dadurch kann sie unter Kubernetes als Alternative zum Watchdog verwendet werden.

  • Bei einem Switchover versucht nur ein synchroner Knoten, die Sperre zu übernehmen (Alexander Kukushkin, Polina Bungina)

    Zuvor bestand eine geringe Chance, dass ein asynchrones Mitglied auf dem aktuellen Stand Leader wurde, wenn ein manuelles Switchover ohne Zielangabe ausgeführt wurde.

  • Klonen während des Cluster-Bootstraps verhindert (Ants Aasma)

    Eine Methode zur Replikaterstellung, die keinen Leader benötigt, darf während des laufenden Cluster-Bootstraps nicht gestartet werden.

  • Kompatibilität mit kazoo-2.9.0 (Alexander Kukushkin)

    Je nach Python-Version kann SequentialThreadingHandler.select() die Ausnahmen TypeError und IOError auslösen, wenn select() auf einem geschlossenen Socket aufgerufen wird.

  • SSL-Verbindung wird vor dem Socket ausdrücklich geschlossen (Alexander Kukushkin)

    Ohne diesen Schritt kam es mit OpenSSL 3.0 zu Fehlern unexpected eof while reading.

  • Kompatibilität mit prettytable>=2.2.0 (Alexander Kukushkin)

    Durch interne API-Änderungen wurde die Überschrift mit dem Clusternamen in der falschen Zeile angezeigt.

Fehlerbehebungen

  • Abgelaufene Token bei etcd lease_grant behandelt (monsterxx03)

    Bei einem Fehler wird ein neues Token geholt und die Anfrage wiederholt.

  • Fehler im Endpunkt GET /read-only-sync behoben (Alexander Kukushkin)

    Er wurde in der vorherigen Version eingeführt und hatte tatsächlich nie funktioniert.

  • Verschwundener Speicher des Datenverzeichnisses behandelt (Alexander Kukushkin)

    Patroni prüft regelmäßig, ob PGDATA vorhanden und nicht leer ist. Bei Speicherproblemen löst os.listdir() jedoch OSError aus, wodurch die Heartbeat-Schleife unterbrochen wurde.

  • master_stop_timeout beim Warten auf das Ende von Benutzer-Backends angewendet (Alexander Kukushkin)

    Ein vermeintliches Benutzer-Backend kann tatsächlich ein Hintergrundprozess sein, etwa der Citus Maintenance Daemon, der sich nicht beendet.

  • *:<port> für postgresql.listen zugelassen (Denis Laxalde)

    patroni --validate-config meldete diesen Wert als ungültig.

  • Zeitüberschreitungen in Raft korrigiert (Alexander Kukushkin)

    Beim Start versuchen Patroni oder patronictl, die Raft-Clustertopologie von bekannten Mitgliedern abzurufen. Diese Aufrufe erfolgten ohne geeignete Zeitbegrenzung.

  • Consul-Service nach einer Tokenänderung zwingend aktualisiert (John A. Lotoski)

    Ohne die Aktualisierung entstanden Fehler wie “rpc error making call: rpc error making call: ACL not found”.


Version 2.1.4

Veröffentlicht am 2022-06-01

Neue Funktionen

  • Verhalten von pg_rewind auf typischen Debian-/Ubuntu-Systemen verbessert (Gunnar “Nick” Bluth)

    Bei Postgres-Installationen mit postgresql.conf außerhalb des Datenverzeichnisses (z. B. Ubuntu-/Debian-Pakete) kann pg_rewind --restore-target-wal den Wert von restore_command nicht ermitteln.

  • TLSServerName für Consul-Service-Prüfungen einstellbar (Michael Gmelin)

    Dies ist nützlich, wenn Prüfungen über IP-Adressen erfolgen und der Consul-node_name kein FQDN ist.

  • Unterstützung für ppc64le im Watchdog hinzugefügt (Jean-Michel Scheiwiler)

    Außerdem wurde die Watchdog-Unterstützung auf einigen Nicht-x86-Plattformen korrigiert.

  • Callback aws.py von boto auf boto3 umgestellt (Alexander Kukushkin)

boto 2.x wird seit 2018 nicht mehr gepflegt und funktioniert mit Python 3.9 nicht.

  • Service-Account-Token unter K8s regelmäßig erneuert (Haitao Li)

    Seit Kubernetes v1.21 laufen Service-Account-Token nach 1 Stunde ab.

  • Überwachungsendpunkt /read-only-sync hinzugefügt (Dennis4b)

    Er ähnelt /read-only, berücksichtigt aber nur synchrone Replikate.

Stabilitätsverbesserungen

  • Logische Replikationsslots werden bei abweichender Konfiguration der logischen Dekodierung nicht auf Replikate kopiert (Alexander Kukushkin)

    Ein Replikat kopiert einen logischen Replikationsslot nicht mehr vom Primärserver, wenn dieser nicht zu den Konfigurationsoptionen plugin oder database passt. Zuvor erfolgte diese Prüfung erst, nachdem das Replikat den Slot kopiert hatte und damit gestartet war. Dies führte zu unnötigen, wiederholten Neustarts.

  • Recovery-Konfigurationsparameter für PostgreSQL v12+ gesondert behandelt (Alexander Kukushkin)

    Beim Start als Replikat sollte Patroni postgresql.conf aktualisieren und einen Neustart bzw. ein Neuladen ausführen können, wenn sich die Leader-Adresse geändert hat. Dazu werden die aktuellen Parameterwerte zwischengespeichert, statt sie aus pg_settings abzufragen.

  • IPv6-Adressen in postgresql.listen besser behandelt (Alexander Kukushkin)

    Da listen einen Port enthält, werden IPv6-Adressen häufig in eckige Klammern gesetzt. Diese wurden bei mehreren IP-Adressen in der Liste nicht korrekt entfernt.

  • Zugangsdaten von replication für die Divergenzprüfung nur unter PostgreSQL v10 und älter verwendet (Alexander Kukushkin)

    Ist rewind aktiviert, verwendet Patroni auf neueren Postgres-Versionen wieder entweder superuser- oder rewind-Zugangsdaten.

Fehlerbehebungen

  • Fehlenden Import von dateutil.parser ergänzt (Wesley Mendes)

    Die Tests schlugen nur deshalb nicht fehl, weil das Modul auch aus anderen Modulen importiert wurde.

  • Sichergestellt, dass die Annotation optime eine Zeichenfolge ist (Sebastian Hasler)

    In bestimmten Fällen versuchte Patroni, sie als Zahl zu übergeben.

  • Fehlgeschlagene Versuche mit pg_rewind besser behandelt (Alexander Kukushkin)

    Wird der Primärserver während pg_rewind unerreichbar, bleibt $PGDATA in einem beschädigten Zustand zurück. Anschließend entfernt Patroni das Datenverzeichnis, auch wenn die Konfiguration dies nicht erlaubt.

  • Annotationen slots werden bei noch nicht bereitem PostgreSQL nicht aus der Leader-ConfigMap bzw. dem Leader-Endpoint entfernt (Alexander Kukushkin)

    Wird kein Wert für slots übergeben, behält die Annotation ihren aktuellen Wert.

  • Nebenläufigkeitsproblem mit K8s-API-Watchern behandelt (Alexander Kukushkin)

    Unter bestimmten, unbekannten Bedingungen können Watcher veralten, wodurch attempt_to_acquire_leader() mit HTTP-Statuscode 409 fehlschlagen kann. In diesem Fall werden die Watcher-Verbindungen zurückgesetzt und neu aufgebaut.


Version 2.1.3

Veröffentlicht am 2022-02-18

Neue Funktionen

  • Verschlüsselte TLS-Schlüssel für patronictl unterstützt (Alexander Kukushkin)

    Die Konfiguration erfolgt über ctl.keyfile_password oder die Umgebungsvariable PATRONI_CTL_KEYFILE_PASSWORD.

  • Weitere Metriken zum Endpunkt /metrics hinzugefügt (Alexandre Pereira)

    Konkret sind dies patroni_pending_restart und patroni_is_paused.

  • Mehrere Hosts in der Standby-Cluster-Konfiguration zugelassen (Michael Banck)

    Repliziert der Standby-Cluster von einem Patroni-Cluster, kann clientseitiges Failover nützlich sein, das libpq seit PostgreSQL v10 unterstützt. Dazu setzen primary_conninfo auf dem Standby-Leader und pg_rewind die Option target_session_attrs=read-write in der Verbindungszeichenfolge. Die Datei pgpass wird mit mehreren Zeilen erzeugt, einer pro Host. Statt CHECKPOINT auf den Knoten des Primärclusters aufzurufen, wartet der Standby-Cluster darauf, dass pg_control aktualisiert wird.

Stabilitätsverbesserungen

  • Kompatibilität mit älterem psycopg2 (Alexander Kukushkin)

    Beispielsweise enthält das über Ubuntu-18.04-Pakete installierte psycopg2 die Ausnahme UndefinedFile noch nicht.

  • etcd3-Watcher wird neu gestartet, wenn kein etcd-Knoten antwortet (Alexander Kukushkin)

    Solange der Watcher aktiv ist, liefert get_cluster() weiterhin veraltete Informationen, selbst wenn alle etcd-Knoten ausfallen.

  • Leader-Sperre im pausierten Standby-Cluster wird nicht entfernt (Alexander Kukushkin)

    Zuvor wurde die Sperre nur von einem als Primärserver laufenden Knoten aufrechterhalten, nicht von einem Standby-Leader.

Fehlerbehebungen

  • Fehler beim Bootstrap des Standby-Leaders behoben (Alexander Kukushkin)

    Patroni betrachtete den Bootstrap als fehlgeschlagen, wenn Postgres nach 60 Sekunden noch keine Verbindungen annahm. Der Fehler wurde mit Version 2.1.2 eingeführt.

  • Fehler beim Failover auf einen kaskadierenden Standby behoben (Alexander Kukushkin)

    Bei der Ermittlung der auf einem kaskadierenden Standby anzulegenden Slots wurde nicht berücksichtigt, dass der Leader fehlen könnte.

  • Kleine Probleme im Validator für die Postgres-Konfiguration behoben (Alexander Kukushkin)

    Die Validierung von Ganzzahlparametern, die mit PostgreSQL v14 eingeführt wurden, schlug fehl, weil ihre Minimal- und Maximalwerte in validator.py in Anführungszeichen standen.

  • Replikationszugangsdaten bei der Prüfung des Leader-Status verwendet (Alexander Kukushkin)

    Es kann vorkommen, dass remove_data_directory_on_diverged_timelines gesetzt ist, aber keine rewind_credentials definiert sind und Superuser-Zugriff zwischen den Knoten nicht erlaubt ist.

  • Fehler “port in use” beim Austausch des REST-API-Zertifikats behoben (Ants Aasma)

    Beim Zertifikatswechsel bestand eine Race Condition mit gleichzeitig laufenden API-Anfragen. War während des Austauschs eine Anfrage aktiv, schlug der Austausch mit einem Portbelegungsfehler fehl, und Patroni blieb ohne aktiven API-Server hängen.

  • Fehler beim Cluster-Bootstrap mit % im Passwort behoben (Bastien Wirtz)

    Die Bootstrap-Methode führt den DO-Block mit korrekt in Anführungszeichen gesetzten Parametern aus. Die Methode cursor.execute() kam jedoch mit einer übergebenen leeren Parameterliste nicht zurecht.

  • Ausnahme “AttributeError: no attribute ’leader’” behoben (Hrvoje Milković)

    Sie konnte auftreten, wenn der synchrone Modus aktiviert und der Inhalt des DCS gelöscht worden war.

  • Fehler bei der Prüfung auf divergierende Zeitleisten behoben (Alexander Kukushkin)

    Patroni nahm fälschlich an, dass die Zeitleisten auseinanderliefen. Für pg_rewind war dies unproblematisch. War pg_rewind jedoch nicht erlaubt und remove_data_directory_on_diverged_timelines gesetzt, wurde der bisherige Leader dadurch neu initialisiert.


Version 2.1.2

Veröffentlicht am 2021-12-03

Neue Funktionen

  • Kompatibilität mit psycopg>=3.0 (Alexander Kukushkin)

    Standardmäßig wird psycopg2 bevorzugt. psycopg>=3.0 wird nur verwendet, wenn psycopg2 fehlt oder zu alt ist.

  • Feld dcs_last_seen zur REST-API hinzugefügt (Michael Banck)

    Das Feld enthält den letzten Zeitpunkt, zu dem ein Clustermitglied erfolgreich mit dem DCS kommuniziert hat, als Unix-Epoch-Zeit. Dies hilft, Netzwerkpartitionen zu erkennen und/oder zu analysieren.

  • Leader-Sperre wird freigegeben, wenn pg_controldata “shut down” meldet (Alexander Kukushkin)

    Um langsame Switchover- oder Herunterfahrvorgänge bei langsamem oder fehlschlagendem archive_command zu beheben, entfernt Patroni den Leader-Schlüssel, sobald pg_controldata PGDATA als sauber shut down meldet und geprüft wurde, dass mindestens ein Replikat alle Änderungen empfangen hat. Erfüllt kein Replikat diese Bedingung, wird der Leader-Schlüssel nicht entfernt; das bisherige Verhalten bleibt bestehen und Patroni aktualisiert die Sperre weiterhin.

  • Verbindungsparameter sslcrldir unterstützt (Kostiantyn Nemchenko)

    Der neue Verbindungsparameter wurde mit PostgreSQL v14 eingeführt.

  • ACLs für ZNodes in ZooKeeper konfigurierbar (Alwyn Davis)

    Die neue Konfigurationsoption zookeeper.set_acls veranlasst Kazoo, auf jeden angelegten ZNode eine Standard-ACL anzuwenden.

Stabilitätsverbesserungen

  • Nächster Wiederherstellungsversuch bis zum nächsten HA-Durchlauf verzögert (Alexander Kukushkin)

    War Postgres beispielsweise wegen eines vollen Datenträgers abgestürzt und konnte deshalb nicht starten, versuchte Patroni die Wiederherstellung zu häufig und überflutete die Protokolle.

  • Protokolleintrag vor der möglicherweise länger dauernden Herabstufung hinzugefügt (Michael Banck)

    Eine Herabstufung kann einige Zeit dauern; anhand der Protokolle war nicht unbedingt erkennbar, was gerade geschah.

  • Statusmeldungen “I am” verbessert (Michael Banck)

    no action. I am a secondary ({0}) gegenüber no action. I am ({0}), a secondary

  • wal_keep_segments bei der Umrechnung in wal_keep_size in eine Ganzzahl umgewandelt (Jorge Solórzano)

    wal_keep_segments kann in der globalen dynamischen Konfiguration als Zeichenfolge angegeben werden. Wegen der dynamischen Typisierung von Python wurde dann einfach die Zeichenfolge vervielfacht. Beispiel: wal_keep_segments: "100" wurde in 100100100100100100100100100100100100100100100100MB umgewandelt.

  • Bei aktivierter synchroner Replikation Switchover nur auf synchrone Knoten zugelassen (Alexander Kukushkin)

    Außerdem tritt der Knoten bei der Leader-Wahl nur gegen bekannte synchrone Knoten an.

  • Zwischengespeicherte Rolle als Rückfallwert bei langsamem Postgres verwendet (Alexander Kukushkin)

    In Extremfällen kann Postgres so langsam sein, dass die normale Überwachungsabfrage nicht innerhalb weniger Sekunden endet. Eine nicht korrekt behandelte Ausnahme durch statement_timeout konnte dazu führen, dass Postgres beim Ablauf des Leader-Schlüssels oder einer fehlgeschlagenen Aktualisierung nicht rechtzeitig herabgestuft wurde. Bei einer solchen Ausnahme verwendet Patroni die zwischengespeicherte role, um festzustellen, ob Postgres als Primärserver läuft.

  • Unnötige Aktualisierungen des Mitglieds-ZNodes vermieden (Alexander Kukushkin)

    Wenn sich keine Werte in den Mitgliedsdaten geändert haben, sollte keine Aktualisierung erfolgen.

  • Checkpoint nach der Hochstufung optimiert (Alexander Kukushkin)

    CHECKPOINT wird vermieden, wenn die neueste Zeitleiste bereits in pg_control gespeichert ist. Dadurch entfällt ein unnötiger CHECKPOINT unmittelbar nach der Initialisierung eines neuen Clusters mit initdb.

  • Mitglieder ohne nofailover bei der Wahl synchroner Knoten bevorzugt (Alexander Kukushkin)

    Zuvor wurden synchrone Knoten allein anhand des Replikationsrückstands gewählt. Ein Knoten mit dem Tag nofailover hatte daher dieselbe Chance wie jeder andere Knoten, synchron zu werden. Dieses Verhalten war verwirrend und gefährlich, weil beim Ausfall des Primärservers kein automatisches Failover möglich war.

  • Doppelte Hosts aus dem etcd-Machine-Cache entfernt (Michael Banck)

    Die veröffentlichten Client-URLs im etcd-Cluster können falsch konfiguriert sein. In diesem Fall ist das Entfernen von Duplikaten in Patroni eine einfache Verbesserung.

Fehlerbehebungen

  • Temporäre Replikationsslots bei der Slot-Verwaltung übersprungen (Alexander Kukushkin)

    Seit v10 erstellt pg_basebackup einen temporären Replikationsslot für das WAL-Streaming. Patroni versuchte, ihn zu löschen, weil der Slotname unbekannt erschien. Zur Behebung werden bei der Abfrage der Sicht pg_replication_slots alle temporären Slots übersprungen.

  • Zeitüberschreitungen bei pg_replication_slot_advance() verhindert (Alexander Kukushkin)

    Patroni verwendete hier den Standardwert von statement_timeout. Schlug der Aufruf einmal fehl, war es sehr wahrscheinlich, dass er sich nicht mehr erholte, was zu einem wachsenden pg_wal und zu Bloat in pg_catalog führte.

  • /status wurde bei einer Herabstufung nicht aktualisiert (Alexander Kukushkin)

    Nach der Herabstufung von PostgreSQL aktualisiert der alte Leader die letzte LSN im DCS. Mit 2.1.0 wurde der neue Schlüssel /status eingeführt, die optime wurde jedoch weiterhin nach /optime/leader geschrieben.

  • DCS-Ausnahmen bei der Herabstufung behandelt (Alexander Kukushkin)

    Während der Herabstufung des Primärservers wegen einer fehlgeschlagenen Aktualisierung der Leader-Sperre kann der DCS vollständig ausfallen und get_cluster() eine Ausnahme auslösen. Ohne korrekte Behandlung blieb Postgres gestoppt, bis der DCS wieder verfügbar war.

  • use_unix_socket_repl funktionierte in einigen Fällen nicht (Alexander Kukushkin)

    Insbesondere betraf dies Fälle ohne gesetztes postgresql.unix_socket_directories. Patroni sollte dann den Standardwert von libpq verwenden.

  • Mehrere Probleme mit der REST-API von Patroni behoben (Alexander Kukushkin)

    clusters_unlocked war manchmal nicht definiert, wodurch Ausnahmen im Endpunkt GET /metrics entstanden. Außerdem nahm die Fehlerbehandlung an, dass das Tupel connect_address stets zwei Elemente enthält; bei IPv6 können es tatsächlich mehr sein.

  • Vor der Entscheidung über einen Rewind das Ende der Recovery des neu hochgestuften Knotens abgewartet (Alexander Kukushkin)

    Bis zur tatsächlichen Hochstufung und Erstellung der neuen Zeitleiste kann einige Zeit vergehen. Ohne diese Wartezeit konnten Replikate fälschlich folgern, dass kein Rewind nötig sei.

  • Fehlende Zeitleisten in der History-Datei bei der Rewind-Entscheidung behandelt (Alexander Kukushkin)

    Fehlte die aktuelle Zeitleiste eines Replikats in der History-Datei des Primärservers, nahm das Replikat fälschlich an, dass kein Rewind nötig sei.


Version 2.1.1

Veröffentlicht am 2021-08-19

Neue Funktionen

  • Unterstützung für ETCD-SRV-Namenssuffixe (David Pavlicek)

    etcd kann mehrere etcd-Cluster unter derselben Domain unterscheiden; dies wird nun auch von Patroni unterstützt.

  • Verlauf um den neuen Leader ergänzt (huiyalin525)

    Die Ausgabe von patronictl history erhält dafür eine neue Spalte.

  • CA-Bündel für die Kubernetes-Konfiguration innerhalb des Clusters konfigurierbar (Aron Parsons)

    Standardmäßig verwendet Patroni /var/run/secrets/kubernetes.io/serviceaccount/ca.crt. Die neue Funktion erlaubt die Angabe eines eigenen kubernetes.cacert.

  • Dynamisches Registrieren und Abmelden als Consul-Service sowie Ändern von Tags unterstützt (Tommy Li)

    Zuvor war dafür ein Patroni-Neustart erforderlich.

Fehlerbehebungen

  • Unnötiges Neuladen der REST-API vermieden (Alexander Kukushkin)

    Die vorherige Version führte das Neuladen von REST-API-Zertifikaten ein, wenn diese auf dem Datenträger geändert wurden. Leider wurde unmittelbar nach dem Start bedingungslos neu geladen.

  • Clustermitglieder werden bei gesetztem etcd.use_proxies nicht aufgelöst (Alexander Kukushkin)

    Beim Start prüft Patroni den Zustand des etcd-Clusters, indem es die Mitgliederliste abfragt. Zusätzlich versuchte es, deren Hostnamen aufzulösen. Dies ist bei etcd-Zugriffen über einen Proxy unnötig und erzeugte überflüssige Warnungen.

  • Zeilen mit NULL-Werten in pg_stat_replication übersprungen (Alexander Kukushkin)

    Offenbar kann die Sicht pg_stat_replication NULL-Werte in replay_lsn, flush_lsn oder write_lsn enthalten, selbst wenn state = 'streaming' gilt.


Version 2.1.0

Veröffentlicht am 2021-07-06

Diese Version ergänzt die Kompatibilität mit PostgreSQL v14, erhält logische Replikationsslots über Failover/Switchover hinweg, unterstützt eine Allowlist für die REST-API und reduziert die Protokollausgabe auf eine Zeile pro Heartbeat.

Neue Funktionen

  • Kompatibilität mit PostgreSQL v14 (Alexander Kukushkin)

    Die WAL-Wiedergabe wird fortgesetzt, wenn Patroni selbst nicht im „Pause“-Modus ist. Sie kann durch die Änderung bestimmter Parameter auf dem Primärserver, etwa max_connections, „pausiert“ sein.

  • Failover für logische Slots (Alexander Kukushkin)

    Logische Replikationsslots bleiben unter PostgreSQL v11+ über Failover/Switchover hinweg erhalten. Der Slot wird mit einem Neustart vom Primärserver auf das Replikat kopiert und später mit pg_replication_slot_advance() vorgerückt. Dadurch ist der Slot schon vor dem Failover vorhanden und es sollten keine Ereignisse verloren gehen. Einige Ereignisse können jedoch mehrfach zugestellt werden.

  • Allowlist für die REST-API von Patroni implementiert (Alexander Kukushkin)

    Ist sie konfiguriert, dürfen nur IP-Adressen, die den Regeln entsprechen, unsichere Endpunkte aufrufen. Zusätzlich lassen sich die IP-Adressen der Clustermitglieder automatisch in die Liste aufnehmen.

  • Replikationsverbindungen über Unix-Sockets unterstützt (Mohamad El-Rifai)

    Zuvor verwendete Patroni für Replikationsverbindungen stets TCP, was bei der SSL-Prüfung Probleme verursachen konnte. Unix-Sockets ermöglichen es, den Replikationsbenutzer von der SSL-Prüfung auszunehmen.

  • Health Checks anhand benutzerdefinierter Tags (Arman Jafari Tehrani)

    Neben den vordefinierten Tags: können beliebig viele eigene Tags angegeben werden. Sie erscheinen in patronictl list und in der REST-API und lassen sich nun auch in Health Checks verwenden.

  • Prometheus-Endpunkt /metrics hinzugefügt (Mark Mercado, Michael Banck)

    Der Endpunkt stellt dieselben Metriken wie /patroni bereit.

  • Patroni-Protokolle weniger ausführlich (Alexander Kukushkin)

    Im Normalbetrieb wird pro Durchlauf der HA-Schleife nur eine Zeile geschrieben.

Inkompatible Änderungen

  • Die bisherige Funktion permanent logical replication slots funktioniert unter PostgreSQL v10 und älter nicht mehr (Alexander Kukushkin)

    Die Strategie, logische Slots erst nach der Hochstufung anzulegen, kann nicht garantieren, dass keine logischen Ereignisse verloren gehen, und wird daher deaktiviert.

  • Der Endpunkt /leader liefert immer 200, wenn der Knoten die Sperre hält (Alexander Kukushkin)

    Beim Hochstufen eines Standby-Clusters müssen bisher die Health Checks des Load-Balancers angepasst werden. Dies ist umständlich und wird leicht vergessen. Deshalb wird das Verhalten des Health-Check-Endpunkts /leader geändert: Er gibt 200 zurück, unabhängig davon, ob der Cluster normal oder ein standby_cluster ist.

Verbesserungen der Raft-Unterstützung

  • Zuverlässige Verschlüsselung des Raft-Datenverkehrs (Alexander Kukushkin)

    Durch verschiedene Probleme in PySyncObj war die Verschlüsselungsunterstützung sehr instabil.

  • DNS-Probleme in der Raft-Implementierung behandelt (Alexander Kukushkin)

    Wurden self_addr und/oder partner_addrs über DNS-Namen statt IP-Adressen konfiguriert, löste PySyncObj sie praktisch nur einmal beim Erstellen des Objekts auf. Dies verursachte Probleme, wenn derselbe Knoten mit einer anderen IP-Adresse zurückkehrte.

Stabilitätsverbesserungen

  • Kompatibilität mit psycopg2-2.9+ (Alexander Kukushkin)

    In psycopg2 wird autocommit = True im Block with connection ignoriert, wodurch Verbindungen über das Replikationsprotokoll fehlschlagen.

  • Übermäßig häufige HA-Durchläufe mit ZooKeeper behoben (Alexander Kukushkin)

    Aktualisierungen von Mitglieds-ZNodes lösten eine Kettenreaktion aus, sodass die HA-Schleifen mehrfach direkt hintereinander liefen.

  • REST-API-Zertifikat wird nach Änderung auf dem Datenträger neu geladen (Michael Todorovic)

    Wurde die Zertifikatsdatei direkt ersetzt, führte Patroni kein Neuladen aus.

  • Kein pgpass-Verzeichnis bei Kerberos-Authentifizierung angelegt (Kostiantyn Nemchenko)

    Kerberos- und Passwortauthentifizierung schließen sich gegenseitig aus.

  • Kleine Probleme beim benutzerdefinierten Cluster-Bootstrap behoben (Alexander Kukushkin)

    Postgres wird nur für eine PITR mit hot_standby=off gestartet und nach deren Abschluss neu gestartet.

Fehlerbehebungen

  • Kompatibilität mit kazoo-2.7+ (Alexander Kukushkin)

    Da Patroni Wiederholungsversuche selbst verwaltet, ist es auf das frühere Verhalten von kazoo angewiesen, Anfragen an einen ZooKeeper-Cluster sofort zu verwerfen, wenn keine Verbindungen verfügbar sind.

  • Version des etcd-v3-Clusters wird bei bekannter Proxy-Verbindung ausdrücklich abgefragt (Alexander Kukushkin)

    Patroni greift über gRPC-gateway auf etcd-v3-Cluster zu. Je nach Clusterversion müssen unterschiedliche Endpunkte (/v3, /v3beta oder /v3alpha) verwendet werden. Die Version wurde bisher nur zusammen mit der Clustertopologie ermittelt, was bei Proxy-Verbindungen nie geschah.


Version 2.0.2

Veröffentlicht am 2021-02-22

Neue Funktionen

  • Extern verwaltete Replikationsslots können ignoriert werden (James Coleman)

    Patroni versucht, ihm unbekannte Replikationsslots zu entfernen. Es gibt jedoch Fälle, in denen Slots extern verwaltet werden sollten. Nun lässt sich konfigurieren, welche Slots nicht entfernt werden sollen.

  • Einschränkung der Cipher Suites für die REST-API unterstützt (Gunnar “Nick” Bluth)

    Die Konfiguration erfolgt über restapi.ciphers oder die Umgebungsvariable PATRONI_RESTAPI_CIPHERS.

  • Verschlüsselte TLS-Schlüssel für die REST-API unterstützt (Jonathan S. Katz)

    Die Konfiguration erfolgt über restapi.keyfile_password oder die Umgebungsvariable PATRONI_RESTAPI_KEYFILE_PASSWORD.

  • REST-API-Zugangsdaten in konstanter Zeit verglichen (Alex Brasetvik)

    hmac.compare_digest() ersetzt ==, das für Timing-Angriffe anfällig ist.

  • Synchrone Knoten anhand des Replikationsrückstands gewählt (Krishna Sarabu)

    Überschreitet der Replikationsrückstand eines synchronen Knotens den konfigurierten Schwellwert, kann dieser auf asynchron umgestellt und/oder durch einen anderen Knoten ersetzt werden. Das Verhalten wird mit maximum_lag_on_syncnode gesteuert.

Stabilitätsverbesserungen

  • Postgres wird beim benutzerdefinierten Bootstrap mit hot_standby = off gestartet (Igor Yanchenko)

    Bei einem benutzerdefinierten Bootstrap stellt Patroni das Basisbackup wieder her, startet Postgres und wartet auf das Ende der Recovery. Einige PostgreSQL-Parameter dürfen auf einem Standby nicht kleiner sein als auf dem Primärserver. Ist der aus WAL wiederhergestellte neue Wert höher als der konfigurierte, bricht Postgres mit PANIC ab. Um dies zu vermeiden, erfolgt die benutzerdefinierte Initialisierung ohne hot_standby-Modus.

  • Warnung bei nicht funktionsfähigem erforderlichem Watchdog hinzugefügt (Nicolas Thauvin)

    Ist das Watchdog-Gerät im Modus required nicht beschreibbar oder fehlt es, kann das Mitglied nicht hochgestuft werden. Eine neue Warnung zeigt, wo nach der Fehlkonfiguration gesucht werden sollte.

  • Ausführlichere Meldungen bei Recovery im Einzelbenutzermodus (Alexander Kukushkin)

    Erkennt Patroni, dass PostgreSQL nicht sauber heruntergefahren wurde, führt es in bestimmten Fällen eine Crash-Recovery aus, indem es Postgres im Einzelbenutzermodus startet. Schlug diese Recovery etwa wegen fehlenden Speicherplatzes fehl, wurden die Fehler bisher verschluckt.

  • Kompatibilität mit dem Modul python-consul2 ergänzt (Alexander Kukushkin, Wilfried Roset)

    Das bewährte python-consul wird seit einigen Jahren nicht mehr gepflegt. Deshalb entstand ein Fork mit neuen Funktionen und Fehlerbehebungen.

  • bypass_api_service wird bei patronictl nicht verwendet (Alexander Kukushkin)

    Läuft ein K8s-Pod in einem anderen Namespace als default, hat er nicht unbedingt genügend Berechtigungen, um den Endpunkt kubernetes abzufragen. In diesem Fall gibt Patroni eine Warnung aus und ignoriert bypass_api_service. Bei patronictl war diese Warnung störend.

  • raft.data_dir wird erstellt, falls es fehlt, oder auf Schreibbarkeit geprüft (Mark Mercado)

    Dies verbessert Benutzerfreundlichkeit und Bedienbarkeit.

Fehlerbehebungen

  • Neustart oder Hochstufung wird bei Verlust der Leader-Sperre im pausierten Modus nicht unterbrochen (Alexander Kukushkin)

    Im pausierten Modus darf Postgres ohne Sperre als Primärserver laufen.

  • Problem mit shutdown_request() in der REST-API behoben (Nicolas Limage)

    Um SSL-Verbindungen besser zu behandeln und den Handshake bis zum Threadstart zu verzögern, überschreibt Patroni einige Methoden von HTTPServer. shutdown_request() war dabei vergessen worden.

  • Wartezeit bei Verwendung von ZooKeeper korrigiert (Alexander Kukushkin)

    Zwischen den Ausführungen des HA-Codes konnte Patroni bis zu doppelt so lange wie vorgesehen schlafen.

  • Ungültige os.symlink()-Aufrufe beim Verschieben des Datenverzeichnisses nach fehlgeschlagenem Bootstrap korrigiert (Andrew L’Ecuyer)

    Bei fehlgeschlagenem Bootstrap benennt Patroni Datenverzeichnis, pg_wal und alle Tablespaces um. Danach werden die symbolischen Links aktualisiert, damit das Dateisystem konsistent bleibt. Deren Erstellung schlug fehl, weil src und dst vertauscht waren.

  • Fehler in post_bootstrap() behoben (Alexander Kukushkin)

    War kein Superuser-Passwort konfiguriert, konnte Patroni das Skript post_init nicht aufrufen, wodurch der gesamte Bootstrap fehlschlug.

  • Problem mit pg_rewind im Standby-Cluster behoben (Alexander Kukushkin)

    Wenn der Superuser-Name von postgres abwich, schlug pg_rewind im Standby-Cluster fehl, weil die Verbindungszeichenfolge keinen Datenbanknamen enthielt.

  • Abbruch nur bei ausdrücklich fehlgeschlagener Authentifizierung mit etcd v3 (Alexander Kukushkin)

    Beim Start ermittelt Patroni die Topologie des etcd-Clusters und authentifiziert sich bei Bedarf. War einer der etcd-Server unerreichbar, versuchte Patroni die Authentifizierung auf diesem Server und brach ab, statt es beim nächsten Knoten erneut zu versuchen.

  • Leere Rückgabe von psutil cmdline() behandelt (Alexander Kukushkin)

    Zombie-Prozesse sind weiterhin Kindprozesse des postmaster, besitzen aber kein cmdline().

  • Umgebungsvariable PATRONI_KUBERNETES_USE_ENDPOINTS als booleschen Wert behandelt (Alexander Kukushkin)

    Ohne diese Behandlung ließ sich kubernetes.use_endpoints nicht über die Umgebung deaktivieren.

  • Fehler bei gleichzeitigen Endpoint-Aktualisierungen besser behandelt (Alexander Kukushkin)

    Patroni fragt das aktuelle Endpoint-Objekt ausdrücklich ab, prüft, ob der aktuelle Pod weiterhin die Leader-Sperre hält, und wiederholt die Aktualisierung.


Version 2.0.1

Veröffentlicht am 2020-10-01

Neue Funktionen

  • more als Pager in patronictl edit-config verwendet, wenn less fehlt (Pavel Golub)

    Unter Windows ist dies more.com. Außerdem wurde in requirements.txt cdiff durch ydiff ersetzt; patronictl unterstützt aus Kompatibilitätsgründen weiterhin beide.

  • bind_addr und password für raft unterstützt (Alexander Kukushkin)

    raft.bind_addr kann beim Betrieb hinter NAT nützlich sein. raft.password aktiviert die Verschlüsselung des Datenverkehrs und erfordert das Modul cryptography.

  • Verbindungsparameter sslpassword unterstützt (Kostiantyn Nemchenko)

    Dieser Parameter wurde mit PostgreSQL 13 eingeführt.

Stabilitätsverbesserungen

  • Verhalten im pausierten Modus geändert (Alexander Kukushkin)

    1. Patroni ruft die Methode bootstrap nicht auf, wenn das Verzeichnis PGDATA fehlt oder leer ist.
    2. Patroni beendet sich bei abweichender sysid im pausierten Modus nicht, sondern protokolliert nur eine Warnung.
    3. Im pausierten Modus versucht ein Knoten nicht, den Leader-Schlüssel zu übernehmen, wenn Postgres außerhalb der Recovery läuft und Schreibzugriffe annimmt, die sysid aber nicht zum initialize-Schlüssel passt.
  • master_start_timeout bei der Crash-Recovery angewendet (Alexander Kukushkin)

    Stürzt Postgres auf dem Leader-Knoten ab, führt Patroni eine Crash-Recovery durch, indem es Postgres im Einzelbenutzermodus startet. Währenddessen wird die Leader-Sperre aktualisiert. Ist die Crash-Recovery nach master_start_timeout Sekunden nicht beendet, bricht Patroni sie zwangsweise ab und gibt die Leader-Sperre frei.

  • Extra secure aus den urllib3-Abhängigkeiten entfernt (Alexander Kukushkin)

    Der einzige Grund für die ursprüngliche Aufnahme war die Abhängigkeit von ipaddress für Python 2.7.

Fehlerbehebungen

  • Fehler in Kubernetes.update_leader() behoben (Alexander Kukushkin)

    Eine unbehandelte Ausnahme verhinderte die Herabstufung des Primärservers, wenn die Aktualisierung des Leader-Objekts fehlschlug.

  • Hängendes patronictl bei Verwendung von RAFT behoben (Alexander Kukushkin)

    Wird patronictl mit der Patroni-Konfiguration verwendet, sollte self_addr zu partner_addrs hinzugefügt werden.

  • Fehler in get_guc_value() behoben (Alexander Kukushkin)

    Patroni konnte unter PostgreSQL 12 den Wert von restore_command nicht ermitteln, sodass das Nachladen fehlender WAL-Dateien für pg_rewind nicht funktionierte.


Version 2.0.0

Veröffentlicht am 2020-09-02

Diese Version verbessert die Kompatibilität mit PostgreSQL 13, unterstützt mehrere synchrone Standbys, verbessert den Umgang mit pg_rewind erheblich, ergänzt etcd v3 sowie Patroni auf reinem RAFT (ohne etcd, Consul oder ZooKeeper) und ermöglicht den optionalen Aufruf des Fencing-Skripts pre_promote.

Unterstützung für PostgreSQL 13

  • Kein Aufruf von on_reload bei der Hochstufung zum standby_leader unter PostgreSQL 13+ (Alexander Kukushkin)

    Bei der Hochstufung zum standby_leader wird primary_conninfo geändert, die Rolle aktualisiert und Postgres neu geladen. Da sich on_role_change und on_reload praktisch doppeln, ruft Patroni nur on_role_change auf.

  • Verbindungsparameter gssencmode und channel_binding unterstützt (Alexander Kukushkin)

    PostgreSQL 12 führte gssencmode und PostgreSQL 13 channel_binding ein. Diese Verbindungsparameter können nun verwendet werden, wenn sie im Abschnitt postgresql.authentication definiert sind.

  • Umbenennung von wal_keep_segments in wal_keep_size berücksichtigt (Alexander Kukushkin)

    Bei einer Fehlkonfiguration (wal_keep_segments unter 13 oder wal_keep_size unter älteren Versionen) passt Patroni die Konfiguration automatisch an.

  • pg_rewind unter 13 nach Möglichkeit mit --restore-target-wal verwendet (Alexander Kukushkin)

    Unter PostgreSQL 13 prüft Patroni, ob restore_command konfiguriert ist, und weist pg_rewind an, es zu verwenden.

Neue Funktionen

  • BETABETA

    Patroni auf reinem RAFT unterstützt (Alexander Kukushkin)

    Dies ermöglicht den Betrieb von Patroni ohne Abhängigkeiten von Drittanbietern wie etcd, Consul oder ZooKeeper. Für HA werden entweder drei Patroni-Knoten oder zwei Patroni-Knoten und ein Knoten mit patroni_raft_controller benötigt. Weitere Informationen stehen in der Dokumentation .

  • BETABETA

    etcd-v3-Protokoll über gRPC-gateway unterstützt (Alexander Kukushkin)

    etcd 3.0 erschien vor mehr als vier Jahren; in etcd 3.4 ist v2 standardmäßig deaktiviert. Da v2 möglicherweise vollständig aus etcd entfernt wird, wurde die Unterstützung für etcd v3 in Patroni implementiert. Zur Verwendung muss in der Patroni-Konfigurationsdatei ausdrücklich der Abschnitt etcd3 angelegt werden.

  • Mehrere synchrone Standbys unterstützt (Krishna Sarabu)

    Damit kann ein Cluster mit mehr als einem synchronen Replikat betrieben werden. Die maximale Zahl synchroner Replikate steuert der neue Parameter synchronous_node_count. Sein Standardwert ist 1; bei synchronous_mode gleich off hat er keine Wirkung.

  • Optionaler Aufruf des Skripts pre_promote hinzugefügt (Sergey Dudoladov)

    Anders als Callbacks wird pre_promote synchron nach dem Erlangen der Leader-Sperre, aber vor der Hochstufung von Postgres aufgerufen. Schlägt das Skript fehl oder endet es mit einem Rückgabecode ungleich null, gibt der aktuelle Knoten die Leader-Sperre frei.

  • Konfigurationsverzeichnisse unterstützt (Floris van Nee)

    YAML-Dateien im Verzeichnis werden in alphabetischer Reihenfolge geladen und angewendet.

  • Erweiterte Validierung von PostgreSQL-Parametern (Alexander Kukushkin)

    Unterstützt die aktuelle PostgreSQL-Version einen Parameter nicht oder ist sein Wert falsch, entfernt Patroni den Parameter vollständig oder versucht, den Wert zu korrigieren.

  • Hauptthread nach Abschluss des erzwungenen Checkpoints nach einer Hochstufung aufgeweckt (Alexander Kukushkin)

    Replikate warten auf die Checkpoint-Anzeige im Mitgliedsschlüssel des Leaders im DCS. Dieser Schlüssel wird normalerweise nur einmal pro HA-Durchlauf aktualisiert. Ohne das Aufwecken des Hauptthreads müssten Replikate bis zu loop_wait Sekunden länger als nötig warten.

  • Sicht pg_stat_wal_receiver unter 9.6+ verwendet (Alexander Kukushkin)

    Die Sicht enthält aktuelle Werte für primary_conninfo und primary_slot_name, während der Inhalt von recovery.conf veraltet sein kann.

  • IPv6-Adressen in der Patroni-Konfigurationsdatei besser behandelt (Mateusz Kowalski)

    IPv6-Adressen sollen in eckigen Klammern stehen; Patroni erwartete sie jedoch ohne Klammern. Nun werden beide Formate unterstützt.

  • Consul-Konfigurationsparameter service_tags hinzugefügt (Robert Edström)

    Er eignet sich zur dynamischen Diensterkennung, etwa durch Load-Balancer.

  • SSL-Unterstützung für ZooKeeper implementiert (Kostiantyn Nemchenko)

    Dafür ist kazoo>=2.6.0 erforderlich.

  • Option no_params für benutzerdefinierte Bootstrap-Methoden implementiert (Kostiantyn Nemchenko)

    Damit können wal-g, pgBackRest und andere Backup-Werkzeuge ohne umschließende Shellskripte aufgerufen werden.

  • WAL und Tablespaces nach fehlgeschlagener Initialisierung verschoben (Feike Steenbergen)

    Bei reinit entfernte Patroni bereits neben PGDATA auch das über einen symbolischen Link eingebundene WAL-Verzeichnis und die Tablespaces. Nun führt move_data_directory() einen ähnlichen Vorgang aus: WAL-Verzeichnis und Tablespaces werden umbenannt und die symbolischen Links in PGDATA aktualisiert.

Verbesserungen der pg_rewind-Unterstützung

  • Prüfung auf divergierende Zeitleisten verbessert (Alexander Kukushkin)

    Ein Rewind ist nicht nötig, wenn die auf dem Replikat wiedergegebene Position nicht über den Umschaltpunkt hinausgeht oder das Ende des Checkpoint-Eintrags auf dem bisherigen Primärserver dem Umschaltpunkt entspricht. Um das Ende des Checkpoint-Eintrags zu ermitteln, wird pg_waldump verwendet und dessen Ausgabe ausgewertet.

  • Das Nachladen fehlender WAL-Dateien wird versucht, wenn pg_rewind sie meldet (Alexander Kukushkin)

    Ein von pg_rewind benötigtes WAL-Segment kann bereits aus pg_wal verschwunden sein. Dann kann pg_rewind die Checkpoint-Position vor dem Divergenzpunkt nicht finden. Seit PostgreSQL 13 kann pg_rewind fehlende WAL-Dateien über restore_command nachladen. Bei älteren PostgreSQL-Versionen wertet Patroni die Fehler eines fehlgeschlagenen Rewind-Versuchs aus und versucht selbst, die fehlende WAL-Datei über restore_command abzurufen.

  • Neue Zeitleisten im Standby-Cluster erkannt und bei Bedarf Rewind oder Neuinitialisierung ausgelöst (Alexander Kukushkin)

    Der standby_cluster ist vom Primärcluster entkoppelt und erfährt daher nicht sofort von Leader-Wahlen und Zeitleistenwechseln. Um sie zu erkennen, prüft der standby_leader regelmäßig, ob neue History-Dateien in pg_wal vorhanden sind.

  • Ausgabe des Verlaufsprotokolls gekürzt und übersichtlicher gestaltet (Alexander Kukushkin)

    Bei der Prüfung, ob pg_rewind erforderlich ist, kann Patroni die History-Datei des Primärservers protokollieren. Diese wächst mit jedem Failover/Switchover und belegt schließlich zu viele Zeilen, die überwiegend wenig hilfreich sind. Statt der Rohdaten zeigt Patroni nur noch 3 Zeilen vor und 2 Zeilen nach der aktuellen Replikat-Zeitleiste an.

Verbesserungen unter K8s

  • Python-Modul kubernetes entfernt (Alexander Kukushkin)

    Der offizielle Python-Client für Kubernetes enthält viel automatisch generierten Code und ist daher sehr umfangreich. Patroni verwendet nur einen kleinen Teil der K8s-API-Endpunkte, deren Unterstützung sich leicht direkt implementieren ließ.

  • Umgehen des Service kubernetes ermöglicht (Alexander Kukushkin)

    Unter K8s kommuniziert Patroni normalerweise über den Service kubernetes mit der K8s-API. Dessen Adresse steht in KUBERNETES_SERVICE_HOST. Wie andere Services wird auch kubernetes von kube-proxy behandelt, das je nach Konfiguration ein Userspace-Programm oder iptables zur Weiterleitung verwendet. Die direkte Verbindung zu den K8s-Master-Knoten ohne diese Zwischenkomponente ermöglicht eine bessere Wiederholungsstrategie und verringert das Risiko, dass Postgres bei Upgrades der K8s-Master-Knoten herabgestuft wird.

  • HA-Schleifen aller Pods eines Patroni-Clusters synchronisiert (Alexander Kukushkin)

    Ohne dies verlängerte sich die Fehlererkennungszeit von ttl auf ttl + loop_wait.

  • references und nodename in den Adressen der Subsets unter K8s ausgefüllt (Alexander Kukushkin)

    Einige Load-Balancer sind auf diese Angaben angewiesen.

  • Mögliche Race Conditions in update_leader() behoben (Alexander Kukushkin)

    Gleichzeitige Aktualisierungen der Leader-ConfigMap oder des Leader-Endpoints außerhalb von Patroni können update_leader() scheitern lassen. In diesem Fall prüft Patroni erneut, ob der aktuelle Knoten die Leader-Sperre noch besitzt, und wiederholt die Aktualisierung.

  • Patchen nicht vorhandener Konfiguration ausdrücklich verboten (Alexander Kukushkin)

    Bei anderen DCS als kubernetes schlägt ein PATCH-Aufruf mit einer Ausnahme fehl, weil cluster.config den Wert None hat. Unter Kubernetes wurde stattdessen die Konfigurationsannotation angelegt. Dadurch konnte nach Abschluss der Initialisierung die Bootstrap-Konfiguration nicht geschrieben werden.

  • Fehler im pausierten Modus behoben (Alexander Kukushkin)

    Fehlte der Leader-Schlüssel, entfernten Replikate primary_conninfo und starteten Postgres neu, obwohl sie nichts tun sollten.

Verbesserungen der REST-API

  • TLS-Handshake bis zum Start des Arbeitsthreads verzögert (Alexander Kukushkin, Ben Harris)

    Fand der TLS-Handshake im API-Thread statt und sendete der Client keine Daten, wurde dieser Thread blockiert (DoS-Risiko).

  • basic-auth in der REST-API unabhängig vom Clientzertifikat geprüft (Alexander Kukushkin)

    Bisher wurde nur das Clientzertifikat geprüft. Beide Prüfungen unabhängig auszuführen, ist ein berechtigter Anwendungsfall.

  • Doppeltes CRLF nach den HTTP-Headern einer OPTIONS-Anfrage geschrieben (Sergey Burladyan)

    HAProxy kam mit einem einzelnen CRLF zurecht, während der Consul-Health-Check eine unterbrochene Verbindung und ein unerwartetes EOF meldete.

  • GET /cluster zeigte veraltete Mitgliedsinformationen für ZooKeeper (Alexander Kukushkin)

    Der Endpunkt verwendete die interne Clustersicht von Patroni. Für Patroni selbst war dies unproblematisch; nach außen müssen jedoch aktuelle Informationen angezeigt werden, insbesondere zum Replikationsrückstand.

  • Health Checks für Standby-Cluster korrigiert (Alexander Kukushkin)

    GET /standby-leader antwortete für einen Primärserver und GET /master für einen standby_leader fälschlich mit 200.

  • DELETE /switchover implementiert (Alexander Kukushkin)

    Der REST-API-Aufruf löscht ein geplantes Switchover.

  • Endpunkte /readiness und /liveness erstellt (Alexander Kukushkin)

    Sie können nützlich sein, um beeinträchtigte Pods aus den Subset-Adressen zu entfernen, wenn der K8s-Service mit Label-Selektoren verwendet wird.

  • REST-API-Health-Checks GET /replica und GET /async erweitert (Krishna Sarabu, Alexander Kukushkin)

    Die Prüfungen unterstützen nun das optionale Schlüsselwort ?lag=<max-lag> und antworten nur dann mit 200, wenn der Rückstand kleiner als der angegebene Wert ist. Dabei ist zu beachten, dass die WAL-Position des Leaders nur alle loop_wait Sekunden aktualisiert wird!

  • Benutzerdefinierte HTTP-Header in REST-API-Antworten unterstützt (Yogesh Sharma)

    Dies kann bei Anfragen aus einem Browser nützlich sein.

Verbesserungen in patronictl

  • Kein Aufruf eines nicht vorhandenen Leaders durch patronictl pause (Alexander Kukushkin)

    Beim Pausieren eines Clusters ohne Leader unter K8s warnte patronictl , dass das Mitglied “None” nicht erreichbar sei.

  • Fehlendes conn_url eines Mitglieds behandelt (Alexander Kukushkin)

    Unter K8s kann ein Pod die erforderlichen Annotationen noch nicht besitzen, weil Patroni noch nicht läuft. Dies ließ patronictl fehlschlagen.

  • Ausgabe der Clustertopologie als ASCII-Darstellung hinzugefügt (Maxim Fedotov, Alexander Kukushkin)

    Dies gibt einen hilfreichen Überblick über Cluster mit kaskadierender Replikation.

  • patronictl flush switchover implementiert (Alexander Kukushkin)

    Bisher konnte patronictl flush nur geplante Neustarts abbrechen.

Fehlerbehebungen

  • Attributfehler beim Cluster-Bootstrap mit vorhandenem PGDATA (Krishna Sarabu)

    Beim Anlegen oder Aktualisieren von /history griff Patroni auf ein Objekt ClusterConfig zu, das im DCS noch nicht angelegt war.

  • Ausnahmebehandlung für Consul verbessert (Alexander Kukushkin)

    Eine unbehandelte Ausnahme in touch_member() ließ den gesamten Patroni-Prozess abstürzen.

  • synchronous_commit=local für das Skript post_init erzwungen (Alexander Kukushkin)

    Beim Anlegen der Benutzer (replication, rewind) tat Patroni dies bereits; bei post_init war es übersehen worden. Setzte das Skript den Wert nicht selbst, konnte die Initialisierung im synchronous_mode nicht abgeschlossen werden.

  • maxsize im Consul-Pool-Manager erhöht (ponvenkates)

    Der Standardwert size=1 erzeugte einige Warnungen.

  • Patroni meldete Postgres fälschlich als laufend (Alexander Kukushkin)

    Der Zustand wurde beispielsweise nicht aktualisiert, wenn Postgres wegen eines vollen Datenträgers abstürzte.

  • * statt fehlender oder leerer Werte in pgpass geschrieben (Alexander Kukushkin)

    War etwa standby_cluster.port nicht angegeben, wurde die Datei pgpass fehlerhaft erzeugt.

  • Erstellung eines physischen Replikationsslots für den Leader mit Sonderzeichen im Namen übersprungen (Krishna Sarabu)

    Bei definierten slots schien Patroni für den Leader einen ungenutzten Slot anzulegen, wenn dessen Name Sonderzeichen wie ‘-’ enthielt, etwa “abc-us-1”.

  • Entfernen einer nicht vorhandenen pg_hba.conf beim benutzerdefinierten Bootstrap vermieden (Krishna Sarabu)

    Patroni schlug fehl, wenn pg_hba.conf nach dem benutzerdefinierten Bootstrap außerhalb von pgdata lag.


Version 1.6.5

Veröffentlicht am 2020-08-23

Neue Funktionen

  • Zeitüberschreitung beim Stoppen des Primärservers (Krishna Sarabu)

    Anzahl der Sekunden, die Patroni beim Stoppen von Postgres warten darf. Wirkt nur bei aktiviertem synchronous_mode . Ist der Wert größer als 0 und synchronous_mode aktiviert, sendet Patroni SIGKILL an den Postmaster, wenn das Stoppen länger als der mit master_stop_timeout festgelegte Wert dauert. Der Wert ist entsprechend der gewünschten Abwägung zwischen Dauerhaftigkeit und Verfügbarkeit zu wählen. Ist der Parameter nicht gesetzt oder nicht positiv, hat master_stop_timeout keine Wirkung.

  • Keinen permanenten physischen Slot mit dem Namen des Primärservers erstellen (Alexander Kukushkin)

    Ein häufiges Problem ist, dass der Primärserver WAL-Segmente wiederverwendet, während das Replikat ausgefallen ist. Für statische Cluster mit einer festen Anzahl von Knoten und unveränderlichen Namen gibt es nun eine gute Lösung: Die Namen aller Knoten unter slots aufführen. Dann entfernt der Primärserver den Slot nicht, wenn der Knoten ausgefallen ist (also nicht im DCS registriert ist).

  • Erster Entwurf einer Konfigurationsvalidierung (Igor Yanchenko)

    Mit patroni --validate-config patroni.yaml lässt sich die Patroni-Konfiguration validieren.

  • Maximale Länge der Timeline-Historie konfigurierbar machen (Krishna Sarabu)

    Patroni schreibt die Historie von Failover und Switchover in den Schlüssel /history im DCS. Mit der Zeit wird dieser Schlüssel groß, obwohl meist nur die letzten Zeilen von Interesse sind. Mit max_timelines_history lässt sich die maximale Anzahl der im DCS gespeicherten Einträge der Timeline-Historie festlegen.

  • Kompatibilität mit Kazoo 2.7.0 (Danyal Prout)

    Die Signaturen einiger nicht öffentlicher Methoden von Kazoo wurden geändert, auf die Patroni angewiesen war.

Verbesserungen in patronictl

  • Tags der Mitglieder anzeigen (Kostiantyn Nemchenko, Alexander Kukushkin)

    Tags werden für jeden Knoten einzeln konfiguriert. Bisher gab es keine einfache Möglichkeit, sich einen Überblick darüber zu verschaffen.

  • Ausgabe der Mitglieder verbessern (Alexander Kukushkin)

    Der redundante Cluster-Name wird nur noch im Tabellenkopf angezeigt, nicht mehr in jeder Zeile.

$ patronictl list
+ Cluster: batman (6813309862653668387) +---------+----+-----------+---------------------+
|    Member   |      Host      |  Role  |  State  | TL | Lag in MB | Tags                |
+-------------+----------------+--------+---------+----+-----------+---------------------+
| postgresql0 | 127.0.0.1:5432 | Leader | running |  3 |           | clonefrom: true     |
|             |                |        |         |    |           | noloadbalance: true |
|             |                |        |         |    |           | nosync: true        |
+-------------+----------------+--------+---------+----+-----------+---------------------+
| postgresql1 | 127.0.0.1:5433 |        | running |  3 |       0.0 |                     |
+-------------+----------------+--------+---------+----+-----------+---------------------+
  • Mit Fehler abbrechen, wenn eine ausdrücklich angegebene Konfigurationsdatei nicht gefunden wird (Kaarel Moppel)

    Zuvor gab patronictl lediglich eine DEBUG-Meldung aus.

  • Fehler in patronictl durch nicht initialisierten K8s-Pod beheben (Alexander Kukushkin)

    Patroni ist unter K8s auf bestimmte Pod-Annotationen angewiesen. Wenn einer der Patroni-Pods startet oder stoppt, liegt noch keine gültige Annotation vor, und patronictl brach mit einer Ausnahme ab.

Stabilitätsverbesserungen

  • Nach fehlgeschlagenem LIST-Aufruf an den K8s-API-Server 1 Sekunde warten (Alexander Kukushkin)

    Dies verhindert vor allem eine Flut von Protokollmeldungen, hilft aber auch dabei, dem Hauptthread weiterhin Rechenzeit zu ermöglichen.

  • Anfrage wiederholen, wenn die K8s-API den HTTP-Header retry-after zurückgibt (Alexander Kukushkin)

    Bei Überlastung durch Anfragen kann der K8s-API-Server um einen erneuten Versuch bitten.

  • KUBERNETES_-Umgebungsvariablen aus der Umgebung des Postmasters entfernen (Feike Steenbergen)

    PostgreSQL benötigt die Umgebungsvariablen KUBERNETES_ nicht. Sind sie für den Postmaster verfügbar, können jedoch auch Backends und reguläre Datenbankbenutzer darauf zugreifen, etwa über pl/perl.

  • Tablespaces bei der Neuinitialisierung bereinigen (Krishna Sarabu)

    Bei der Neuinitialisierung entfernte Patroni nur PGDATA und ließ benutzerdefinierte Tablespace-Verzeichnisse bestehen. Dadurch geriet Patroni in eine Schleife wiederholter Neuinitialisierungen. Bisher ließ sich das Problem mit einem Skript für einen benutzerdefinierten Bootstrap umgehen.

  • Nach der Hochstufung ausdrücklich CHECKPOINT ausführen (Alexander Kukushkin)

    Dadurch verkürzt sich die Zeit, bis der neue Primärserver für pg_rewind verwendbar ist.

  • etcd-Mitglieder gezielt aktualisieren (Alexander Kukushkin)

    Schlägt eine Anfrage bei allen Mitgliedern des etcd-Clusters fehl, prüft Patroni vor dem nächsten Versuch erneut die A- oder SRV-Einträge auf Änderungen der IPs/Hosts.

  • Fehlende Werte aus pg_controldata überspringen (Feike Steenbergen)

    Werte fehlen, wenn ausführbare Dateien einer Version verwendet werden, die nicht zu PGDATA passt. Patroni versucht dennoch, Postgres zu starten. Postgres meldet dann die abweichende Hauptversion und bricht mit einem Fehler ab.

Fehlerbehebungen

  • SSL-Prüfung für Consul bei Bedarf deaktivieren (Julien Riou)

    Ab einer bestimmten Version von urllib3 muss cert_reqs ausdrücklich auf ssl.CERT_NONE gesetzt werden, um die SSL-Prüfung tatsächlich zu deaktivieren.

  • Nicht in jedem Durchlauf der HA-Schleife eine Replikationsverbindung öffnen (Alexander Kukushkin)

    Diese Regression wurde in 1.6.4 eingeführt.

  • Callback on_role_change auf einem ausgefallenen Primärserver aufrufen (Alexander Kukushkin)

    Unter bestimmten Umständen konnte die virtuelle IP am alten Primärserver verbleiben. Diese Regression wurde in 1.4.5 eingeführt.

  • Rewind-Zustand zurücksetzen, wenn Postgres nach erfolgreichem pg_rewind gestartet wurde (Alexander Kukushkin)

    Aufgrund dieses Fehlers startete Patroni im Pausenmodus ein manuell heruntergefahrenes Postgres wieder.

  • Bei der Prüfung von recovery.conf den Wert von recovery_min_apply_delay in ms umrechnen

    War recovery_min_apply_delay unter einer PostgreSQL-Version vor 12 konfiguriert, startete Patroni das Replikat endlos neu.

  • Kompatibilität mit PyInstaller (Alexander Kukushkin)

    PyInstaller bündelt Python-Anwendungen zu eigenständig ausführbaren Dateien. Die Kompatibilität ging beim Wechsel von fork zu spawn für multiprocessing verloren.


Version 1.6.4

Veröffentlicht am 2020-01-27

Neue Funktionen

  • Option --wait für patronictl reinit implementieren (Igor Yanchenko)

    Mit der Option --wait wartet Patronictl auf den Abschluss von reinit.

  • Weitere Verbesserungen der Windows-Unterstützung (Igor Yanchenko, Alexander Kukushkin)

    1. Alle für Integrationstests verwendeten Shell-Skripte wurden in Python neu geschrieben.
    2. Auf Nicht-POSIX-Systemen wird Postgres mit pg_ctl kill gestoppt.
    3. Es wird nicht versucht, Unix-Domain-Sockets zu verwenden.

Stabilitätsverbesserungen

  • Sicherstellen, dass unix_socket_directories und stats_temp_directory existieren (Igor Yanchenko)

    Beim Start von Patroni und Postgres wird geprüft, ob unix_socket_directories und stats_temp_directory existieren, andernfalls wird versucht, sie anzulegen. Schlägt das Anlegen fehl, beendet sich Patroni.

  • Sicherstellen, dass postgresql.pgpass an einem Ort liegt, auf den Patroni Schreibzugriff hat (Igor Yanchenko)

    Ohne Schreibzugriff beendet sich Patroni mit einer Ausnahme.

  • Consul-Prüfung serfHealth standardmäßig deaktivieren (Kostiantyn Nemchenko)

    Selbst bei kleinen Netzwerkproblemen führt eine fehlgeschlagene serfHealth-Prüfung dazu, dass alle dem Knoten zugeordneten Sessions ungültig werden. Dadurch geht der Leader-Schlüssel deutlich vor Ablauf von ttl verloren, was unerwünschte Neustarts von Replikaten und möglicherweise eine Herabstufung des Primärservers verursacht.

  • TCP-Keepalives für Verbindungen zur K8s-API konfigurieren (Alexander Kukushkin)

    Werden nach TTL Sekunden keine Daten vom Socket empfangen, kann die Verbindung als unterbrochen gelten.

  • Protokollierung von Passwörtern bei der Benutzererstellung vermeiden (Alexander Kukushkin)

    Wird das Passwort zurückgewiesen oder ist die Protokollierung ausführlich beziehungsweise gar nicht konfiguriert, kann das Passwort in den Postgres-Protokollen landen. Um dies zu vermeiden, setzt Patroni log_statement, log_min_duration_statement und log_min_error_statement vor dem Versuch, einen Benutzer zu erstellen oder zu aktualisieren, auf sichere Werte.

Fehlerbehebungen

  • Auf kaskadierenden Replikaten restore_command aus der Konfiguration standby_cluster verwenden (Alexander Kukushkin)

    Der standby_leader tat dies bereits seit Einführung der Funktion. Geschieht dies nicht auch auf Replikaten, können sie möglicherweise nicht zum Standby-Leader aufholen.

  • Vom Standby-Cluster gemeldete Timeline aktualisieren (Alexander Kukushkin)

    Bei einem Timeline-Wechsel replizierte der Standby-Cluster korrekt vom Primärserver, aber patronictl meldete die alte Timeline.

  • Bestimmte Recovery-Parameter in custom_conf zulassen (Alexander Kukushkin)

    Bei der Validierung der Recovery-Parameter auf einem Replikat überspringt Patroni archive_cleanup_command, promote_trigger_file, recovery_end_command, recovery_min_apply_delay und restore_command, wenn sie nicht in der Patroni-Konfiguration, sondern in anderen Dateien als postgresql.auto.conf oder postgresql.conf festgelegt sind.

  • Behandlung von PostgreSQL-Parametern mit Punkt im Namen verbessern (Alexander Kukushkin)

    Solche Parameter können von Erweiterungen definiert werden, wobei die Einheit nicht unbedingt eine Zeichenkette ist. Eine Wertänderung kann einen Neustart erfordern, etwa bei pg_stat_statements.max.

  • Ausnahmebehandlung beim Herunterfahren verbessern (Alexander Kukushkin)

    Beim Herunterfahren versucht Patroni, seinen Status im DCS zu aktualisieren. Ist der DCS nicht erreichbar, kann eine Ausnahme auftreten. Die fehlende Ausnahmebehandlung verhinderte das Beenden des Protokollierungsthreads.


Version 1.6.3

Veröffentlicht am 2019-12-05

Fehlerbehebungen

  • Passwort bei der Ausführung von pg_rewind nicht offenlegen (Alexander Kukushkin)

    Der Fehler wurde mit #1301 eingeführt.

  • Verbindungsparameter aus postgresql.authentication auf pg_basebackup und benutzerdefinierte Methoden zur Replikaterstellung anwenden (Alexander Kukushkin)

    Diese verwendeten eine URL-artige Verbindungszeichenfolge, weshalb die Parameter nie angewendet wurden.


Version 1.6.2

Veröffentlicht am 2019-12-05

Neue Funktionen

  • patroni --version implementieren (Igor Yanchenko)

    Der Befehl gibt die aktuelle Patroni-Version aus und beendet sich.

  • HTTP-Header user-agent für alle HTTP-Anfragen setzen (Alexander Kukushkin)

    Patroni kommuniziert über HTTP mit den APIs von Consul, etcd und Kubernetes. Ein gezielt zusammengesetzter user-agent (z. B. Patroni/1.6.2 Python/3.6.8 Linux) kann bei der Fehlersuche und Überwachung hilfreich sein.

  • Protokollstufe für Ausnahme-Tracebacks konfigurierbar machen (Igor Yanchenko)

    Bei log.traceback_level=DEBUG werden Tracebacks nur angezeigt, wenn log.level=DEBUG gesetzt ist. Das Standardverhalten bleibt unverändert.

Stabilitätsverbesserungen

  • Beim Suchen des in der Konfigurationsdatei benötigten Moduls nicht alle DCS-Module importieren (Alexander Kukushkin)

    Wird beispielsweise nur Zookeeper benötigt, müssen die Module für etcd, Consul und Kubernetes nicht importiert werden. Das reduziert den Speicherverbrauch und vermeidet die INFO-Meldungen Failed to import smth.

  • Python-Modul requests aus den expliziten Abhängigkeiten entfernen (Alexander Kukushkin)

    Es wurde für keine kritische Funktion verwendet, verursachte aber bei neuen Versionen von urllib3 zahlreiche Probleme.

  • Behandlung von etcd.hosts als kommagetrennter Zeichenkette statt YAML-Array verbessern (Igor Yanchenko)

    Zuvor führte das Format host1:port1, host2:port2 (mit Leerzeichen nach dem Komma) zu einem Fehler.

Verbesserungen der Bedienbarkeit

  • In patronictl keine Auswahl aus einer leeren Mitgliederliste verlangen (Igor Yanchenko)

    Bei einem falschen Cluster-Namen wird eine Ausnahme ausgelöst, statt zur Auswahl eines Mitglieds aus einer leeren Liste aufzufordern.

  • Aussagekräftigere Fehlermeldung, wenn sich die REST API nicht an eine Adresse binden kann (Igor Yanchenko)

    Für unerfahrene Nutzer kann die Ursache anhand eines Python-Stacktraces schwer zu erkennen sein.

Fehlerbehebungen

  • Berechnung von wal_buffers korrigieren (Alexander Kukushkin)

    In PostgreSQL 11 wurde die Basiseinheit von Blöcken mit 8 kB auf Bytes geändert.

  • passfile in primary_conninfo nur unter PostgreSQL 10+ verwenden (Alexander Kukushkin)

    Bei älteren Versionen ist die Funktion von passfile nur gewährleistet, wenn die neueste Version von libpq installiert ist.


Version 1.6.1

Veröffentlicht am 2019-11-15

Neue Funktionen

  • Umgebungsvariable PATRONICTL_CONFIG_FILE hinzufügen (msvechla)

    Damit lässt sich das Argument --config-file für patronictl über die Umgebung konfigurieren.

  • patronictl history implementieren (Alexander Kukushkin)

    Der Befehl zeigt die Historie von Failover und Switchover.

  • Bei pg_rewind den Wert -c statement_timeout=0 in PGOPTIONS übergeben (Alexander Kukushkin)

    Dadurch wird verhindert, dass eine von pg_rewind ausgeführte Anweisung abgebrochen wird, weil statement_timeout auf dem Server sehr niedrig eingestellt ist.

  • Niedrigere Werte für die PostgreSQL-Konfiguration zulassen (Soulou)

    Patroni ließ für einige PostgreSQL-Konfigurationsparameter keine Werte unterhalb fest programmierter Grenzen zu. Die zulässigen Mindestwerte wurden gesenkt; die Standardwerte bleiben unverändert.

  • Zertifikatsbasierte Authentifizierung ermöglichen (Jonathan S. Katz)

    Diese Funktion ermöglicht zertifikatsbasierte Authentifizierung für Superuser-, Replikations- und Rewind-Konten. Außerdem kann der gewünschte sslmode für die Verbindung festgelegt werden.

  • In primary_conninfo anstelle des Passworts passfile verwenden (Alexander Kukushkin)

    Dadurch müssen für postgresql.conf keine Berechtigungen von 600 gesetzt werden.

  • pg_ctl reload unabhängig von Konfigurationsänderungen ausführen (Alexander Kukushkin)

    Manche Konfigurationsdateien werden möglicherweise nicht von Patroni verwaltet. Beim Neuladen über die REST API oder durch Senden von SIGHUP an den Patroni-Prozess wird üblicherweise erwartet, dass auch Postgres neu geladen wird. Zuvor geschah dies nicht, wenn der Abschnitt postgresql der Patroni-Konfiguration unverändert war.

  • Alle Recovery-Parameter vergleichen, nicht nur primary_conninfo (Alexander Kukushkin)

    Zuvor prüfte die Methode check_recovery_conf() nur Änderungen an primary_conninfo und berücksichtigte keine anderen Recovery-Parameter.

  • Einige Recovery-Parameter ohne Neustart anwenden können (Alexander Kukushkin)

    Ab PostgreSQL 12 lassen sich folgende Recovery-Parameter ohne Neustart ändern: archive_cleanup_command, promote_trigger_file, recovery_end_command und recovery_min_apply_delay. Diese Liste wird in künftigen Postgres-Versionen erweitert, und Patroni wird dies automatisch unterstützen.

  • Änderung von use_slots im laufenden Betrieb ermöglichen (Alexander Kukushkin)

    Zuvor mussten dafür Patroni neu gestartet und Slots manuell entfernt werden.

  • Beim Start von Postgres nur Umgebungsvariablen mit dem Präfix PATRONI_ entfernen (Cody Coons)

    Dadurch werden zahlreiche Probleme beim Einsatz verschiedener Foreign Data Wrappers gelöst.

Stabilitätsverbesserungen

  • Bei der Arbeit mit der K8s-API LIST + WATCH verwenden (Alexander Kukushkin)

    Dadurch lassen sich Objektänderungen (Pods, Endpoints/ConfigMaps) effizient empfangen, und die K8s-Masterknoten werden weniger belastet.

  • Ablauf verbessern, wenn PGDATA beim Bootstrap nicht leer ist (Alexander Kukushkin)

    Laut dem Quellcode von initdb kann PGDATA als leer gelten, wenn es lediglich lost+found und .dotfiles enthält. Patroni verhält sich nun ebenso. Ist PGDATA nicht leer und aus Sicht von pg_controldata zugleich ungültig, meldet Patroni einen Fehler und beendet sich.

  • Aufwendigen Aufruf von os.listdir() in jedem HA-Schleifendurchlauf vermeiden (Alexander Kukushkin)

    Unter hoher IO-Last kann os.listdir() mehrere Sekunden oder sogar Minuten benötigen und die HA-Schleife von Patroni erheblich beeinträchtigen. Wegen ausbleibender Aktualisierungen kann dadurch sogar der Leader-Schlüssel aus dem DCS verschwinden. Eine bessere und weniger aufwendige Prüfung, ob PGDATA nicht leer ist, besteht darin, das Vorhandensein der Datei global/pg_control in PGDATA zu prüfen. Dies wird nun verwendet.

  • Verbesserungen an der Protokollierungsinfrastruktur (Alexander Kukushkin)

    Zuvor konnten beim Herunterfahren die letzten Protokollzeilen verloren gehen, weil der Protokollierungsthread ein daemon-Thread war.

  • Unter Python 3.4+ die Multiprocessing-Startmethode spawn verwenden (Maciej Kowalczyk)

    In Python besteht ein bekanntes Problem beim Zusammenspiel von Threads und Multiprocessing. Der Wechsel von der Standardmethode fork zu spawn wird als Umgehung empfohlen. Andernfalls kann der Prozess zum Starten des Postmasters hängen bleiben, und Patroni meldet endlos INFO: restarting after failure in progress, obwohl Postgres tatsächlich läuft.

Verbesserungen der REST API

  • Prüfung von Client-Zertifikaten in der REST API ermöglichen (Alexander Kukushkin)

    Bei verify_client mit dem Wert required prüft Patroni Client-Zertifikate für alle REST-API-Aufrufe. Bei optional werden Client-Zertifikate für alle unsicheren REST-API-Endpunkte geprüft.

  • Bei der Health-Check-Anfrage GET /replica den Antwortcode 503 zurückgeben, wenn Postgres nicht läuft (Alexander Anikin)

    Postgres kann längere Zeit in der Recovery verbringen, bevor es Client-Verbindungen annimmt.

  • Endpunkte /history und /cluster implementieren (Alexander Kukushkin)

    Der Endpunkt /history zeigt den Inhalt des Schlüssels history im DCS. Der Endpunkt /cluster zeigt alle Cluster-Mitglieder und Betriebsinformationen, etwa ausstehende oder geplante Neustarts beziehungsweise Switchover.

Verbesserungen der etcd-Unterstützung

  • Bei internem etcd-RAFT-Fehler erneut versuchen (Alexander Kukushkin)

    Beim Herunterfahren sendet ein etcd-Knoten response code=300, data='etcdserver: server stopped'. Dies führte dazu, dass Patroni den Primärserver herabstufte.

  • Wiederholungsversuche für etcd-Anfragen nicht zu früh aufgeben (Alexander Kukushkin)

    Bei Netzwerkproblemen hatte Patroni die Liste der etcd-Knoten schnell ausgeschöpft und gab auf, ohne die gesamte Zeit retry_timeout zu nutzen. Dies konnte zur Herabstufung des Primärservers führen.

Fehlerbehebungen

  • synchronous_commit beim Erteilen von Ausführungsrechten an den Benutzer für pg_rewind deaktivieren (kremius)

    Beim Bootstrap mit synchronous_mode_strict: true wartete die Anweisung GRANT EXECUTE unbegrenzt, da keine synchronen Standby-Knoten verfügbar waren.

  • Speicherleck unter Python 3.7 beheben (Alexander Kukushkin)

    Patroni verwendet ThreadingMixIn zur Verarbeitung von REST-API-Anfragen. Seit Python 3.7 sind die für jede Anfrage erzeugten Threads standardmäßig keine Daemon-Threads.

  • Race Conditions bei asynchronen Aktionen beheben (Alexander Kukushkin)

    Es konnte vorkommen, dass patronictl reinit --force durch den Versuch überschrieben wurde, ein gestopptes Postgres wiederherzustellen. Dadurch versuchte Patroni, Postgres zu starten, während das Basis-Backup noch lief.

  • Race Condition in der Methode postmaster_start_time() beheben (Alexander Kukushkin)

    Wird die Methode aus dem REST-API-Thread ausgeführt, muss ein separates Cursor-Objekt erstellt werden.

  • Fehler bei der Hochstufung synchroner Standbys mit Großbuchstaben im Namen beheben (Alexander Kukushkin)

    Der Name wurde in Kleinbuchstaben umgewandelt, weil Postgres beim Vergleich von application_name mit dem Wert in synchronous_standby_names ebenso vorging.

  • Vor dem Start eines neuen Callbacks alle Kindprozesse zusammen mit dem Callback-Prozess beenden (Alexander Kukushkin)

    Andernfalls lassen sich Callbacks in Bash nur schwer implementieren, und es können schließlich zwei Callbacks gleichzeitig laufen.

  • Problem mit ‘start failed’ beheben (Alexander Kukushkin)

    Unter bestimmten Bedingungen konnte der Postgres-Zustand auf ‘start failed’ gesetzt werden, obwohl Postgres lief.


Version 1.6.0

Veröffentlicht am 2019-08-05

Diese Version ergänzt die Kompatibilität mit PostgreSQL 12, ermöglicht pg_rewind ohne Superuser unter PostgreSQL 11 und neuer und aktiviert die IPv6-Unterstützung.

Neue Funktionen

  • Psycopg2 aus den Abhängigkeiten entfernen; separate Installation erforderlich (Alexander Kukushkin)

    Ab 2.8.0 wurde psycopg2 in zwei Pakete aufgeteilt: psycopg2 und psycopg2-binary. Beide konnten gleichzeitig an derselben Stelle im Dateisystem installiert werden. Um Abhängigkeitsprobleme zu verringern, bleibt die Installationsmethode den Nutzern überlassen. Die verfügbaren Möglichkeiten beschreibt die Dokumentation .

  • Kompatibilität mit PostgreSQL 12 (Alexander Kukushkin)

    Ab PostgreSQL 12 gibt es keine recovery.conf mehr; alle bisherigen Recovery-Parameter wurden in GUCs umgewandelt. Zum Schutz vor ALTER SYSTEM SET primary_conninfo und ähnlichen Änderungen analysiert Patroni postgresql.auto.conf und entfernt daraus alle Standby- und Recovery-Parameter. Die Patroni-Konfiguration bleibt abwärtskompatibel: Obwohl restore_command nun ein GUC ist, kann es weiterhin im Abschnitt postgresql.recovery_conf.restore_command angegeben werden. Patroni schreibt es für PostgreSQL 12 in postgresql.conf.

  • pg_rewind ohne Superuser unter PostgreSQL 11 und neuer ermöglichen (Alexander Kukushkin)

    Für diese Funktion müssen username und password im Abschnitt postgresql.authentication.rewind der Patroni-Konfigurationsdatei festgelegt werden. Bei einem bestehenden Cluster muss der Benutzer manuell erstellt und für einige Funktionen die Berechtigung GRANT EXECUTE erteilt werden. Weitere Einzelheiten finden sich in der PostgreSQL-Dokumentation .

  • Tatsächliche und gewünschte Werte von primary_conninfo auf Replikaten gezielt vergleichen (Alexander Kukushkin)

    Dies kann einen Neustart des Replikats vermeiden, wenn ein bestehender Primärserver-/Standby-Cluster auf die Verwaltung durch Patroni umgestellt wird.

  • IPv6-Unterstützung (Alexander Kukushkin)

    Es gab zwei wesentliche Probleme: Der REST-API-Dienst von Patroni lauschte nur auf 0.0.0.0, und IPv6-Adressen in api_url und conn_url wurden nicht korrekt in eckige Klammern gesetzt.

  • Kerberos-Unterstützung (Ajith Vilas, Alexander Kukushkin)

    Damit kann zwischen Postgres-Knoten Kerberos-Authentifizierung verwendet werden, anstatt Passwörter in der Patroni-Konfigurationsdatei festzulegen.

  • pg_ident.conf verwalten (Alexander Kukushkin)

    Diese Funktion arbeitet ähnlich wie pg_hba.conf: Ist postgresql.pg_ident in der Konfigurationsdatei oder im DCS definiert, schreibt Patroni dessen Wert in pg_ident.conf. Ist jedoch postgresql.parameters.ident_file definiert, geht Patroni davon aus, dass pg_ident extern verwaltet wird, und aktualisiert die Datei nicht.

Verbesserungen der REST API

  • Endpunkt /health hinzufügen (Wilfried Roset)

    Er gibt nur dann den HTTP-Statuscode 200 zurück, wenn PostgreSQL läuft.

  • Endpunkte /read-only und /read-write hinzufügen (Julien Riou)

    Der Endpunkt /read-only verteilt Lesezugriffe auf Replikate und den Primärserver. Der Endpunkt /read-write ist ein Alias für /primary, /leader und /master.

  • REST-API-Socket mit SSLContext umschließen (Julien Riou)

    ssl.wrap_socket() ist veraltet und ließ weiterhin Protokolle wie TLS 1.1 zu, die demnächst ebenfalls veraltet sein würden.

Verbesserungen der Protokollierung

  • Zweistufige Protokollierung (Alexander Kukushkin)

    Alle Protokollmeldungen werden zunächst in eine Warteschlange im Arbeitsspeicher geschrieben und später asynchron aus einem separaten Thread nach stderr oder in eine Datei ausgegeben. Die maximale Größe der Warteschlange ist begrenzt und konfigurierbar. Wird die Grenze erreicht, gehen Protokollmeldungen verloren. Dies ist weiterhin besser, als die HA-Schleife zu blockieren.

  • Debug-Protokollierung für API-Aufrufe mit GET/OPTIONS einschließlich Latenz aktivieren (Jan Tomsa)

    Dies erleichtert die Fehlersuche bei Health Checks durch HAProxy, Consul oder andere Werkzeuge, die den Primärserver beziehungsweise die Replikate ermitteln.

  • In Retry abgefangene Ausnahmen protokollieren (Daniel Kucera)

    Sobald die maximale Anzahl von Versuchen oder die Wartezeit erreicht ist, wird die letzte Ausnahme protokolliert. Dies soll die Fehlersuche bei gestörter Kommunikation mit dem DCS erleichtern.

Verbesserungen in patronictl

  • Dialoge für geplante Switchover und Neustarts verbessern (Rafia Sabih)

    Zuvor berücksichtigten die Dialoge geplante Aktionen nicht und waren dadurch irreführend.

  • Existenz der Konfigurationsdatei prüfen (Wilfried Roset)

    Wenn die angegebene Datei nicht existiert, wird dies ausdrücklich gemeldet, statt es stillschweigend zu ignorieren und damit Missverständnisse zu begünstigen.

  • Ersatzwert für EDITOR hinzufügen (Wilfried Roset)

    War die Umgebungsvariable EDITOR nicht definiert, brach patronictl edit-config mit PatroniCtlException ab. Die neue Strategie versucht zunächst editor, dann vi, das auf den meisten Systemen verfügbar sein sollte.

Verbesserungen der Consul-Unterstützung

  • Konsistenzmodus für Consul konfigurierbar machen (Jan Tomsa)

    Weitere Informationen zum Konsistenzmodus finden sich hier .

  • Consul-Konfiguration bei SIGHUP neu laden (Cameron Daniel Kucera, Alexander Kukushkin)

    Dies ist besonders nützlich, wenn der Wert von token geändert wird.

Fehlerbehebungen

  • Sonderfall bei Switchover/Failover beheben (Sharoon Thomas)

    Die Variable scheduled_at kann undefiniert sein, wenn die REST API nicht erreichbar ist und stattdessen der DCS verwendet wird.

  • Bei benutzerdefiniertem Bootstrap trust für localhost in pg_hba.conf freigeben (Alexander Kukushkin)

    Zuvor war dies nur für unix_socket freigegeben, was zahlreiche Fehler verursachte: FATAL: no pg_hba.conf entry for replication connection from host "127.0.0.1", user "replicator"

  • Synchronen Knoten auch dann als funktionsfähig einstufen, wenn der bisherige Leader weiter fortgeschritten ist (Alexander Kukushkin)

    Verliert der Primärserver den Zugriff auf den DCS, startet er Postgres im schreibgeschützten Modus neu. Andere Knoten können den alten Primärserver jedoch möglicherweise weiterhin über die REST API erreichen. In diesem Fall wurde der synchrone Standby nicht hochgestuft, weil der alte Primärserver eine weiter fortgeschrittene WAL-Position meldete.

  • Fehlerbehebungen für Standby-Cluster (Alexander Kukushkin)

    Der Bootstrap eines Replikats in einem Standby-Cluster bei nicht erreichbarem standby_leader wird ermöglicht. Hinzu kommen einige kleinere Korrekturen.


Version 1.5.6

Veröffentlicht am 2019-08-03

Neue Funktionen

  • Zugriff auf einen etcd-Cluster über mehrere Proxys unterstützen (Alexander Kukushkin)

    Ein etcd-Cluster ist möglicherweise nur über mehrere Proxys und nicht direkt erreichbar. In diesem Fall ermittelt Patroni die etcd-Topologie nicht, sondern verwendet die Proxy-Hosts reihum. Das Verhalten wird über etcd.use_proxies gesteuert.

  • Callback-Verhalten bei Rollenänderung eines Knotens ändern (Alexander Kukushkin)

    Wechselt die Rolle von master oder standby_leader zu replica oder von replica zu standby_leader, wird statt on_restart nun der Callback on_role_change aufgerufen.

  • Startverfahren für Postgres ändern (Alexander Kukushkin)

    Statt sich selbst auszuführen, wird multiprocessing.Process verwendet. Die Postmaster-PID wird über multiprocessing.Pipe an den Patroni-Prozess übertragen. Zuvor wurden Pipes verwendet, wodurch stdin beim Postmaster-Prozess geschlossen blieb.

Fehlerbehebungen

  • Von der REST API zurückgegebene Rolle des Standby-Leaders korrigieren (Alexander Kukushkin)

    Fälschlicherweise wurde replica statt standby_leader zurückgegeben.

  • Auf das Ende eines Callbacks warten, wenn er nicht beendet werden kann (Julien Tachoires)

    Patroni hat nicht genügend Rechte, um ein unter sudo laufendes Callback-Skript zu beenden. Dadurch wurde der neue Callback verworfen. Kann das laufende Skript nicht beendet werden, wartet Patroni nun auf dessen Abschluss und führt anschließend den nächsten Callback aus.

  • Sperrdauer der Methode dcs.get_cluster verkürzen (Alexander Kukushkin)

    Weil die Sperre gehalten wurde, beeinträchtigte ein langsamer DCS die REST-API-Health-Checks und führte zu Fehlalarmen.

  • Bereinigung von PGDATA verbessern, wenn pg_wal/pg_xlog ein symbolischer Link ist (Julien Tachoires)

    In diesem Fall entfernt Patroni Dateien ausdrücklich aus dem Zielverzeichnis.

  • Unnötige Verwendung von os.path.relpath entfernen (Ants Aasma)

    Die Funktion muss das Arbeitsverzeichnis auflösen können. Dies schlägt fehl, wenn Patroni in einem Verzeichnis gestartet wird, das später aus dem Dateisystem entfernt wird.

  • Bei der Kommunikation mit etcd keine SSL-Version erzwingen (Alexander Kukushkin)

    Aus unbekanntem Grund basiert python3-etcd unter Debian und Ubuntu nicht auf der neuesten Paketversion und erzwingt deshalb TLSv1, das von etcd v3 nicht unterstützt wird. Dieses Problem wurde auf Patroni-Seite behoben.


Version 1.5.5

Veröffentlicht am 2019-02-15

Diese Version ermöglicht die automatische Neuinitialisierung des bisherigen Primärservers, verbessert die Ausgabe von patronictl list und behebt mehrere Fehler.

Neue Funktionen

  • Umgebungsvariablen PATRONI_ETCD_PROTOCOL, PATRONI_ETCD_USERNAME und PATRONI_ETCD_PASSWORD unterstützen (Étienne M)

    Zuvor konnten diese Werte nur in der Konfigurationsdatei oder als Teil von PATRONI_ETCD_URL festgelegt werden, was nicht immer praktisch ist.

  • Automatische Neuinitialisierung des bisherigen Primärservers ermöglichen (Alexander Kukushkin)

    Ist pg_rewind deaktiviert oder nicht verwendbar, kann der bisherige Primärserver aufgrund auseinanderlaufender Timelines möglicherweise nicht als neues Replikat starten. In diesem Fall hilft nur, das Datenverzeichnis zu löschen und die Instanz neu zu initialisieren. Dieses Verhalten lässt sich mit postgresql.remove_data_directory_on_diverged_timelines ändern. Ist die Option gesetzt, löscht Patroni das Datenverzeichnis und initialisiert den bisherigen Primärserver automatisch neu.

  • Timeline-Informationen in patronictl list anzeigen (Alexander Kukushkin)

    Dies erleichtert das Erkennen veralteter Replikate. Außerdem enthält Host den Zusatz ‘:{port}’, wenn der Port vom Standardwert abweicht oder mehrere Mitglieder auf demselben Host laufen.

  • Einen Headless Service für den Endpoint $SCOPE-config erstellen (Alexander Kukushkin)

    Der Endpoint „config“ enthält die clusterweite Patroni- und Postgres-Konfiguration, die History-Datei und vor allem den Schlüssel initialize. Beim Neustart oder Upgrade eines Kubernetes-Masterknotens werden Endpoints ohne zugehörige Services entfernt. Der Headless Service verhindert dies.

Fehlerbehebungen

  • Lesezeitlimit für die blockierende Leader-Watch-Abfrage anpassen (Alexander Kukushkin)

    Laut Consul-Dokumentation wird das tatsächliche Antwortzeitlimit um eine kleine zufällige Wartezeit erhöht, die zur angegebenen maximalen Wartezeit addiert wird. Dadurch werden die Aufwachzeitpunkte gleichzeitiger Anfragen verteilt. Dadurch verlängert sich die maximale Dauer um bis zu wait / 16. Hier wird wait / 15 oder 1 Sekunde addiert, je nachdem, welcher Wert größer ist.

  • Bei Verbindungen zu Postgres über das Replikationsprotokoll immer replication=1 verwenden (Alexander Kukushkin)

    Ab Postgres 10 akzeptiert eine Zeile mit database=replication in pg_hba.conf keine Verbindungen mit dem Parameter replication=database.

  • Für einen Standby-Cluster mit ausschließlicher WAL-Nutzung kein primary_conninfo in recovery.conf schreiben (Alexander Kukushkin)

    Obwohl in der Konfiguration standby_cluster weder host noch port definiert war, schrieb Patroni primary_conninfo in recovery.conf. Dies ist nutzlos und verursachte zahlreiche Fehler.


Version 1.5.4

Veröffentlicht am 2019-01-15

Diese Version führt eine flexible Protokollierung ein und behebt mehrere Fehler.

Neue Funktionen

  • Verbesserungen an der Protokollierungsinfrastruktur (Alexander Kukushkin, Lucas Capistrant, Alexander Anikin)

    Die Protokollierung lässt sich nun sowohl über Umgebungsvariablen als auch über die Patroni-Konfigurationsdatei konfigurieren. Damit kann die Konfiguration im laufenden Betrieb geändert werden: durch Aktualisieren der Datei und anschließendes Neuladen oder Senden von SIGHUP an den Patroni-Prozess. Standardmäßig schreibt Patroni Protokolle nach stderr. Nun können sie auch direkt in eine Datei geschrieben und beim Erreichen einer bestimmten Größe rotiert werden. Außerdem werden ein eigenes Datumsformat und die gezielte Einstellung der Protokollstufe für jedes Python-Modul unterstützt.

  • Berücksichtigung der aktuellen Timeline bei der Leader-Wahl ermöglichen (Alexander Kukushkin)

    Ein Knoten konnte sich als den am besten geeigneten einstufen, obwohl er sich nicht auf der zuletzt bekannten Timeline befand. Um seine Hochstufung in solchen Fällen zu verhindern, kann check_timeline auf true gesetzt werden. Das Standardverhalten bleibt unverändert.

  • Anforderungen an Superuser-Zugangsdaten lockern

    Libpq kann Verbindungen ohne ausdrückliche Angabe von Benutzername oder Passwort öffnen. Je nach Situation verwendet es die Datei pgpass oder die Authentifizierungsmethode trust in pg_hba.conf. Da pg_rewind ebenfalls libpq verwendet, gilt dort dasselbe Verhalten.

  • Consul-Service-Registrierung und Prüfintervall über Umgebungsvariablen konfigurierbar machen (Alexander Kukushkin)

    Die Service-Registrierung in Consul wurde in 1.5.0 eingeführt, ließ sich bisher aber nur über patroni.yaml aktivieren.

Stabilitätsverbesserungen

  • Bei benutzerdefiniertem Bootstrap archive_mode auf off setzen (Alexander Kukushkin)

    WAL- und History-Dateien sollen erst archiviert werden, wenn der Cluster vollständig funktionsfähig ist. Dies ist besonders hilfreich, wenn der benutzerdefinierte Bootstrap pg_upgrade verwendet.

  • Beim Laden der globalen Konfiguration während des Starts fünf Sekunden zwischen Versuchen warten (Alexander Kukushkin)

    So wird der DCS beim Start von Patroni nicht durch ständige Anfragen belastet.

  • Anzahl der Fehlermeldungen beim Herunterfahren verringern (Alexander Kukushkin)

    Sie waren harmlos, aber lästig und teilweise beunruhigend.

  • Lese- und Schreibrechte für recovery.conf bereits beim Erstellen ausdrücklich absichern (Lucas Capistrant)

    Nur der Benutzer patroni/postgres soll diese Datei lesen können, da sie den Replikationsbenutzernamen und das Passwort enthält.

  • Ausnahmen von HTTPServer an die Protokollierung weiterleiten (Julien Riou)

    Standardmäßig wurden diese Ausnahmen auf der Standardausgabe protokolliert und störten dadurch die regulären Protokolle.

Fehlerbehebungen

  • Umleitung von stderr nach stdout beim pg_ctl-Prozess entfernen (Cody Coons)

    Durch das Erben von stderr vom Patroni-Hauptprozess werden alle Postgres-Protokolle zusammen mit allen Patroni-Protokollen sichtbar. Dies ist in Containern sehr nützlich, da beide mit Standardwerkzeugen wie docker logs oder kubectl erfasst werden können. Außerdem behebt die Änderung einen Fehler, bei dem Patroni die Postmaster-PID nicht ermitteln konnte, wenn Postgres Warnungen nach stderr schrieb.

  • Zeitlimit zum Deregistrieren der Consul-Service-Prüfung im Go-Zeitformat angeben (Pavel Kirillov)

    Ohne ausdrückliche Zeiteinheit schlug die Registrierung fehl.

  • Prüfungen der Konfiguration von standby_cluster lockern (Dmitry Dolgov, Alexander Kukushkin)

    Bisher wurden nur Zeichenketten als gültige Werte akzeptiert. Daher konnte port nicht als Ganzzahl und create_replica_methods nicht als Liste angegeben werden.


Version 1.5.3

Veröffentlicht am 2018-12-03

Version mit Kompatibilitätsverbesserungen und Fehlerbehebungen.

  • Stabilität bei der Verwendung von Python 3 mit Zookeeper verbessern (Alexander Kukushkin)

    Eine Änderung von loop_wait führte dazu, dass Patroni die Verbindung zu Zookeeper trennte und nicht erneut herstellte.

  • Kompatibilität mit Postgres 9.3 wiederherstellen (Alexander Kukushkin)

    Beim Öffnen einer Replikationsverbindung sollte replication=1 angegeben werden, da 9.3 replication=‘database’ nicht versteht.

  • Consul-Session mindestens einmal pro HA-Schleifendurchlauf erneuern und Behandlung von Session-Ausnahmen verbessern (Alexander Kukushkin)

    Ein Neustart des lokalen Consul-Agenten macht alle dem Knoten zugeordneten Sessions ungültig. Eine verspätete Erneuerung und unzureichende Behandlung von Session-Fehlern führten zur Herabstufung des Primärservers.


Version 1.5.2

Veröffentlicht am 2018-11-26

Version mit Kompatibilitätsverbesserungen und Fehlerbehebungen.

  • Kompatibilität mit kazoo-2.6.0 (Alexander Kukushkin)

    Um angemessene Zeitlimits für Anfragen sicherzustellen, definiert Patroni die Methode create_connection des Moduls python-kazoo neu. Die neueste Kazoo-Version änderte den Aufruf von create_connection geringfügig.

  • Absturz von Patroni beim Verlust des Leaders im Consul-Cluster beheben (Alexander Kukushkin)

    Ursache war eine fehlerhafte Implementierung der Methode touch_member: Sie sollte einen booleschen Wert zurückgeben und keine Ausnahmen auslösen.


Version 1.5.1

Veröffentlicht am 2018-11-01

Diese Version unterstützt permanente Replikationsslots sowie pgBackRest und behebt mehrere Fehler.

Neue Funktionen

  • Permanente Replikationsslots (Alexander Kukushkin)

    Permanente Replikationsslots bleiben bei Failover und Switchover erhalten. Patroni erstellt die konfigurierten Slots auf dem neuen Primärserver unmittelbar nach der Hochstufung. Die Slots lassen sich mit patronictl edit-config konfigurieren. Die anfängliche Konfiguration kann auch unter bootstrap.dcs erfolgen.

  • pgBackRest-Unterstützung hinzufügen (Yogesh Sharma)

    pgBackRest kann in ein bestehendes Verzeichnis $PGDATA wiederherstellen. Dabei werden seit dem letzten Backup unveränderte Dateien übersprungen, was die Wiederherstellung beschleunigt. Zur Unterstützung dieser Funktion wurde der Parameter keep_data eingeführt. Weitere Beispiele enthält der Abschnitt Methode zur Replikaterstellung .

Fehlerbehebungen


Version 1.5.0

Veröffentlicht am 2018-09-20

Diese Version ermöglicht den Betrieb eines Patroni-HA-Clusters im Standby-Modus, führt experimentelle Windows-Unterstützung ein und bietet einen neuen Konfigurationsparameter zur Registrierung des PostgreSQL-Dienstes in Consul.

Neue Funktionen

  • Standby-Cluster (Dmitry Dolgov)

    Ein oder mehrere Patroni-Knoten können einen Standby-Cluster bilden, der neben dem Primärcluster läuft, etwa in einem anderen Rechenzentrum. Er besteht aus Standbys, die vom Primärserver des Primärclusters replizieren. Alle PostgreSQL-Knoten im Standby-Cluster sind Replikate. Eines davon wählt sich selbst für die direkte Replikation vom entfernten Primärserver aus; die anderen replizieren kaskadierend von diesem Replikat. Eine ausführlichere Beschreibung und Konfigurationsbeispiele finden sich hier .

  • Dienste in Consul registrieren (Pavel Kirillov, Alexander Kukushkin)

    Ist register_service in der Consul-Konfiguration aktiviert, registriert der Knoten einen Dienst mit dem Namen scope und dem Tag master, replica oder standby-leader.

  • Experimentelle Windows-Unterstützung (Pavel Golub)

    Patroni kann nun unter Windows ausgeführt werden. Diese Unterstützung ist jedoch neu und wurde noch nicht so ausgiebig in der Praxis getestet wie die Linux-Variante. Rückmeldungen sind willkommen!

Verbesserungen in patronictl

  • Flag patronictl -k/–insecure und Unterstützung für restapi-Zertifikate hinzufügen (Wilfried Roset)

    War die REST API durch selbstsignierte Zertifikate geschützt, schlug deren Prüfung durch patronictl bisher fehl. Es gab keine Möglichkeit, die Prüfung zu deaktivieren. Nun kann patronictl so konfiguriert werden, dass es die Zertifikatsprüfung vollständig überspringt. Alternativ können CA- und Client-Zertifikate im Konfigurationsabschnitt ctl: angegeben werden.

  • Mitglieder mit nofailover-Tag aus der Ausgabe von patronictl switchover/failover ausschließen (Alexander Anikin)

    Zuvor wurden diese Mitglieder bei interaktivem Switchover oder Failover über patronictl fälschlicherweise als Kandidaten vorgeschlagen.

Stabilitätsverbesserungen

  • Ausgabezeilen von pg_controldata ohne Schlüssel-Wert-Paar nicht auswerten (Alexander Anikin)

    Unter bestimmten Umständen gibt pg_controldata Zeilen ohne Doppelpunkt aus. Dadurch entstand beim Auswerten der pg_controldata-Ausgabe ein Fehler im Patroni-Code, der das eigentliche Problem verdeckte. Solche Zeilen stammen häufig aus einer Warnung, die pg_controldata vor der regulären Ausgabe anzeigt, etwa wenn die Hauptversion der ausführbaren Datei nicht mit der des PostgreSQL-Datenverzeichnisses übereinstimmt.

  • Mitgliedsnamen in Fehlermeldungen während der Leader-Wahl aufnehmen (Jan Mussler)

    Während der Leader-Wahl verbindet sich Patroni mit allen bekannten Cluster-Mitgliedern und fragt ihren Status ab. Dieser wird einschließlich des Mitgliedsnamens im Patroni-Protokoll festgehalten. War ein Mitglied nicht erreichbar, enthielt die Fehlermeldung bisher nur die URL, jedoch nicht seinen Namen.

  • WAL-Position unmittelbar beim Erstellen des Replikationsslots reservieren (Alexander Kukushkin)

    Seit 9.6 bietet die Funktion pg_create_physical_replication_slot den zusätzlichen booleschen Parameter immediately_reserve. Bei false, dem Standardwert, reserviert der Slot die WAL-Position erst mit der ersten Client-Verbindung. Zwischen seiner Erstellung und der ersten Verbindung können deshalb vom Client benötigte Segmente verloren gehen.

  • Fehler bei strikt synchroner Replikation beheben (Alexander Kukushkin)

    Bei synchronous_mode_strict: true trägt Patroni in manchen Fällen * in synchronous_standby_names ein. Dadurch wechselt der Synchronisationszustand der meisten Replikationsverbindungen zu potential. Bisher konnte Patroni dann keinen synchronen Kandidaten auswählen, da es nur Verbindungen im Zustand async berücksichtigte.


Version 1.4.6

Veröffentlicht am 2018-08-14

Fehlerbehebungen und Stabilitätsverbesserungen

Diese Version behebt einen kritischen Fehler, bei dem der Patroni-API-Endpunkt /master für einen Knoten, der kein Primärserver war, 200 zurückgab. Es handelte sich um einen Meldefehler und nicht um einen tatsächlichen Split Brain. Unter bestimmten Umständen konnten Clients jedoch an einen schreibgeschützten Knoten weitergeleitet werden.

  • Status is_leader beim Herabstufen zurücksetzen (Alexander Kukushkin, Oleksii Kliukin)

    Sicherstellen, dass ein herabgestuftes Cluster-Mitglied bei einem Aufruf der API /master nicht mehr mit Code 200 antwortet.

  • Neues Feld „cluster_unlocked“ zur API-Ausgabe hinzufügen (Dmitry Dolgov)

    Das Feld zeigt an, ob im Cluster ein Primärserver läuft. Es kann verwendet werden, wenn sich außer einem einzelnen Replikat kein anderer Knoten abfragen lässt.


Version 1.4.5

Veröffentlicht am 2018-08-03

Neue Funktionen

  • Protokollierung beim Anwenden einer neuen Postgres-Konfiguration verbessern (Don Seiler)

    Patroni protokolliert die Namen und Werte geänderter Parameter.

  • Kompatibilität mit Python 3.7 (Christoph Berg)

    async ist in python3.7 ein reserviertes Schlüsselwort.

  • Beim Herunterfahren eines Mitglieds dessen Zustand im DCS auf “stopped” setzen (Tony Sorrentino)

    Dadurch zeigt der Befehl “patronictl list” den Zustand des Mitglieds als “stopped” an.

  • Protokollmeldung verbessern, wenn eine veraltete postmaster.pid zu einem laufenden Prozess passt (Ants Aasma)

    Die bisherige Meldung war äußerst verwirrend.

  • Funktion patronictl reload implementieren (Don Seiler)

    Zuvor ließ sich die Konfiguration nur durch einen REST-API-Aufruf oder durch Senden von SIGHUP an den Patroni-Prozess neu laden.

  • Beim Start als Replikat einige Parameter aus controldata übernehmen und anwenden (Alexander Kukushkin)

    Der Wert von max_connections und einigen weiteren Parametern in der globalen Konfiguration kann niedriger sein als der tatsächlich vom Primärserver verwendete Wert. Dann kann das Replikat nicht starten und sollte manuell korrigiert werden. Patroni übernimmt dies nun: Es liest den Wert aus pg_controldata, wendet ihn an, startet Postgres und setzt das Flag pending_restart.

  • Beim Start von Postgres LD_LIBRARY_PATH verwenden, sofern gesetzt (Chris Fraser)

    Beim Start von Postgres reichte Patroni die Umgebungsvariablen PATH, LC_ALL und LANG weiter, sofern sie gesetzt waren. Nun geschieht dies auch mit LD_LIBRARY_PATH. Dies sollte helfen, wenn PostgreSQL an einem nicht standardmäßigen Ort installiert wurde.

  • create_replica_method in create_replica_methods umbenennen (Dmitry Dolgov)

    Der neue Name verdeutlicht, dass es sich um ein Array handelt. Der alte Name bleibt aus Gründen der Abwärtskompatibilität unterstützt.

Fehlerbehebungen und Stabilitätsverbesserungen

  • Bedingung für den Start eines Replikats nach pg_rewind im Pausenmodus korrigieren (Oleksii Kliukin)

    Ein Replikat, das pg_rewind bereits ausgeführt hat, wird nicht erneut gestartet.

  • Beim Health Check des Primärservers nur dann 200 zurückgeben, wenn update_lock erfolgreich war (Alexander Kukushkin)

    So wird verhindert, dass sich der bisherige, herabgestufte Primärserver bei einer Netzwerkpartition des DCS weiterhin als Primärserver meldet.

  • Kompatibilität mit dem neuen Consul-Modul korrigieren (Alexander Kukushkin)

    Seit v1.1.0 verwendet python-consul eine geänderte interne API und übergibt Abfrageparameter als list statt als dict.

  • Ausnahmen aus dem REST-API-Thread von Patroni beim Herunterfahren abfangen (Alexander Kukushkin)

    Aufgrund dieser nicht abgefangenen Ausnahmen lief PostgreSQL beim Herunterfahren weiter.

  • Crash-Recovery nur ausführen, wenn Postgres als Primärserver läuft (Alexander Kukushkin)

    pg_controldata muss ‘in production’, ‘shutting down’ oder ‘in crash recovery’ melden. In allen anderen Fällen ist keine Crash-Recovery erforderlich.

  • Behandlung von Konfigurationsfehlern verbessern (Henning Jacobs, Alexander Kukushkin)

    Viele Parameter, einschließlich restapi.listen, lassen sich im laufenden Betrieb ändern, indem die Patroni-Konfigurationsdatei aktualisiert und SIGHUP an den Patroni-Prozess gesendet wird. Diese Korrektur beseitigt schwer verständliche Ausnahmen aus dem Thread ‘restapi’, wenn Parameter ungültige Werte erhalten.


Version 1.4.4

Veröffentlicht am 2018-05-22

Verbesserungen der Stabilität

  • Race Condition in poll_failover_result beheben (Alexander Kukushkin)

    Sie wirkte sich weder auf Failover noch auf Switchover direkt aus. In seltenen Fällen wurde der Erfolg jedoch zu früh gemeldet, sobald der frühere Leader den Lock freigab. Dadurch entstand die Meldung ‘Failed over to “None”’ statt ‘Failed over to “desired-node”’.

  • Groß- und Kleinschreibung bei Postgres-Parameternamen ignorieren (Alexander Kukushkin)

    Die meisten Postgres-Parameter haben Namen in snake_case. Es gibt jedoch drei Ausnahmen: DateStyle, IntervalStyle und TimeZone. Postgres akzeptiert diese Parameter auch mit anderer Groß- und Kleinschreibung (etwa timezone = ‘some/tzn’). Patroni konnte solche abweichend geschriebenen Parameternamen dagegen nicht in pg_settings finden und ignorierte sie deshalb.

  • Start beim Anhängen an laufendes postgres abbrechen, wenn der Cluster nicht initialisiert ist (Alexander Kukushkin)

    Patroni kann sich an eine bereits laufende Postgres-Instanz anhängen. Dabei muss Patroni unbedingt zuerst auf dem Primärserver gestartet werden, bevor die Replikate an der Reihe sind.

  • Verhalten von patronictl scaffold korrigieren (Alexander Kukushkin)

    An touch_member wird ein dict-Objekt statt einer JSON-kodierten Zeichenkette übergeben; die DCS-Implementierung übernimmt die Kodierung.

  • Primärserver bei fehlgeschlagener Aktualisierung des Leader-Schlüssels während einer Pause nicht herabstufen (Alexander Kukushkin)

    Während Wartungsarbeiten kann ein DCS Schreibanfragen ablehnen, während er Leseanfragen weiterhin beantwortet. In diesem Fall versetzte Patroni den Postgres-Primärserver zuvor in einen schreibgeschützten Modus, nachdem die Aktualisierung des Leader-Locks im DCS fehlgeschlagen war.

  • Replikations-Slots synchronisieren, wenn Patroni einen neuen postmaster-Prozess erkennt (Alexander Kukushkin)

    Nach einem Postgres-Neustart muss Patroni sicherstellen, dass die Liste der Replikations-Slots seinen Erwartungen entspricht.

  • Nach Beendigung einer Pause sysid prüfen und Replikations-Slots synchronisieren (Alexander Kukushkin)

    Im Modus maintenance kann das Datenverzeichnis vollständig neu geschrieben worden sein. Daher muss geprüft werden, ob Database system identifier weiterhin zum Cluster gehört und die Replikations-Slots dem von Patroni erwarteten Zustand entsprechen.

  • Mögliches Startproblem bei gestopptem Postgres mit vorhandener postmaster-Lock-Datei im Datenverzeichnis beheben (Alexander Kukushkin)

    Die Wiederverwendung der PID aus der postmaster-Lock-Datei wird erkannt. Dieses Problem tritt eher auf, wenn Patroni und Postgres in einem Docker-Container laufen.

  • Schutz vor versehentlichem Löschen der DCS-Inhalte verbessern (Alexander Kukushkin)

    Patroni enthält umfangreiche Logik, um in diesem Fall ein Failover zu verhindern, und kann außerdem alle Schlüssel wiederherstellen. Bis zu dieser Änderung schaltete das versehentliche Löschen des Schlüssels /config jedoch den Pause-Modus für 1 Durchlauf der HA-Schleife aus.

  • Bei ungültiger System-ID nicht beenden (Oleksii Kliukin)

    Patroni wird nicht beendet, wenn die System-ID des Clusters leer ist oder die Validierung nicht besteht. In diesem Fall muss der Cluster höchstwahrscheinlich neu initialisiert werden; darauf wird in der Ergebnismeldung hingewiesen. Patroni wird nicht beendet, da andernfalls keine Neuinitialisierung möglich wäre.

Kompatibilität mit Kubernetes 1.10+

  • Prüfung auf leere subsets hinzufügen (Cody Coons)

    Seit Kubernetes 1.10.0+ wird Endpoints.subsets als None statt als [] zurückgegeben.

Verbesserungen beim Bootstrap

  • Löschen von recovery.conf optional machen (Brad Nicholson)

    Wenn bootstrap.<custom_bootstrap_method_name>.keep_existing_recovery_conf definiert und auf True gesetzt ist, entfernt Patroni die vorhandene Datei recovery.conf nicht. Dies ist beim Bootstrap aus einem Backup mit Werkzeugen wie pgBackRest nützlich, die eine passende recovery.conf erzeugen.

  • Optionen für die integrierte basebackup-Methode zulassen (Oleksii Kliukin)

    Der integrierten basebackup-Methode können jetzt Optionen übergeben werden, indem der Abschnitt basebackup in der Konfiguration definiert wird, ähnlich wie bei benutzerdefinierten Methoden zur Replikaterstellung. Der Unterschied liegt im akzeptierten Format des Abschnitts basebackup: Da pg_basebackup sowohl Optionen mit --key=value als auch mit --key akzeptiert, kann der Abschnitt entweder ein Dictionary mit Schlüssel-Wert-Paaren oder eine Liste aus Dictionaries mit jeweils einem Eintrag beziehungsweise aus einzelnen Schlüsseln für Optionen ohne Wert enthalten. Weitere Beispiele enthält der Abschnitt Methode zur Replikaterstellung .


Version 1.4.3

Veröffentlicht am 2018-03-05

Verbesserungen der Protokollierung

  • Protokollstufe über Umgebungsvariablen konfigurierbar machen (Andy Newton, Keyvan Hedayati)

    PATRONI_LOGLEVEL legt die allgemeine Protokollstufe fest. PATRONI_REQUESTS_LOGLEVEL legt die Protokollstufe für alle HTTP-Anfragen fest, etwa Aufrufe der Kubernetes-API. Die Namen der möglichen Protokollstufen stehen in Dokumentation zur Python-Protokollierung .

Verbesserungen der Stabilität und Fehlerbehebungen

  • etcd-Clustertopologie nach einer Watch-Zeitüberschreitung nicht erneut ermitteln (Alexander Kukushkin)

    War nur ein Host in der etcd-Konfiguration angegeben und genau dieser nicht erreichbar, begann Patroni mit der Ermittlung der Clustertopologie, ohne jemals erfolgreich zu sein. Stattdessen sollte es lediglich zum nächsten verfügbaren Knoten wechseln.

  • Inhalt von bootstrap.pg_hba nach einem benutzerdefinierten Bootstrap in eine pg_hba.conf schreiben (Alexander Kukushkin)

    Das Verhalten entspricht jetzt dem üblichen Bootstrap mit initdb.

  • Einzelbenutzermodus wartete auf Benutzereingaben und wurde nie beendet (Alexander Kukushkin)

    Die Regression wurde in https://github.com/patroni/patroni/pull/576 eingeführt.


Version 1.4.2

Veröffentlicht am 2018-01-30

Verbesserungen in patronictl

  • Geplantes Failover in geplantes Switchover umbenennen (Alexander Kukushkin)

    Failover und Switchover wurden in Version 1.4 getrennt. patronictl list meldete jedoch weiterhin Scheduled failover statt Scheduled switchover.

  • Informationen zu ausstehenden Neustarts anzeigen (Alexander Kukushkin)

    Manche Konfigurationsänderungen erfordern einen Postgres-Neustart. Patroni gab darauf bereits in der REST API und beim Schreiben des Knotenstatus in den DCS einen Hinweis, dieser ließ sich jedoch nicht einfach anzeigen.

  • show-config mit cluster_name aus der Konfigurationsdatei nutzbar machen (Alexander Kukushkin)

    Dies funktioniert ähnlich wie bei patronictl edit-config.

Verbesserungen der Stabilität

  • Aufruf von pg_controldata während des Bootstraps vermeiden (Alexander Kukushkin)

    Während initdb oder eines benutzerdefinierten Bootstraps gibt es ein Zeitfenster, in dem pgdata nicht leer ist, pg_control aber noch nicht geschrieben wurde. Ein Aufruf von pg_controldata schlug dann mit Fehlermeldungen fehl.

  • Von psutil ausgelöste Ausnahmen behandeln (Alexander Kukushkin)

    cmdline wird bei jedem Aufruf der Methode cmdline() gelesen und ausgewertet. Wenn der untersuchte Prozess inzwischen beendet wurde, wird NoSuchProcess ausgelöst.

Verbesserungen der Kubernetes-Unterstützung

  • Fehler der k8s-API nicht unterdrücken (Alexander Kukushkin)

    Ein Aufruf der Kubernetes-API kann aus verschiedenen Gründen fehlschlagen. In manchen Fällen sollte der Aufruf wiederholt werden, in anderen sollten die Fehlermeldung und der Stacktrace der Ausnahme protokolliert werden. Diese Änderung hilft bei der Diagnose von Kubernetes-Berechtigungsproblemen.

  • Kubernetes-Beispiel-Dockerfile auf Installation von Patroni aus dem master-Branch umstellen (Maciej Szulik)

    Zuvor wurde der inzwischen veraltete Branch feature/k8s verwendet.

  • Passende RBAC-Konfiguration für Patroni auf k8s hinzufügen (Maciej Szulik)

    Ein Service Account für die Pods des Clusters, eine Rolle mit ausschließlich den notwendigen Berechtigungen und ein RoleBinding zur Verknüpfung von Service Account und Rolle wurden hinzugefügt.


Version 1.4.1

Veröffentlicht am 2018-01-17

Korrekturen in patronictl

  • Aktuellen Leader nicht in der vorgeschlagenen Liste der Failover-Ziele anzeigen. (Alexander Kukushkin)

    patronictl failover kann auch dann funktionieren, wenn der Cluster einen Leader hat. Dieser sollte aus der Liste der möglichen Failover-Ziele ausgeschlossen werden.

  • patronictl switchover mit der alten Patroni-API kompatibel machen (Alexander Kukushkin)

    Schlägt der REST-API-Aufruf POST /switchover mit Statuscode 501 fehl, wird er erneut ausgeführt, diesmal jedoch am Endpunkt /failover.


Version 1.4

Veröffentlicht am 2018-01-10

Diese Version unterstützt Kubernetes als DCS. Damit kann Patroni als Cloud-nativer Agent in Kubernetes ohne zusätzliche Bereitstellung von etcd, Zookeeper oder Consul laufen.

Upgrade-Hinweis

Bei der Installation von Patroni über pip werden Abhängigkeiten wie Bibliotheken für etcd, Zookeeper, Consul oder Kubernetes sowie Unterstützung für AWS nicht mehr automatisch installiert. Um sie zu aktivieren, müssen sie im Befehl pip install ausdrücklich aufgeführt werden, beispielsweise mit pip install 'patroni[etcd,kubernetes]'.

Kubernetes-Unterstützung

Ein Kubernetes-basierter DCS wurde implementiert. Die Metadaten der Endpoints speichern die Konfiguration und den Leader-Schlüssel. Das Metadatenfeld in den Pod-Definitionen speichert die mitgliederbezogenen Daten. Neben Endpoints unterstützt Patroni auch ConfigMaps. Weitere Informationen zu dieser Funktion finden sich im Kubernetes-Kapitel der Dokumentation .

Verbesserungen der Stabilität

  • postmaster-Prozess in ein eigenes Objekt auslagern (Ants Aasma)

    Dieses Objekt identifiziert einen laufenden postmaster-Prozess anhand von PID und Startzeit. Es vereinfacht das Erkennen und Beheben von Situationen, in denen der postmaster ohne Wissen von Patroni neu gestartet wurde oder das Postgres-Verzeichnis aus dem Dateisystem verschwunden ist.

  • Anzahl der von Patroni pro HA-Schleifendurchlauf ausgeführten SELECTs minimieren (Alexander Kukushkin)

    Bei jedem HA-Schleifendurchlauf benötigt Patroni den Recovery-Status und die absolute WAL-Position. Dazu führt Patroni jetzt nur ein SELECT aus, statt zwei auf dem Replikat und drei auf dem Primärserver.

  • Leader-Schlüssel beim Herunterfahren nur entfernen, wenn der Lock gehalten wird (Ants Aasma)

    Das bedingungslose Entfernen erzeugte unnötige und irreführende Ausnahmen.

Verbesserungen in patronictl

  • Befehl version zu patronictl hinzufügen (Ants Aasma)

    Er zeigt die installierte Patroni-Version an. Wird der Clustername angegeben, zeigt er außerdem die Versionen laufender Patroni-Instanzen.

  • Angabe des Arguments cluster_name für einige patronictl-Befehle optional machen (Alexander Kukushkin, Ants Aasma)

    Dies funktioniert, wenn patronictl eine gewöhnliche Patroni-Konfigurationsdatei mit definiertem scope verwendet.

  • Informationen zu geplantem Switchover und Wartungsmodus anzeigen (Alexander Kukushkin)

    Zuvor waren diese Informationen nur über Patroni-Protokolle oder direkt aus dem DCS verfügbar.

  • patronictl reinit verbessern (Alexander Kukushkin)

    patronictl reinit weigerte sich manchmal fortzufahren, wenn Patroni mit anderen Aktionen beschäftigt war, insbesondere mit dem Versuch, postgres zu starten. patronictl bot keine Befehle zum Abbrechen solcher lang laufenden Aktionen. Die einzige, gefährliche Umgehung bestand im manuellen Löschen eines Datenverzeichnisses. Die neue Implementierung von reinit bricht andere lang laufende Aktionen zwangsweise ab, bevor sie mit der Neuinitialisierung fortfährt.

  • Option --wait in patronictl pause und patronictl resume implementieren (Alexander Kukushkin)

    Damit wartet patronictl , bis alle Knoten im Cluster die angeforderte Aktion bestätigt haben. Dazu wird der Schalter pause für jeden Knoten im DCS und über die REST API bereitgestellt.

  • patronictl failover in patronictl switchover umbenennen (Alexander Kukushkin)

    Das bisherige failover konnte tatsächlich nur ein Switchover durchführen und verweigerte die Ausführung in einem Cluster ohne Leader.

  • Verhalten von patronictl failover ändern (Alexander Kukushkin)

    Der Befehl funktioniert auch ohne Leader. In diesem Fall muss jedoch ausdrücklich angegeben werden, welcher Knoten neuer Leader werden soll.

Informationen zu Timeline und Historie bereitstellen

  • Aktuelle Timeline im DCS und über die API bereitstellen (Alexander Kukushkin)

    Für jedes Clustermitglied werden Informationen zur aktuellen Timeline gespeichert. Diese Informationen sind über die API zugänglich und werden im DCS gespeichert.

  • Historie der Hochstufungen im DCS-Schlüssel /history speichern (Alexander Kukushkin)

    Zusätzlich wird die um den Zeitpunkt der jeweiligen Hochstufung ergänzte Timeline-Historie im DCS-Schlüssel /history gespeichert und bei jeder Hochstufung aktualisiert.

Endpunkte zur Abfrage synchroner und asynchroner Replikate hinzufügen

  • Neue Endpunkte /sync und /async hinzufügen (Alexander Kukushkin, Oleksii Kliukin)

Diese Endpunkte, auch als /synchronous und /asynchronous verfügbar, geben 200 ausschließlich für synchrone beziehungsweise asynchrone Replikate zurück. Mit noloadbalance markierte Replikate sind ausgeschlossen.

Mehrere Hosts für etcd zulassen

  • Neuen Parameter hosts zur etcd-Konfiguration hinzufügen (Alexander Kukushkin)

    Dieser Parameter sollte die anfängliche Hostliste enthalten, anhand derer die laufenden Mitglieder des etcd-Clusters ermittelt und in eine Liste aufgenommen werden. Wird diese Liste ermittelter Hosts während des Betriebs aus irgendeinem Grund ausgeschöpft, sodass kein Host daraus mehr verfügbar ist, greift Patroni wieder auf die anfängliche Liste im Parameter hosts zurück.


Version 1.3.6

Veröffentlicht am 2017-11-10

Verbesserungen der Stabilität

  • Beim Prüfen, ob postgres läuft, die Startzeit des Prozesses verifizieren. (Ants Aasma)

    Nach einem Absturz, der postmaster.pid nicht entfernt, kann ein neuer Prozess dieselbe PID erhalten. Dadurch liefert is_running() fälschlich ein positives Ergebnis, was zu verschiedenen Fehlverhalten führt.

  • PostgreSQL vor dem Bootstrap herunterfahren, wenn das Datenverzeichnis verloren gegangen ist (ainlolcat)

    Wird das Datenverzeichnis auf dem Primärserver zwangsweise entfernt, kann der Postgres-Prozess noch eine Zeit lang weiterlaufen. Dadurch kann er das anstelle des früheren Primärservers erstellte Replikat am Starten oder Replizieren hindern. Mit dieser Korrektur speichert Patroni die PID und Startzeit des postmaster zwischen und kann den alten postmaster beenden, wenn dieser nach dem Entfernen seines Datenverzeichnisses noch läuft.

  • Nach dem Ausfall des Postgres-Primärservers Crash-Recovery im Einzelbenutzermodus durchführen (Alexander Kukushkin)

    Wurde postgres nicht sauber heruntergefahren, ist ein sofortiger Start als Standby unsicher und pg_rewind kann nicht ausgeführt werden. Die Crash-Recovery im Einzelbenutzermodus wird nur durchgeführt, wenn pg_rewind aktiviert ist oder derzeit kein Primärserver vorhanden ist.

Verbesserungen für Consul

  • Angabe einer Rechenzentrumskonfiguration für Consul ermöglichen (Vilius Okockis, Alexander Kukushkin)

    Zuvor kommunizierte Patroni immer mit dem Rechenzentrum des Hosts, auf dem es lief.

  • Token immer im HTTP-Header X-Consul-Token senden (Alexander Kukushkin)

    Wenn consul.token in der Patroni-Konfiguration definiert ist, wird es immer im HTTP-Header ‘X-Consul-Token’ gesendet. Das Modul python-consul versucht, mit der Consul-REST-API übereinzustimmen. Diese akzeptiert bei der Session-API kein Token als Abfrageparameter, der Header ‘X-Consul-Token’ funktioniert jedoch weiterhin.

  • Session-TTL anpassen, wenn der angegebene Wert unter dem kleinstmöglichen liegt (Stas Fomin, Alexander Kukushkin)

    Die in der Patroni-Konfiguration angegebene TTL kann unter dem von Consul unterstützten Mindestwert liegen. Dann kann der Consul-Agent keine neue Session erstellen. Ohne Session kann Patroni keine Member- und Leader-Schlüssel im Consul-KV-Speicher erstellen, wodurch der Cluster nicht ordnungsgemäß funktioniert.

Weitere Verbesserungen

  • Benutzerdefiniertes Protokollformat über die Umgebungsvariable PATRONI_LOGFORMAT definieren (Stas Fomin)

    Zeitstempel und ähnliche Felder in Patroni-Protokollen können deaktiviert werden, wenn sie bereits durch die Systemprotokollierung hinzugefügt werden, üblicherweise bei der Ausführung von Patroni als Dienst.


Version 1.3.5

Veröffentlicht am 2017-10-12

Fehlerbehebung

  • Rolle auf ‘uninitialized’ setzen, wenn das Datenverzeichnis entfernt wurde (Alexander Kukushkin)

    Lief der Knoten als Primärserver, verhinderte dies ein Failover.

Verbesserung der Stabilität

  • Nach einem erfolglosen Versuch, postgres zu starten, versuchen, postmaster im Einzelbenutzermodus auszuführen (Alexander Kukushkin)

    Dieses Problem tritt üblicherweise auf, wenn ein als Primärserver laufender Knoten beendet wurde und die Timelines auseinanderliefen. Ist in recovery.conf ein restore_command definiert, bricht postgres den Start mit hoher Wahrscheinlichkeit ab und lässt controldata unverändert. Dadurch kann pg_rewind, das ein sauberes Herunterfahren voraussetzt, nicht verwendet werden.

Verbesserungen für Consul

  • Angabe von Health Checks beim Erstellen einer Session ermöglichen (Alexander Kukushkin)

    Ohne Angabe verwendet Consul „serfHealth“. Einerseits ermöglicht dies das schnelle Erkennen eines isolierten Primärservers; andererseits kann Patroni dadurch kurze Netzwerkverzögerungen nicht tolerieren.

Fehlerbehebung

  • Watchdog unter Python 3 korrigieren (Ants Aasma)

    Die Schnittstelle des Aufrufs ioctl() wurde falsch verstanden. Bei mutable=False gibt fcntl.ioctl() tatsächlich den arg-Puffer zurück. Unter Python2 funktionierte dies zufällig, weil ein Vergleich von int und str keinen Fehler auslöste. Fehler werden tatsächlich durch Auslösen von IOError unter Python2 und OSError unter Python3 gemeldet.


Version 1.3.4

Veröffentlicht am 2017-09-08

Verschiedene Verbesserungen für Consul

  • Consul-Token als Header übergeben (Andrew Colin Kissa)

    Header sind jetzt der bevorzugte Weg, um das Token an die Consul-API zu übergeben.

  • Erweiterte Konfiguration für Consul (Alexander Kukushkin)

    scheme, token sowie Client- und CA-Zertifikate können angegeben werden; siehe Details .

  • Kompatibilität mit python-consul-0.7.1 und neuer (Alexander Kukushkin)

    Das neue Modul python-consul hat die Signatur einiger Methoden geändert.

  • Die Meldung “Could not take out TTL lock” wurde nie protokolliert (Alexander Kukushkin)

    Dies ist kein kritischer Fehler, aber fehlende geeignete Protokollierung erschwert die Untersuchung von Problemen.

synchronous_standby_names mit quote_ident in Anführungszeichen setzen

  • Beim Schreiben von synchronous_standby_names in postgresql.conf muss der Wert in Anführungszeichen gesetzt werden (Alexander Kukushkin)

    Geschieht dies nicht korrekt, deaktiviert PostgreSQL effektiv die synchrone Replikation und arbeitet weiter.

Verschiedene Fehlerbehebungen im Pause-Zustand, überwiegend im Zusammenhang mit dem Watchdog (Alexander Kukushkin)

  • Keine Keepalives senden, wenn der Watchdog nicht aktiv ist
  • Aktivierung des Watchdogs im Pause-Modus vermeiden
  • Korrekten Postgres-Zustand im Pause-Modus setzen
  • Keine Abfragen über die API ausführen, wenn postgres gestoppt ist

Version 1.3.3

Veröffentlicht am 2017-08-04

Fehlerbehebungen

  • Die synchrone Replikation wurde kurz nach der Hochstufung deaktiviert, auch wenn synchronous_mode_strict eingeschaltet war (Alexander Kukushkin)
  • Leere Datei pg_ident.conf erstellen, wenn sie nach der Wiederherstellung aus dem Backup fehlt (Alexander Kukushkin)
  • Zugriff in pg_hba.conf auf alle Datenbanken öffnen, nicht nur auf postgres (Franco Bellagamba)

Version 1.3.2

Veröffentlicht am 2017-07-31

Fehlerbehebung

  • patronictl edit-config funktionierte mit ZooKeeper nicht (Alexander Kukushkin)

Version 1.3.1

Veröffentlicht am 2017-07-28

Fehlerbehebung

  • Failover über die API war aufgrund einer Änderung in _MemberStatus defekt (Alexander Kukushkin)

Version 1.3

Veröffentlicht am 2017-07-27

Version 1.3 ermöglicht benutzerdefinierten Bootstrap, verbessert die Unterstützung für pg_rewind erheblich, erweitert den synchronen Modus, ergänzt patronictl um die Bearbeitung der Konfiguration und implementiert Watchdog-Unterstützung unter Linux. Außerdem ist dies die erste Version, die mit PostgreSQL 10 korrekt funktioniert.

Upgrade-Hinweis

Es sind keine Kompatibilitätsprobleme mit der neuen Patroni-Version bekannt. Die Konfiguration aus Version 1.2 sollte unverändert funktionieren. Für das Upgrade können neue Pakete installiert und Patroni anschließend neu gestartet werden, was einen PostgreSQL-Neustart verursacht. Alternativ kann Patroni zunächst in den Pause-Modus versetzt, dann auf allen Knoten des Clusters neu gestartet und der Pause-Modus zum Schluss beendet werden. Patroni versucht im Pause-Modus nicht, PostgreSQL zu stoppen oder zu starten.

Benutzerdefinierter Bootstrap

  • Ablauf des Cluster-Bootstraps konfigurierbar machen (Alexander Kukushkin)

    Bei der Initialisierung des allerersten Knotens im Cluster können benutzerdefinierte Bootstrap-Skripte statt initdb verwendet werden. Der Bootstrap-Befehl erhält den Clusternamen und den Pfad zum Datenverzeichnis. Der resultierende Cluster kann für Recovery konfiguriert werden, sodass ein Bootstrap aus einem Backup mit Point-in-Time-Recovery möglich ist. Eine ausführlichere Beschreibung dieser Funktion enthält die Dokumentationsseite .

Intelligentere pg_rewind-Unterstützung

  • Anhand der Timeline-Unterschiede zum aktuellen Primärserver entscheiden, ob pg_rewind ausgeführt werden muss (Alexander Kukushkin)

    Zuvor hatte Patroni feste Bedingungen zum Auslösen von pg_rewind: beim Start eines früheren Primärservers, bei einem Switchover zum festgelegten Knoten für jeden anderen Knoten im Cluster oder wenn ein Replikat mit dem Tag nofailover vorhanden war. Allen diesen Fällen ist gemeinsam, dass ein Replikat dem neuen Primärserver voraus sein kann. In manchen Fällen tat pg_rewind nichts, in anderen wurde es trotz Notwendigkeit nicht ausgeführt. Statt sich auf diese begrenzte Regelliste zu verlassen, vergleicht Patroni jetzt die WAL-Positionen von Primärserver und Replikat über das Streaming-Replikationsprotokoll, um zuverlässig zu entscheiden, ob das Replikat einen Rewind benötigt.

Strikter synchroner Replikationsmodus

  • Unterstützung für synchrone Replikation um einen strikten Modus erweitern (James Sewell, Alexander Kukushkin)

    Wenn synchronous_mode aktiviert ist und keine Replikate mit dem Primärserver verbunden sind, deaktiviert Patroni normalerweise die synchrone Replikation, damit der Primärserver für Schreibzugriffe verfügbar bleibt. Die Option synchronous_mode_strict ändert dies: Ist sie gesetzt, deaktiviert Patroni die synchrone Replikation bei fehlenden Replikaten nicht und blockiert damit alle Clients, die Daten auf den Primärserver schreiben. Zusätzlich zur Garantie des synchronen Modus, Datenverlust durch automatisches Failover zu verhindern, stellt der strikte Modus sicher, dass jeder Schreibvorgang dauerhaft auf zwei Knoten gespeichert wird oder ganz unterbleibt, wenn der Cluster nur einen Knoten enthält.

Konfigurationsbearbeitung mit patronictl

  • Bearbeitung der Konfiguration zu patronictl hinzufügen (Ants Aasma, Alexander Kukushkin)

    patronictl kann die im DCS gespeicherte dynamische Clusterkonfiguration bearbeiten. Unterstützt werden die Angabe von Parametern und Werten über die Befehlszeile, der Aufruf von $EDITOR und die Übernahme einer Konfiguration aus einer YAML-Datei.

Linux-Watchdog-Unterstützung

  • Watchdog-Unterstützung für Linux implementieren (Ants Aasma)

    Der Linux-Software-Watchdog wird unterstützt, um einen Knoten neu zu starten, auf dem Patroni nicht läuft oder nicht reagiert, beispielsweise wegen hoher Last. Der Linux-Software-Watchdog startet den nicht reagierenden Knoten neu. Im Abschnitt watchdog der Patroni-Konfiguration können das zu verwendende Watchdog-Gerät, standardmäßig /dev/watchdog, und der Modus on, automatic oder off konfiguriert werden. Weitere Informationen enthält die Watchdog-Dokumentation .

Unterstützung für PostgreSQL 10 hinzufügen

  • Patroni ist mit allen bisher veröffentlichten Betaversionen von PostgreSQL 10 kompatibel. Auch für die endgültige Veröffentlichung von PostgreSQL 10 wird Kompatibilität erwartet.

Kleinere Verbesserungen im Zusammenhang mit PostgreSQL

  • pg_hba.conf über die Patroni-Konfigurationsdatei oder die dynamische Konfiguration im DCS definieren (Alexander Kukushkin)

    Der Inhalt von pg_hba.conf kann im Unterabschnitt pg_hba des Konfigurationsabschnitts postgresql definiert werden. Dies vereinfacht die Verwaltung von pg_hba.conf auf mehreren Knoten, da sie nur einmal im DCS definiert werden muss, statt sich auf jedem Knoten anzumelden, sie manuell zu ändern und die Konfiguration neu zu laden.

    Wenn der Abschnitt definiert ist, ersetzt sein Inhalt die aktuelle pg_hba.conf vollständig. Patroni ignoriert ihn, wenn der PostgreSQL-Parameter hba_file gesetzt ist.

  • Verbindung zum lokalen PostgreSQL-Cluster über einen UNIX-Socket unterstützen (Alexander Kukushkin)

    Die Option use_unix_socket wurde zum Abschnitt postgresql der Patroni-Konfiguration hinzugefügt. Wenn sie auf true gesetzt ist und die PostgreSQL-Option unix_socket_directories nicht leer ist, verwendet Patroni deren ersten Wert zur Verbindung mit dem lokalen PostgreSQL-Cluster. Ist unix_socket_directories nicht definiert, nimmt Patroni den Standardwert an und lässt den Parameter host in der PostgreSQL-Verbindungszeichenkette vollständig weg.

  • Änderung der Superuser- und Replikationszugangsdaten beim Neuladen unterstützen (Alexander Kukushkin)

  • Speichern von Konfigurationsdateien außerhalb des PostgreSQL-Datenverzeichnisses unterstützen (@jouir)

    Die neue Konfigurationsdirektive config_dir wurde zum Abschnitt postgresql hinzugefügt. Sie verweist standardmäßig auf das Datenverzeichnis und muss für Patroni beschreibbar sein.

Fehlerbehebungen und Verbesserungen der Stabilität

  • Ausnahmen EtcdEventIndexCleared und EtcdWatcherCleared behandeln (Alexander Kukushkin)

    Wenn etcd einen Watch-Vorgang beendet, wird durch Vermeidung nutzloser Wiederholungen eine schnellere Wiederherstellung erreicht.

  • Endlose Fehlerschleifen bei etcd-Ausfällen beseitigen und übermäßige Protokollausgaben reduzieren (Ants Aasma)

    Beim zweiten und jedem weiteren etcd-Verbindungsfehler werden sofortige Wiederholungen und die Ausgabe von Stacktraces im Protokoll vermieden.

  • Locale-Variablen beim Forken von PostgreSQL-Prozessen exportieren (Oleksii Kliukin)

    Dies vermeidet den schwerwiegenden Fehler postmaster became multithreaded during startup bei nicht englischen Locales und einem mit NLS gebauten PostgreSQL.

  • Zusätzliche Prüfungen beim Löschen des Replikations-Slots (Alexander Kukushkin)

    In manchen Fällen hindert der WAL-Sender Patroni daran, den Replikations-Slot zu löschen.

  • Namen von Replikations-Slots gemäß den PostgreSQL-Namensregeln auf 63 (NAMEDATALEN - 1) Zeichen kürzen (Nick Scott)

  • Race Condition beheben, durch die Patroni zusätzliche Verbindungen zum PostgreSQL-Cluster öffnete (Alexander Kukushkin)

  • Leader-Schlüssel freigeben, wenn der Knoten mit leerem Datenverzeichnis neu startet (Alex Kerney)

  • Asynchronen Executor beim Bootstrap ohne Leader als beschäftigt markieren (Alexander Kukushkin)

    Andernfalls konnten Fehler auftreten, die besagten, der Knoten gehöre zu einem anderen Cluster. Denn Patroni setzte den normalen Betrieb fort, während eine Bootstrap-Methode ausgeführt wurde, die keinen Leader im Cluster benötigt.

  • WAL-E-Methode zur Replikaterstellung verbessern (Joar Wandborg, Alexander Kukushkin).

    • Beim Auswerten des WAL-E-Basisbackups csv.DictReader verwenden und ISO-Datumsangaben akzeptieren, bei denen Datum und Uhrzeit durch ein Leerzeichen getrennt sind.
    • Abruf der aktuellen WAL-Position vom Replikat unterstützen, um die wiederherzustellende WAL-Menge abzuschätzen. Zuvor rief der Code Systeminformationsfunktionen auf, die nur auf dem Primärserver verfügbar waren.

Version 1.2

Veröffentlicht am 2016-12-13

Diese Version verbessert die Handhabung synchroner Replikation erheblich, macht den Startvorgang und Failover zuverlässiger, unterstützt PostgreSQL 9.6 und behebt zahlreiche Fehler. Außerdem wurde die Dokumentation einschließlich dieser Versionshinweise nach https://patroni.readthedocs.io verlagert.

Synchrone Replikation

  • Unterstützung für synchrone Replikation hinzufügen. (Ants Aasma)

    Die neue Konfigurationsvariable synchronous_mode wurde hinzugefügt. Wenn sie aktiviert ist, verwaltet Patroni synchronous_standby_names, um die synchrone Replikation zu aktivieren, sobald funktionsfähige Standbys verfügbar sind. Im synchronen Modus führt Patroni ein automatisches Failover nur zu einem Standby durch, der zum Zeitpunkt des Primärserver-Ausfalls synchron repliziert hat. Dadurch geht in diesem Fall keine für Benutzer sichtbare Transaktion verloren. Eine ausführliche Beschreibung und Implementierungsdetails enthält die Funktionsdokumentation .

Verbesserungen der Zuverlässigkeit

  • Die im Schlüssel leader optime gespeicherte Leader-Position nicht aktualisieren, wenn PostgreSQL nicht zu 100% funktionsfähig ist. Sofort herabstufen, wenn die Aktualisierung des Leader-Schlüssels fehlschlägt. (Alexander Kukushkin)

  • Nicht funktionsfähige Knoten aus der Liste möglicher Quellen zum Klonen neuer Replikate ausschließen. (Alexander Kukushkin)

  • Wiederholungs- und Zeitüberschreitungsstrategie für Consul ähnlich wie für etcd implementieren. (Alexander Kukushkin)

  • --dcs und --config-file auf alle Optionen in patronictl anwenden. (Alexander Kukushkin)

  • Alle Postgres-Parameter in postgresql.conf schreiben. (Alexander Kukushkin)

    Dadurch kann das von Patroni konfigurierte PostgreSQL allein mit pg_ctl gestartet werden.

  • Ausnahmen vermeiden, wenn die Konfiguration keine Benutzer enthält. (Kirill Pushkin)

  • Pausieren eines nicht funktionsfähigen Clusters zulassen. Vor dieser Korrektur brach patronictl ab, wenn der Knoten, auf dem die Pause ausgeführt werden sollte, nicht funktionsfähig war. (Alexander Kukushkin)

  • Watch-Funktion für den Leader verbessern. (Alexander Kukushkin)

    Zuvor beobachteten Replikate immer den Leader-Schlüssel und warteten, bis die Wartezeit ablief oder sich der Leader-Schlüssel änderte. Mit dieser Änderung beobachten sie ihn nur, wenn PostgreSQL auf dem Replikat im Zustand running ist, und nicht, wenn PostgreSQL gestoppt ist, startet oder neu gestartet wird.

  • Race Conditions bei der Behandlung von SIGCHLD als PID 1 vermeiden. (Alexander Kukushkin)

    In Docker-Containern konnte zuvor eine Race Condition auftreten, weil derselbe Prozess in Patroni sowohl neue Prozesse erzeugte als auch deren SIGCHLD behandelte. Diese Änderung verwendet fork/execs für Patroni und überlässt dem ursprünglichen Prozess mit PID 1 die Behandlung der Signale von Kindprozessen.

  • WAL-E-Wiederherstellung korrigieren. (Oleksii Kliukin)

    Zuvor verwendete die WAL-E-Wiederherstellung den Schalter no_master, um den Primärserver überhaupt nicht zu konsultieren. Dadurch bevorzugte Patroni immer die Wiederherstellung aus WAL gegenüber pg_basebackup. Diese Änderung stellt die ursprüngliche Bedeutung von no_master wieder her: Die WAL-E-Wiederherstellung von Patroni kann auch dann als Replikationsmethode gewählt werden, wenn der Primärserver nicht läuft. Letzteres wird anhand der an die Methode übergebenen Verbindungszeichenkette geprüft. Außerdem wird der Wiederholungsmechanismus robuster und weitere kleinere Probleme werden behandelt.

  • Asynchronen Cache für DNS-Auflösung implementieren. (Alexander Kukushkin)

    Dadurch werden Fehler vermieden, wenn DNS vorübergehend nicht verfügbar ist, etwa aufgrund übermäßigen eingehenden Datenverkehrs auf dem Knoten.

  • Startzustand und Zeitüberschreitung für den Primärserver-Start implementieren. (Ants Aasma, Alexander Kukushkin)

    Zuvor wartete pg_ctl bis zu einer Zeitüberschreitung und fuhr anschließend fort, als würde PostgreSQL laufen. Dadurch wurde PostgreSQL in Listen als laufend angezeigt, obwohl dies nicht zutraf. Eine Race Condition konnte zu einem Failover, einer Crash-Recovery oder einer durch Failover unterbrochenen Crash-Recovery mit ausgelassenem Rewind führen. Diese Änderung ergänzt den Parameter master_start_timeout und den neuen Zustand starting für die HA-Hauptschleife. Wenn master_start_timeout auf 0 gesetzt ist, erfolgt nach einem Primärserver-Absturz sofort ein Failover, sobald ein geeigneter Kandidat vorhanden ist. Andernfalls wartet Patroni nach dem Versuch, PostgreSQL auf dem Primärserver zu starten, für die Dauer der Zeitüberschreitung und führt anschließend nach Möglichkeit ein Failover durch. Manuelle Failover-Anfragen werden bei einem Primärserver-Absturz auch vor Ablauf der Zeitüberschreitung berücksichtigt.

    Der Parameter timeout wurde zum API-Endpunkt restart und zu patronictl hinzugefügt. Ist er gesetzt und dauert ein Neustart länger als die angegebene Zeit, gilt PostgreSQL als nicht funktionsfähig und die anderen Knoten dürfen den Leader-Lock übernehmen.

  • Verhalten von pg_rewind im Pause-Modus korrigieren. (Ants Aasma)

    Ein unnötiger Neustart im Pause-Modus wird vermieden, wenn Patroni einen Rewind für erforderlich hält, dieser aber nicht möglich ist, etwa weil pg_rewind fehlt. Wenn im für pg_rewind relevanten Abschnitt der Patroni-Konfiguration die Authentifizierung für superuser fehlt, wird auf die Standardwerte von libpq für superuser zurückgegriffen, standardmäßig den Betriebssystembenutzer.

  • Ausführung von Callbacks serialisieren. Vor Ausführung eines neuen Callbacks den vorherigen desselben Typs beenden. Erzeugung von Zombie-Prozessen beim Ausführen von Callbacks beheben. (Alexander Kukushkin)

  • Hochstufung eines früheren Primärservers vermeiden, wenn der Leader-Schlüssel im DCS gesetzt ist, seine Aktualisierung jedoch fehlschlägt. (Alexander Kukushkin)

    Dadurch wird verhindert, dass ein aktueller Primärserver seine Rolle beibehält, wenn er zusammen mit einer Minderheit der Knoten in etcd oder einem anderen DCS isoliert ist, der „inkonsistente Lesezugriffe“ erlaubt.

Verschiedenes

  • Konfigurationsoption post_init für den Bootstrap hinzufügen. (Alejandro Martínez)

    Patroni ruft das als Argument dieser Option angegebene Skript unmittelbar nach initdb und dem Start von PostgreSQL für einen neuen Cluster auf. Das Skript erhält eine Verbindungs-URL mit superuser. Wenn ein Passwort angegeben ist, setzt Patroni PGPASSFILE auf die Datei .pgpass, die das Passwort enthält. Schlägt das Skript fehl, schlägt auch die Patroni-Initialisierung fehl. Dies ist nützlich, um Benutzer hinzuzufügen oder Erweiterungen im neuen Cluster zu erstellen.

  • Unterstützung für PostgreSQL 9.6 implementieren. (Alexander Kukushkin)

    wal_level = replica wird als Synonym für hot_standby verwendet, sodass beim Wechsel zwischen beiden kein pending_restart-Schalter gesetzt wird. (Alexander Kukushkin)

Verbesserungen der Dokumentation

  • Ablaufdiagramm der Patroni-Hauptschleife hinzufügen. (Alejandro Martínez, Alexander Kukushkin)

  • README um das Helm-Chart und Links zu den Versionshinweisen ergänzen. (Lauri Apple)

  • Patroni-Dokumentation zu Read the Docs verlagern. Die aktuelle Dokumentation ist unter https://patroni.readthedocs.io verfügbar. (Oleksii Kliukin)

    Dadurch lässt sich die Dokumentation auf verschiedenen Geräten einschließlich Smartphones einfach lesen und durchsuchen.

  • Paket auf semantische Versionierung umstellen. (Oleksii Kliukin)

    Patroni folgt dem Versionsschema major.minor.patch, damit kleine, aber kritische Fehlerbehebungen keine neue Minor-Version erfordern. Versionshinweise werden nur für die Minor-Version veröffentlicht und enthalten alle Patches.


Version 1.1

Veröffentlicht am 2016-09-07

Diese Version verbessert die Verwaltung von Patroni-Clustern durch den Pause-Modus und die Wartung durch geplante und bedingte Neustarts. Sie macht die Interaktion von Patroni mit etcd oder Zookeeper robuster und erweitert patronictl erheblich.

Upgrade-Hinweis

Beim Upgrade von Versionen unter 1.0 sind die Hinweise zu Änderungen an Zugangsdaten und Konfigurationsformat in den Versionshinweisen zu 1.0 zu beachten.

Pause-Modus

  • Pause-Modus einführen, um Patroni vorübergehend von der Verwaltung einer PostgreSQL-Instanz zu entkoppeln (Murat Kabilov, Alexander Kukushkin, Oleksii Kliukin).

    Zuvor musste Patroni mit SIGKILL beendet werden, um es zu stoppen, ohne PostgreSQL zu beenden. Der neue Pause-Modus entkoppelt Patroni clusterweit von PostgreSQL, ohne Patroni zu beenden. Er ähnelt dem Wartungsmodus von Pacemaker. Patroni aktualisiert weiterhin die Member- und Leader-Schlüssel im DCS, startet und stoppt den PostgreSQL-Server dabei aber nicht und führt auch keine Neustarts durch. Es gibt einige Ausnahmen: Manuelle Failover, Neuinitialisierungen und Neustarts bleiben beispielsweise erlaubt. Eine ausführliche Beschreibung dieser Funktion ist verfügbar.

Außerdem unterstützt patronictl die neuen Befehle pause und resume, um den Pause-Modus ein- und auszuschalten.

Geplante und bedingte Neustarts

  • Bedingungen zum API-Befehl restart hinzufügen (Oleksii Kliukin)

    Diese Änderung erweitert Patroni-Neustarts um Bedingungen, die vor dem Neustart geprüft werden können. Dazu gehören Neustarts abhängig von der PostgreSQL-Rolle als Primärserver oder Replikat, die Prüfung der PostgreSQL-Versionsnummer und Neustarts nur dann, wenn sie zum Anwenden von Konfigurationsänderungen erforderlich sind.

  • Geplante Neustarts hinzufügen (Oleksii Kliukin)

    Neustarts können jetzt für einen späteren Zeitpunkt geplant werden. Pro Knoten wird nur ein geplanter Neustart unterstützt. Er kann gelöscht werden, wenn er nicht mehr benötigt wird. Geplante und bedingte Neustarts können kombiniert werden. So lassen sich beispielsweise PostgreSQL-Minor-Upgrades nachts ausführen und nur Instanzen mit veralteter Minor-Version neu starten, ohne Postgres-spezifische Logik in Administrationsskripte aufzunehmen.

  • Unterstützung für bedingte und geplante Neustarts zu patronictl hinzufügen (Murat Kabilov).

    patronictl restart unterstützt mehrere neue Optionen. Außerdem gibt es den Befehl patronictl flush zum Löschen geplanter Aktionen.

Robuste DCS-Interaktion

  • Kazoo-Zeitüberschreitungen abhängig von loop_wait setzen (Alexander Kukushkin)

    Ursprünglich wurden ping_timeout und connect_timeout aus der ausgehandelten Session-Zeitüberschreitung berechnet. Patronis loop_wait wurde nicht berücksichtigt. Dadurch konnte ein einzelner Wiederholungsversuch länger als die Session-Zeitüberschreitung dauern, sodass Patroni den Lock freigeben und sich herabstufen musste.

    Diese Änderung setzt die Ping- und Verbindungszeitüberschreitung auf die Hälfte von loop_wait. Dadurch werden Verbindungsprobleme schneller erkannt und es bleibt genug Zeit für einen erneuten Verbindungsversuch, bevor der Lock verloren geht.

  • etcd-Topologie erst nach erfolgreicher ursprünglicher Anfrage aktualisieren (Alexander Kukushkin)

    Die Aktualisierung der dem Client bekannten etcd-Topologie wird bis nach der ursprünglichen Anfrage aufgeschoben. Beim Abruf der Clustertopologie werden die Zeitüberschreitungen für Wiederholungen abhängig von der bekannten Anzahl der Knoten im etcd-Cluster festgelegt. Dadurch zieht der Client das Ergebnis der Anfrage einer aktuellen Knotenliste vor.

    Beide Änderungen machen Patroni-Verbindungen zum DCS bei Netzwerkproblemen robuster.

Patronictl, Überwachung und Konfiguration

  • Informationen über streamende Replikate über die API zurückgeben (Feike Steenbergen)

    Zuvor gab es keinen zuverlässigen Weg, Patroni nach PostgreSQL-Instanzen zu fragen, die keine Änderungen streamen, beispielsweise wegen Verbindungsproblemen. Diese Änderung stellt den Inhalt von pg_stat_replication über den Endpunkt /patroni bereit.

  • Befehl patronictl scaffold hinzufügen (Oleksii Kliukin)

    Ein Befehl zum Erstellen einer Clusterstruktur in etcd wurde hinzugefügt. Der Cluster wird mit benutzerdefinierter sysid und benutzerdefiniertem Leader erstellt; sowohl Leader- als auch Member-Schlüssel werden dauerhaft angelegt. Dies ist für sogenannte Konfigurationen ohne Primärserver nützlich, bei denen ein nur aus Replikaten bestehender Patroni-Cluster von einem externen Primärserver repliziert, der Patroni nicht kennt. Anschließend kann der Leader-Schlüssel entfernt werden, wodurch einer der Patroni-Knoten hochgestuft und der ursprüngliche Primärserver durch einen Patroni-basierten HA-Cluster ersetzt wird.

  • Konfigurationsoption bin_dir zur Angabe der PostgreSQL-Programme hinzufügen (Ants Aasma)

    Auf Linux-Distributionen, die die gleichzeitige Installation mehrerer PostgreSQL-Versionen unterstützen, ist die ausdrückliche Angabe des Verzeichnisses der PostgreSQL-Programme nützlich.

  • Überschreiben des Konfigurationsdateipfads mit custom_conf ermöglichen (Alejandro Martínez)

    Benutzerdefinierte Pfade zu Konfigurationsdateien, die Patroni nicht verwaltet, sind möglich; siehe Details .

Fehlerbehebungen und Codeverbesserungen

  • Patroni mit dem neuen Versionsschema ab PostgreSQL 10 kompatibel machen (Feike Steenbergen)

    Patroni versteht bei bedingten Neustarts anhand der PostgreSQL-Version auch 2-stellige Versionsnummern.

  • pkgutil zum Auffinden von DCS-Modulen verwenden (Alexander Kukushkin)

    Statt Verzeichnisse manuell zu durchlaufen, wird das dafür vorgesehene Python-Modul zum Auffinden von DCS-Modulen verwendet.

  • Beim Start von Patroni immer den Callback on_start aufrufen (Alexander Kukushkin)

    Zuvor rief Patroni beim Anhängen an einen bereits laufenden Knoten mit korrekter Rolle keinen Callback auf. Da Callbacks häufig zum Weiterleiten von Client-Verbindungen dienen, konnte der laufende Knoten dadurch im Verbindungsschema unregistriert bleiben. Mit dieser Korrektur ruft Patroni on_start auch dann auf, wenn es sich an einen bereits laufenden Knoten anhängt.

  • Aktive Replikations-Slots nicht löschen (Murat Kabilov, Oleksii Kliukin)

    Aktive physische Replikations-Slots auf dem Primärserver werden nicht gelöscht; PostgreSQL kann solche Slots ohnehin nicht löschen. Diese Änderung ermöglicht Replikate und Verbraucher auf dem Primärserver, die nicht von Patroni verwaltet werden.

  • Patroni-Verbindungen beim Start einer PostgreSQL-Instanz schließen (Alexander Kukushkin)

    Patroni schließt beim Start eines PostgreSQL-Knotens zwingend alle bisherigen Verbindungen. Dadurch wird vermieden, dass alte Verbindungen wiederverwendet werden, nachdem postmaster mit SIGKILL beendet wurde.

  • Ungültige Zeichen beim Ableiten von Slot-Namen aus Mitgliedsnamen ersetzen (Ants Aasma)

    Standby-Namen, die nicht den Namensregeln für Slots entsprechen, führen nicht mehr zum Fehlschlagen der Slot-Erstellung und des Standby-Starts. Bindestriche in Slot-Namen werden durch Unterstriche ersetzt, alle anderen in Slot-Namen unzulässigen Zeichen durch ihre Unicode-Codepoints.


Version 1.0

Veröffentlicht am 2016-07-05

Diese Version führt die globale dynamische Konfiguration ein, mit der PostgreSQL- und Patroni-Konfigurationsparameter für den gesamten HA-Cluster dynamisch geändert werden können. Außerdem enthält sie zahlreiche Fehlerbehebungen.

Upgrade-Hinweis

Beim Upgrade von v0.90 oder früher müssen stets alle Replikate vor dem Primärserver aktualisiert werden. Da Replikationszugangsdaten nicht mehr im DCS gespeichert werden, kann sich ein altes Replikat nicht mit dem neuen Primärserver verbinden.

Dynamische Konfiguration

  • Dynamische globale Konfiguration implementieren (Alexander Kukushkin)

    Der neue REST-API-Endpunkt /config stellt PostgreSQL- und Patroni-Konfigurationsparameter bereit, die global für den gesamten HA-Cluster, also Primärserver und alle Replikate, gesetzt werden sollten. Diese Parameter werden im DCS gespeichert und können in vielen Fällen ohne Unterbrechung von PostgreSQL oder Patroni angewendet werden. Wenn bestimmte Werte einen PostgreSQL-Neustart erfordern, setzt Patroni den besonderen, über die API sichtbaren Schalter „pending restart“. In diesem Fall sollte der Neustart manuell über die API ausgelöst werden.

    SIGHUP an Patroni oder eine POST-Anfrage an /reload veranlasst Patroni, die Konfigurationsdatei erneut einzulesen.

    Welche Parameter geändert werden können und in welcher Reihenfolge verschiedene Konfigurationsquellen verarbeitet werden, beschreibt die Patroni-Konfiguration .

    Das Format der Konfigurationsdatei hat sich seit v0.90 geändert. Patroni ist weiterhin mit alten Konfigurationsdateien kompatibel. Um die Bootstrap-Parameter zu nutzen, müssen sie jedoch angepasst werden. Es wird empfohlen, die Dateien anhand der Dokumentation zur dynamischen Konfiguration zu aktualisieren.

Flexiblere Konfiguration*

  • PostgreSQL-Konfiguration und Namen der Datenbank, mit der Patroni sich verbindet, konfigurierbar machen (Misja Hoebe)

    Die Konfigurationsparameter database und config_base_name wurden eingeführt. Dies ermöglicht unter anderem den Betrieb von Patroni mit PipelineDB und anderen PostgreSQL-Forks.

  • Einstellung einiger Patroni-Konfigurationsparameter über die Umgebung ermöglichen (Alexander Kukushkin)

    Dazu gehören Scope, Knotenname, Namespace und Geheimnisse. Dies erleichtert den Betrieb von Patroni in einer dynamischen Umgebung wie Kubernetes. Weitere Einzelheiten enthält die Übersicht der unterstützten Umgebungsvariablen .

  • Integrierten Patroni-Docker-Container zur Nutzung der umgebungsbasierten Konfiguration aktualisieren (Feike Steenbergen).

  • Zookeeper-Unterstützung zum Patroni-Docker-Image hinzufügen (Alexander Kukushkin)

  • Konfigurationsoptionen für Zookeeper und Exhibitor trennen (Alexander Kukushkin)

  • Patroni-Code zum Einlesen der Konfiguration in patronictl wiederverwenden (Alexander Kukushkin)

    Dadurch kann patronictl die umgebungsbasierte Konfiguration nutzen.

  • Anwendungsnamen in primary_conninfo auf den Knotennamen setzen (Alexander Kukushkin)

    Dies vereinfacht die Identifizierung und Konfiguration synchroner Replikation für einen bestimmten Knoten.

Verbesserungen der Stabilität, Sicherheit und Bedienbarkeit

  • sysid zurücksetzen und pg_controldata während der Wiederherstellung eines Backups nicht aufrufen (Alexander Kukushkin)

    Diese Änderung reduziert die überflüssigen Meldungen der Patroni-API-Health-Checks während der langwierigen Initialisierung eines Knotens aus einem Backup.

  • Mehrere Sonderfälle von pg_rewind beheben (Alexander Kukushkin)

    pg_rewind wird nicht ausgeführt, wenn der Quellcluster kein Primärserver ist.

    Außerdem wird das Datenverzeichnis nach einem fehlgeschlagenen Rewind nicht entfernt, sofern nicht der neue Parameter remove_data_directory_on_rewind_failure auf true gesetzt ist. Standardmäßig ist er false.

  • Passwörter aus der Replikations-Verbindungszeichenkette im DCS entfernen (Alexander Kukushkin)

    Zuvor verwendete Patroni immer die Replikationszugangsdaten aus der Postgres-URL im DCS. Jetzt werden die Zugangsdaten aus der Patroni-Konfiguration übernommen. Die Geheimnisse, also Replikationsbenutzername und -passwort, sind nicht mehr im DCS offengelegt.

  • Asynchrone Abläufe rund um den Aufruf demote korrigieren (Alexander Kukushkin)

    Die Herabstufung läuft jetzt vollständig asynchron, ohne Interaktionen mit dem DCS zu blockieren.

  • patronictl den Authorization-Header immer senden lassen, wenn er konfiguriert ist (Alexander Kukushkin)

    Dadurch kann patronictl „geschützte“ Anfragen wie Neustart oder Neuinitialisierung senden, wenn Patroni dafür eine Autorisierung verlangt.

  • Ausnahme SystemExit korrekt behandeln (Alexander Kukushkin)

    Dadurch werden Probleme vermieden, bei denen Patroni nach Empfang von SIGTERM nicht ordnungsgemäß beendet wurde.

  • HAProxy-Beispielvorlagen für confd (Alexander Kukushkin)

    Mit confd wird aus dem Patroni-Zustand im DCS eine HAProxy-Konfiguration erzeugt und dynamisch angepasst.

  • Dokumentation verbessern und umstrukturieren, damit sie für neue Benutzer leichter zugänglich ist (Lauri Apple)

  • API muss während pg_ctl stop role=master melden (Alexander Kukushkin)

    Dadurch werden Callback-Aufrufe zuverlässiger, insbesondere beim Stoppen des Clusters. Außerdem wurde die Option pg_ctl_timeout eingeführt, um die Zeitüberschreitung für Start-, Stopp- und Neustartaufrufe über pg_ctl festzulegen.

  • Wiederholungslogik in etcd korrigieren (Alexander Kukushkin)

    Wiederholungen werden vorhersehbarer und robuster.

  • Zookeeper-Code gegen kurze Netzwerkunterbrechungen robuster machen (Alexander Kukushkin)

    Kürzere Verbindungszeitüberschreitungen ermöglichen häufigere Verbindungsversuche zu Zookeeper.


Version 0.90

Veröffentlicht am 2016-04-27

Diese Version unterstützt Consul, ergänzt den Tag noloadbalance, ändert das Verhalten des Tags clonefrom und verbessert die Handhabung von pg_rewind sowie das Steuerungsprogramm patronictl.

Consul-Unterstützung

  • Consul-Unterstützung implementieren (Alexander Kukushkin)

    Patroni kann neben etcd und Zookeeper auch Consul verwenden. Die Verbindungsparameter können in der YAML-Datei konfiguriert werden.

Neue und verbesserte Tags

  • Tag noloadbalance implementieren (Alexander Kukushkin)

    Mit diesem Tag meldet Patroni dem Load-Balancer stets, dass das Replikat nicht verfügbar ist.

  • Implementierung des Tags clonefrom ändern (Alexander Kukushkin)

    Zuvor musste bei clonefrom ein Knotenname angegeben werden, wodurch ein markiertes Replikat zwingend von diesem Knoten geklont wurde. Die neue Implementierung macht clonefrom zu einem booleschen Tag: Ist er auf true gesetzt, wird das Replikat zum möglichen Klon-Ursprung für andere Replikate. Gibt es mehrere Kandidaten, wählt das Replikat zufällig einen davon aus.

Verbesserungen der Stabilität und Sicherheit

  • Zahlreiche Verbesserungen der Zuverlässigkeit (Alexander Kukushkin)

    Überflüssige Fehlermeldungen werden entfernt, die Stabilität des Failovers verbessert und Sonderfälle beim Lesen aus dem DCS, Herunterfahren, Herabstufen und erneuten Eingliedern des früheren Leaders behandelt.

  • Systemskript verbessern, damit beim Stoppen keine Kindprozesse von Patroni beendet werden (Jan Keirse, Alexander Kukushkin)

    Zuvor sendete systemd beim Stoppen von Patroni auch ein Signal an PostgreSQL. Da Patroni selbst ebenfalls versuchte, PostgreSQL zu stoppen, wurden zwei verschiedene Anfragen zum Herunterfahren gesendet: zuerst smart, dann fast. Dadurch trennten sich Replikate zu früh und ein früherer Primärserver konnte nach der Herabstufung nicht wieder beitreten. Die Korrektur stammt von Jan, die vorausgehende Untersuchung von Alexander.

  • Fälle beseitigen, in denen der frühere Primärserver vor dem erneuten Beitritt als Replikat pg_rewind nicht aufrufen konnte (Oleksii Kliukin)

    Zuvor wurde pg_rewind nur nach einem Absturz des früheren Primärservers aufgerufen. Jetzt wird pg_rewind für den früheren Primärserver immer ausgeführt, sofern pg_rewind auf dem System vorhanden ist. Damit wird der Fall behoben, dass der Primärserver heruntergefahren wird, bevor die Replikate die letzten Änderungen erhalten haben, etwa beim Herunterfahren im Modus „smart“.

  • Zahlreiche Verbesserungen an Unit- und Akzeptanztests, insbesondere Unterstützung für Zookeeper und Consul (Alexander Kukushkin).

  • Travis CI beschleunigen und Unterstützung für Tests mit Zookeeper (Exhibitor) und Consul implementieren (Alexander Kukushkin)

    Sowohl Unit- als auch Akzeptanztests werden bei jedem Commit oder Pull Request automatisch mit etcd, Zookeeper und Consul ausgeführt.

  • Umgebungsvariablen vor dem Aufruf von PostgreSQL-Befehlen aus Patroni bereinigen (Feike Steenbergen)

    Dadurch wird verhindert, dass über eine Verbindung zum von Patroni verwalteten PostgreSQL-Cluster Systemumgebungsvariablen ausgelesen werden können.

Änderungen an Konfiguration und Steuerung

  • Konfiguration von patronictl und Patroni vereinheitlichen (Feike Steenbergen)

    patronictl kann dieselbe Konfigurationsdatei wie Patroni selbst verwenden.

  • Einlesen der Konfiguration aus Umgebungsvariablen durch Patroni ermöglichen (Oleksii Kliukin)

    Dies vereinfacht die automatische Erzeugung einer Patroni-Konfiguration oder das Zusammenführen einer Konfiguration aus verschiedenen Quellen.

  • Datenbanksystemkennung in die von der API zurückgegebenen Informationen aufnehmen (Feike Steenbergen)

  • delete_cluster für alle verfügbaren DCS implementieren (Alexander Kukushkin)

    Dadurch unterstützt patronictl neben etcd auch andere DCS.


Version 0.80

Veröffentlicht am 2016-03-14

Diese Version unterstützt kaskadierende Replikation und vereinfacht die Patroni-Verwaltung durch geplante Failover. Für die Migration auf diese Version können ältere Patroni-Versionen, insbesondere 0.78, zusammen mit ihr verwendet werden. Die Funktionen für geplante Failover und kaskadierende Replikation funktionieren jedoch nur mit Patroni 0.80 und neuer.

Kaskadierende Replikation

  • Unterstützung für die Tags replicatefrom und clonefrom auf Patroni-Knoten hinzufügen (Oleksii Kliukin).

Mit dem Tag replicatefrom kann ein Replikat einen beliebigen Knoten als Quelle verwenden; dies muss nicht der Primärserver sein. clonefrom bietet dasselbe für das anfängliche Backup. Zusammen ermöglichen sie die vollständige Unterstützung kaskadierender Replikation in Patroni.

  • Ausführung von Replikationsmethoden zur Initialisierung eines Replikats auch ohne aktive Replikationsverbindung unterstützen (Oleksii Kliukin).

Dies ist nützlich, um Replikate aus auf S3 oder FTP gespeicherten Snapshots zu erstellen. Eine Replikationsmethode, die keine aktive Replikationsverbindung benötigt, sollte no_master: true in der YAML-Konfiguration angeben. Besteht eine Replikationsverbindung, werden diese Skripte weiterhin der Reihe nach aufgerufen.

Verbesserungen in Patronictl, API und DCS

  • Geplante Failover implementieren (Feike Steenbergen).

    Mit patronictl oder API-Aufrufen können Failover für einen bestimmten zukünftigen Zeitpunkt geplant werden.

  • Unterstützung für die Parameter dbuser und password in patronictl hinzufügen (Feike Steenbergen).

  • PostgreSQL-Version zur Ausgabe des Health Checks hinzufügen (Feike Steenbergen).

  • Zookeeper-Unterstützung in patronictl verbessern (Oleksandr Shulgin)

  • Auf python-etcd 0.4.3 migrieren (Alexander Kukushkin)

Konfiguration

  • Beispielskript zur Systemkonfiguration für Patroni hinzufügen (Jan Keirse).
  • Fehler beheben, durch den Patroni bei DB-Verbindungen den in der Konfigurationsdatei angegebenen Superuser-Namen ignorierte (Alexander Kukushkin).
  • Behandlung von CTRL-C korrigieren, indem für den von Patroni gestarteten postmaster eine eigene Session-ID und Prozessgruppe erstellt wird (Alexander Kukushkin).

Tests

  • Akzeptanztests mit behave hinzufügen, um reale Patroni-Betriebsszenarien zu prüfen (Alexander Kukushkin, Oleksii Kliukin).

    Die Tests können manuell mit dem Befehl behave gestartet werden. Sie werden außerdem automatisch bei Pull Requests und nach Commits ausgeführt.

    Versionshinweise zu einigen älteren Versionen finden sich auf der GitHub-Seite des Projekts .

20 - Leitfaden zur Mitarbeit

Ablauf für Beiträge, Anlaufstellen für Unterstützung und Entwicklungsrichtlinien.


Austausch

Bei Fragen, für interaktive Hilfe zur Fehlerbehebung oder zum Austausch mit anderen Patroni-Nutzern steht der Kanal #patroni im PostgreSQL-Slack zur Verfügung.


Fehler melden

Vor dem Melden eines Fehlers sicherstellen, dass er mit der neuesten Patroni-Version reproduzierbar ist! Außerdem sorgfältig prüfen, ob das Problem bereits in unserem Issue-Tracker erfasst ist.


Tests ausführen

Voraussetzungen für die Ausführung von behave-Tests:

  1. Die PostgreSQL-Pakete einschließlich der contrib -Module müssen installiert sein.
  2. Die ausführbaren PostgreSQL-Dateien müssen im PATH verfügbar sein. Gegebenenfalls müssen sie zum Suchpfad hinzugefügt werden, etwa mit PATH=/usr/lib/postgresql/11/bin:$PATH python -m behave.
  3. Für Tests mit externen DCS (z. B. etcd, Consul und Zookeeper) müssen die Pakete installiert sein und die jeweiligen Dienste laufen. Sie müssen unverschlüsselte/ungeschützte Verbindungen auf localhost und dem Standardport annehmen. Bei etcd oder Consul kann die behave-Testsuite die Dienste starten, wenn die ausführbaren Dateien im PATH verfügbar sind.

Abhängigkeiten installieren:

# You may want to use Virtualenv or specify pip3.
pip install -r requirements.txt
pip install -r requirements.dev.txt

Nach der Installation aller Abhängigkeiten können die verschiedenen Testsuiten ausgeführt werden:

# You may want to use Virtualenv or specify python3.

# Run flake8 to check syntax and formatting:
python setup.py flake8

# Run the pytest suite in tests/:
python setup.py test

# Moreover, you may want to run tests in different scopes for debugging purposes,
# the -s option include print output during test execution.
# Tests in pytest typically follow the pattern: FILEPATH::CLASSNAME::TESTNAME.
pytest -s tests/test_api.py
pytest -s tests/test_api.py::TestRestApiHandler
pytest -s tests/test_api.py::TestRestApiHandler::test_do_GET

# Run the behave (https://behave.readthedocs.io/en/latest/) test suite in features/;
# modify DCS as desired (raft has no dependencies so is the easiest to start with):
DCS=raft python -m behave

Testen mit tox

Für tox-Tests muss neben Python nur eine Abhängigkeit installiert werden:

pip install "tox>=4"

Für die Ausführung der Docker-basierten behave-Tests muss außerdem Docker installiert sein.

Die Tox-Konfiguration in tox.ini enthält „Umgebungen“ für die folgenden Aufgaben:

  • lint: Python-Code mit flake8 prüfen
  • test: Unit-Tests mit pytest für alle verfügbaren Python-Interpreter; erzeugt bei erkanntem TTY HTML-Berichte, andernfalls XML-Berichte
  • dep: Konflikte zwischen Paketabhängigkeiten mit pipdeptree erkennen
  • type: statische Typprüfung mit pyright
  • black: Codeformatierung mit black
  • docker-build: Docker-Image für die Umgebung behave erstellen
  • docker-cmd: beliebigen Befehl mit dem obigen Image ausführen
  • docker-behave-etcd: tox für behave-Tests mit dem obigen Image ausführen
  • py*behave: behave mit den verfügbaren Python-Interpretern ausführen (ohne Docker, obwohl genau dies innerhalb der Docker-Container aufgerufen wird)
  • docs: Dokumentation mit sphinx erstellen

tox ausführen

Um die Standardliste der Umgebungen dep, lint, test und docs auszuführen, genügt:

tox

Die Umgebungen test können mit dem Label test ausgeführt werden:

tox -m test

Die Docker-Tests für behave können mit dem Label behave ausgeführt werden:

tox -m behave

Entsprechend hat docs das Label docs.

Alle anderen Umgebungen können über ihre jeweiligen Namen ausgeführt werden:

tox -e lint
tox -e py39-test-lin

Mit factors können auch Teilmengen der Umgebungen ausgewählt werden. Beispielsweise lassen sich alle Umgebungen für Python 3.10 wie folgt ausführen:

tox -f py310

Dies entspricht der Ausführung aller nachfolgend aufgeführten Umgebungen:

$ tox -l -f py310
py310-test-lin
py310-test-mac
py310-test-win
py310-type-lin
py310-type-mac
py310-type-win
py310-behave-etcd-lin
py310-behave-etcd-win
py310-behave-etcd-mac
py310-behave-etcd3-lin
py310-behave-etcd3-win
py310-behave-etcd3-mac

Alle konfigurierten Kombinationen von Umgebungen lassen sich mit tox (>=v4) wie folgt auflisten:

tox l

Die Umgebungen test und docs versuchen nach Abschluss der Aufgabe, die HTML-Ausgabedateien zu öffnen, sofern tox in einem aktiven Terminal läuft. Dies soll die lokale Arbeit mit diesen Umgebungen erleichtern. Auf einem Mac wird dazu open aufgerufen, unter Linux xdg-open. Für einen anderen Befehl die Umgebungsvariable OPEN_CMD auf dessen Namen oder Pfad setzen. Schlägt dieser Schritt fehl, schlägt dadurch nicht der gesamte Durchlauf fehl. Zum Deaktivieren dieser Funktion die Umgebungsvariable OPEN_CMD auf den wirkungslosen Befehl : setzen.

OPEN_CMD=: tox -m docs

Behave-Tests

Behave-Tests mit -m behave erstellen Docker-Images auf Basis der PG_MAJOR-Versionen 12 bis 18 und führen anschließend alle behave-Tests aus. Dies kann recht lange dauern. Daher kann es sinnvoll sein, den Umfang auf eine bestimmte Postgres-Version, bestimmte Funktionen oder einzelne Schritte zu begrenzen.

Um die Postgres-Version festzulegen, den vollständigen Namen der gewünschten abhängigen Umgebung zum Erstellen des Images angeben, gefolgt vom Namen der behave-Umgebung. Beispielsweise für Postgres 14:

tox -e pg14-docker-build,pg14-docker-behave-etcd-lin

Um hingegen eine bestimmte Funktion zu testen, können Positionsargumente an behave übergeben werden. Der folgende Befehl führt das behave-Testszenario für die Watchdog-Funktion mit allen Postgres-Versionen aus.

tox -m behave -- features/watchdog.feature

Beide Möglichkeiten lassen sich auch kombinieren.


Einen Pull Request einreichen

  1. Einen Fork des Repositories erstellen, die Codeänderungen entwickeln und testen.
  2. Die Änderungen in der Benutzerdokumentation berücksichtigen.
  3. Einen Pull Request mit einer klaren Beschreibung des Ziels der Änderungen einreichen. Falls nötig, einen bestehenden Issue verlinken.

Rückmeldung zum Pull Request erfolgt so bald wie möglich.

Viel Spaß beim Entwickeln mit Patroni ;-)