Patroni REST API
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 /primaryGET /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 beiGET /primaryundGET /standby-leaderhängt diese Prüfung nicht davon ab, ob PostgreSQL alsprimaryoder alsstandby_leaderläuft. -
GET /replica: Endpunkt für den Health Check eines Replikats. Liefert den HTTP-Statuscode 200 nur dann, wenn der Patroni-Knoten den Zustandrunningund die Rollereplicahat und das Tagnoloadbalancenicht gesetzt ist. -
GET /replica?replication_state=<required state>: Endpunkt zur Prüfung eines Replikats. Prüft zusätzlich zu den Prüfungen vonreplica, ob der Replikationszustand dem geforderten Zustand entspricht. Vor allem mitreplication_state=streamingnü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 vonreplicaden 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=1048576GET /replica?lag=1024kBGET /replica?lag=10MBGET /replica?lag=1GB
-
GET /replica?tag_key1=value1&tag_key2=value2: Endpunkt zur Prüfung eines Replikats. Prüft zusätzlich die benutzerdefinierten Tagskey1undkey2und 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=value2GET /leader?tag_key1=value1&tag_key2=value2GET /primary?tag_key1=value1&tag_key2=value2GET /read-write?tag_key1=value1&tag_key2=value2GET /standby_leader?tag_key1=value1&tag_key2=value2GET /standby-leader?tag_key1=value1&tag_key2=value2
-
GET /read-only: Wie der obige Endpunkt, schließt aber auch den Primärserver ein. -
GET /synchronousoderGET /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 insynchronous_standby_namesals Quorum-Knoten aufgeführt ist. -
GET /read-only-quorum: Wie der obige Endpunkt, schließt aber auch den Primärserver ein. -
GET /asynchronousoderGET /async: Liefert den HTTP-Statuscode 200 nur dann, wenn der Patroni-Knoten als asynchroner Standby läuft. -
GET /asynchronous?lag=<max-lag>oderGET /async?lag=<max-lag>: Endpunkt zur Prüfung eines asynchronen Standbys. Prüft zusätzlich zu den Prüfungen vonasynchronousoderasyncden 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=1048576GET /async?lag=1024kBGET /async?lag=10MBGET /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 alsttlSekunden oder auf dem Replikat mehr als2*ttlSekunden zurückliegt. Kann fürlivenessProbeverwendet 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 istmaximum_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-
readinessProbestellt 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ürreadinessProbeverwendet 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:
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
Beispiel: Ein Cluster ohne Leader-Lock
Beispiel: Ein Cluster ohne Leader-Lock mit aktiviertem DCS-Failsafe-Modus
Beispiel: Ein Cluster mit aktiviertem Pausenmodus
Die Patroni-Metriken lassen sich über den Endpunkt GET /metrics im Prometheus-Format abrufen.
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
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 /clustererzeugt ein JSON-Dokument, das die aktuelle Topologie und den Zustand des Clusters beschreibt:
- Der Endpunkt
GET /historybietet einen Überblick über die Switchover- und Failover-Historie des Clusters. Das Format ähnelt stark dem Inhalt der History-Dateien im Verzeichnispg_wal. Der einzige Unterschied ist das Zeitstempelfeld, das angibt, wann die neue Timeline erstellt wurde.
Endpunkt für die Konfiguration
GET /config: Aktuelle Version der dynamischen Konfiguration abrufen:
PATCH /config: Bestehende Konfiguration ändern.
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:
Parameter entfernen:
Um eine Einstellung zu entfernen (zurückzusetzen), genügt es, sie per Patch auf null zu setzen:
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:
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
Beispiel: Switchover zu einem bestimmten Knoten durchführen
Beispiel: Switchover vom Leader zu einem beliebigen anderen funktionsfähigen Standby im Cluster zu einem bestimmten Zeitpunkt planen.
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:
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
nofailoverdarf nicht auftruegesetzt 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_timelineauftruegesetzt ist; - im synchronen Modus
:
- Bei einem Switchover (mit oder ohne Kandidaten): unter den Mitgliedern des Schlüssels
/syncaufgeführt sein; - Bei einem Failover sowohl in funktionsfähigen als auch in nicht funktionsfähigen Clustern entfällt diese Prüfung.
- Bei einem Switchover (mit oder ohne Kandidaten): unter den Mitgliedern des Schlüssels
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
/syncaufgefü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 AufrufPOST /restartkann Postgres auf dem jeweiligen Knoten neu gestartet werden. Im JSON-Inhalt derPOST-Anfrage können optional Bedingungen für den Neustart angegeben werden:- restart_pending: Boolescher Wert. Bei
truestartet 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.
- restart_pending: Boolescher Wert. Bei
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.