Versionshinweise
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_librarieswurde hinzugefügt. Sie beschränkt die Ausgabe-Plugins für die logische Dekodierung.
Verbesserungen
-
Verbindungsabbrüche der REST API auf Stufe
DEBUGstattWARNINGprotokollieren (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_sizekorrigieren (Sundong Kim)Der Wert
alignedim Schemaeintrag fürthread_stack_sizewurde von65535auf65536korrigiert. Zuvor lehntepatroni --validate-configfast jeden realistischen Wert ab, einschließlich des Standardwerts524288, den der Daemon selbst anwendet. -
Bei der Validierung von
synchronous_modeauch'quorum'und Zeichenketten mit booleschen Werten akzeptieren (Eray Araz)patroni --validate-configlehnte zuvor Werte fürsynchronous_modewiequorumund 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_SOCKETvor Verwendung des Paketssystemdprüfen (Polina Bungina)Das Paket wird nur dann importiert und verwendet, wenn die Umgebungsvariable
NOTIFY_SOCKETgesetzt ist. Dadurch wird die AusnahmeFileNotFoundError: [Errno 2] No such file or directoryvermieden. -
Die Abfrage von
pg_replication_slotsvereinheitlichen (Polina Bungina)Eine fehlerhafte Behandlung der Werte
failoverundsyncedführte beim Entfernen fehlerhafter logischer Replikations-Slots zuKeyError-Ausnahmen. -
Versionsabhängige Authentifizierungsparameter bei der Konfigurationserzeugung berücksichtigen (Polina Bungina)
Der Befehl
patroni --generate-configentfernt anhand der über eine PostgreSQL-Verbindung ermittelten Version alle nicht anwendbaren Authentifizierungsparameter, die versehentlich aus der Umgebung übernommen wurden. -
pg_rewindbehandeln, 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_controldatazurückgegriffen. -
Prometheus-Metriktyp für
patroni_postgres_timelinekorrigieren (Huseyin Demir)Die Metrik
patroni_postgres_timelinewird alsgaugestatt alscounterdeklariert, 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_timeoutkü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.trackfür die Überwachungsabfrage zwingend aufnonegesetzt, um aufwendige GC-Aufrufe vonpg_stat_statementszu vermeiden. -
Von Patroni verwaltete Replikations-Slots mit
wal_status=lostlöschen (Alexander Kukushkin)Replikations-Slots mit
wal_status=lostsind 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 membersvermieden.
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
Unknownaus, wenn während der Aktualisierung der Lease der etcd-Leader verloren geht. Patroni überschreibt den gemeldeten Fehlercode jetzt mitUnavailable.
Fehlerbehebungen
-
Version der ausführbaren Datei verwenden, wenn die Datei
PG_VERSIONfehlt (Polina Bungina)In manchen Fällen, etwa bei einem benutzerdefinierten Bootstrap, befindet sich die Datei
PG_VERSIONmö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)
PatroniLoggerwird vor dem Laden vonConfigerstellt, um frühe Protokollmeldungen zu erfassen. -
MONOTONIC_USECin die systemd-BenachrichtigungRELOADING=1aufnehmen (Alexander Kukushkin)systemd 257+ verlangt bei Diensten mit
Type=notify-reloadnebenRELOADING=1auchMONOTONIC_USEC. Ohne diese Angabe bleibtsystemctl reloadunbegrenzt hängen.
Verbesserungen
-
Crash-Recovery im Einzelbenutzermodus überspringen, wenn
backup_labelvorhanden 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
systemdohne das Paketpython-systemdwarnen (Alexander Kukushkin)Statt beim Start „systemd integration is not supported“ zu protokollieren, wird auf
NOTIFY_SOCKETgeprüft. Eine Warnung erfolgt nur, wenn Patroni tatsächlich untersystemdläuft und das Paketpython-systemdnicht 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-reloadhinzufügen (Ronan Dunklau)Durch die Benachrichtigungen
RELOADING=1undREADY=1an systemd kannsystemctl reloadwarten, bis Patroni das Neuladen der Konfiguration tatsächlich verarbeitet hat. -
Beim Herunterfahren die Benachrichtigung
STOPPING=1an 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=allwurde aus der systemd-Unit-Beispieldatei entfernt. Beim Start von PostgreSQL wirdNOTIFY_SOCKETaus der Umgebung gefiltert, damit PostgreSQL wederREADY=1nochSTOPPING=1an systemd sendet. Bei der Übernahme einer PostgreSQL-Instanz, die vor Patroni gestartet wurde und bereitsNOTIFY_SOCKETbesitzt, wird während des Herunterfahrens von PostgreSQL erneutREADY=1gesendet, um dessenSTOPPING=1entgegenzuwirken.
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_sizeundrestapi.thread_pool_sizesind 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
403wiederholen (Sophia Ruan, Alexander Kukushkin)Wenn die Kubernetes-API vorübergehend
403 Permission Deniedzurückgibt (etwa bei vorübergehenden RBAC-Problemen), prüft Patroni jetzt, ob der aktuelle Knoten weiterhin Leader ist, und wiederholt die Leader-Aktualisierung innerhalb vonretry_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
/syncwurde 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 damitprimary_conninfonicht geändert hatten. -
Superuser-Passwort beim Bootstrap mit
initdbnur schreiben, wenn es nicht leer ist (Michael Banck)Das Schreiben eines leeren Passworts beim Bootstrap mit
initdbführte zu Problemen. -
Fehler bei
failover_prioritymitsynchronous_mode=onbeheben (Alexander Kukushkin)Werte von
tag.failover_prioritywurden ignoriert, wennsynchronous_node_count > 1galt. -
Fehler beim Passwortvergleich in
primary_conninfobeheben (Alexander Kukushkin)Ab PostgreSQL 10 verwendet Patroni in
primary_conninfoeine Passwortdatei. Nach einer Änderung des Replikationspassworts in der YAML-Dateikonfiguration mit anschließendem Neuladen aktualisierte Patroni diese Passwortdatei nicht. -
Replikat mit dem Tag
nofailoverim Pause-Modus nicht neu starten (Alexander Kukushkin)Patroni startete zuvor ein manuell heruntergefahrenes PostgreSQL-Replikat im Pause-Modus, wenn dessen Tag
nofailoverauftruegesetzt war. -
check_recovery_conf()korrigieren, wenn PostgreSQL gerade startet (Alexander Kukushkin)Bei PostgreSQL v12 und neuer kann
pg_settingsnicht abgefragt werden, solange der Server noch startet und keine Verbindungen annimmt. Fehlende Recovery-Parameter werden jetzt beim Schreiben vonpostgresql.confdem internen Zustand hinzugefügt. Außerdem wurde die PrüfungPostgresql.is_starting()inHa.is_healthiest_node()wiederhergestellt. -
Benutzeroptionen im Dictionary-Format für
initdb/basebackupvalidieren (m4rrypro)Wenn Optionen für
initdboderbasebackupals Dictionary statt als Liste angegeben wurden, wurde die Validierung durchoption_is_allowed()umgangen, wodurch gesperrte Optionen verwendet werden konnten. -
Serverseitige Komprimierung für die Option
basebackupzulassen (m4rrypro)Die Option
compresswar fürbasebackupvollstä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.parametersein Dictionary ist (Alexander Kukushkin)Eine neue Konfiguration wird verworfen, wenn
postgresql.parameterskein 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
/clusterund der Befehlpatronictl listliefern 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-clusterundpromote-clusterimplementieren (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_priorityimplementieren (Polina Bungina)Dieser Parameter steuert die Priorität eines Mitglieds bei der Auswahl synchroner Replikate, wenn synchronous_mode auf
ongesetzt ist. -
Option
--printfür--validate-configimplementieren (Polina Bungina)Nach erfolgreicher Validierung wird die lokale Konfiguration ausgegeben, einschließlich der durch Umgebungsvariablen überschriebenen Einstellungen.
-
kubernetes.bootstrap_labelsimplementieren (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 bootstrapodercreating replicazugewiesen werden. -
Konfigurationsoption zur Unterdrückung doppelter Heartbeat-Protokollmeldungen hinzufügen (Michael Morris)
Ist die Option auf
truegesetzt, werden aufeinanderfolgende identische Heartbeat-Protokollmeldungen nicht ausgegeben. -
Optionales Attribut
cluster_typefü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_tokenswurde 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 devicewird auf der Debug-Stufe ausgegeben, sofern der Watchdog nicht im Modusrequiredkonfiguriert ist. Zuvor wurde sie auf der Info-Stufe ausgegeben. -
written_lsnundlatest_end_lsnauspg_stat_wal_receivernutzen (Alexander Kukushkin)written_lsn, die tatsächliche Schreib-LSN, wird jetzt dem vonpg_last_wal_receive_lsn()gelieferten Wert vorgezogen, der tatsächlich die Flush-LSN ist.latest_end_lsnverweist 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 alleloop_waitSekunden aktualisiert werden. -
Interaktionen mit Slots vermeiden, die mit der Option
failover=trueerstellt wurden (Alexander Kukushkin)Diese Änderung ist erforderlich, damit die Funktion für logische Failover-Slots vollständig funktioniert.
-
PostgreSQL-Zustand zum REST-API-Endpunkt
/metricshinzufügen (Ivan Filianin)Informationen zum Zustand der PostgreSQL-Instanz sind jetzt in der Ausgabe des REST-API-Endpunkts
/metricsim 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_addressesin PostgreSQL beschränken0.0.0.0oder127.0.0.1die Adressen, auf denen PostgreSQL lauscht auf IPv4 und schließen IPv6 aus. Auf typischen Windows-Systemen wirdlocalhostjedoch häufig standardmäßig zur IPv6-Adresse::1aufgelöst. Um Kompatibilität sicherzustellen, konfiguriert Patroni PostgreSQL auf Windows-Systemen jetzt so, dass es auf127.0.0.1statt auflocalhostlauscht. -
Globale Konfiguration nur zurückgeben, wenn der Schlüssel
/configim DCS vorhanden ist (Alexander Kukushkin)Die Patroni-REST-API gab eine leere Konfiguration zurück, statt einen Fehler auszulösen, wenn der Schlüssel
/configim 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=1kam es in bestimmten Fällen nach dem Empfang vonSIGCHLDzu 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
etcd3korrekt behandeln (Alexander Kukushkin)Wenn
etcd3eine 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
pyopensslumschlosseneHTTPConnection-Sockets behandeln (Alexander Kukushkin)Patroni verwendete die durch
python-etcderzwungenenpyopenssl-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
LSNwie der aktuelle Knoten meldet. -
Berechtigungen für außerhalb von
PGDATAerstellte Dateienpostgresql.confkorrigieren (Michael Banck)Beim Erstellen der Datei
postgresql.confaußerhalb des VerzeichnissesPGDATAwird der systemweite umask-Wert berücksichtigt. -
Fehler beim Switchover mit
synchronous_mode=quorumbeheben (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
SIGHUPaktualisieren (Alexander Kukushkin)Zuvor ersetzte Patroni PostgreSQL-Konfigurationsdateien nur, wenn eine Änderung an der globalen oder lokalen Konfiguration erkannt wurde.
-
Von
etcd3ausgelöste AusnahmeUnavailablekorrekt 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
etcd3verbessern (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_lsnbeim Vorrücken von Slots berücksichtigen (Polina Bungina)Slots auf Replikaten werden nicht über
replay_lsnhinaus vorgerückt. Außerdem wird der Slot bis zur Positionreplay_lsnvorgerückt, wenn diese bereits größer als dieconfirmed_flush_lsndieses Slots auf dem Replikat ist, das Replikat aber die tatsächlicheLSN, an der sich der Slot auf dem Primärserver befindet, noch nicht wiedergegeben hat. -
Ausführung von
CHECKPOINTnach einer Hochstufung sicherstellen (Alexander Kukushkin)Es konnte vorkommen, dass die Checkpoint-Aufgabe beim Herabstufen nicht zurückgesetzt wurde, weil
CHECKPOINTnoch nicht abgeschlossen war. Dadurch wurde beim Auslösen der nächsten Hochstufung ein veraltetesresultverwendet. -
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 threadund zu einem erneuten Start der Offline-Herabstufung. -
Wert von
data_dirvor dem Umbenennen des Datenverzeichnisses nach fehlgeschlagener Initialisierung normalisieren (Waynerv)Ein abschließender Schrägstrich im Parameterwert
data_dirunterbricht dadurch nicht mehr das Umbenennen nach einer fehlgeschlagenen Initialisierung. -
Prüfen, ob
synchronous_standby_namesden erwarteten Wert enthält (Alexander Kukushkin)Der Zustandsautomat für synchrone Replikation ohne Quorum prüfte zuvor den tatsächlichen Wert von
synchronous_standby_namesnicht. Dies führte dazu, dass ein veralteter Wert vonsynchronous_standby_namesverwendet wurde, wennpg_stat_replicationeine Teilmenge vonsynchronous_standby_nameswar.
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
tocvonpyinstallerfehlt, wird auf das standardmäßigeiter_moduleszurückgegriffen. -
Probleme bei der Unterstützung von PostgreSQL 9.5 behoben (Alexander Kukushkin)
- Das Ausgabeformat von
pg_rewindwird korrekt behandelt. - Es wird berücksichtigt, dass das Format von
synchronous_standby_nameskeine Angabe von „num“ unterstützt.
- Das Ausgabeformat von
-
Kompatibilität mit den neuesten Änderungen in
urlparse(Alexander Kukushkin)urlparseakzeptiert keine URLs mit mehreren Hosts und den Zeichen[]mehr. Um das Problem zu umgehen, werden nach Möglichkeit die nativen Wrapper vonPQconninfoParse()auslibpqverwendet. Die eigene Implementierung wird nur noch für älterepsycopg2-Versionen genutzt, die gegen eine veraltetelibpq-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> --pendingalle 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/barmanoder ähnliche Programme weiterliefen. -
Clusternamen mit Schrägstrich in
patronictl edit-configkorrekt behandelt (Antoni Mur)Ein Schrägstrich in
cluster_namewird durch einen Unterstrich ersetzt. -
Zu frühes Löschen physischer Slots vermieden (Alexander Kukushkin)
Nach einem Failover wird das Entfernen physischer Replikationsslots mit
xminaufgeschoben: 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_controldataauftreten 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
/memberdes 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.
QuorumStateResolverbehandelte 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-consulhinzugefügt (Alexander Kukushkin)Das Modul
python-consulwird seit Langem nicht mehr gepflegt;py-consulist der offizielle Ersatz. Die Rückwärtskompatibilität mit python-consul bleibt erhalten. -
Kompatibilität mit dem Modul
prettytable>=3.12.0hinzugefü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.txteingeschränkt und ein Kompatibilitätstest für die neueste Version eingeführt.
Fehlerbehebungen
-
Callback
on_role_changenach fehlgeschlagener Recovery des Primärservers ausgeführt (Polina Bungina, Alexander Kukushkin)on_role_changewird 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 -Wbehoben (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
-
pgauditbei der Benutzererstellung deaktiviert, damit Passwörter nicht offengelegt werden (kviset)Bei aktivierter Erweiterung
pgauditprotokollierte Patroni bei der Erstellung die Passwörter fürsuperuser,replicationundrewind. -
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_locationaus dem Schlüssel/membersverwendet, statt die Slot-Position eines Mitglieds aus/statuszu 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-configgeprü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
sslnegotiationunterstützt (Alexander Kukushkin)sslnegotiationwurde 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
xminmehr 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 Grundhot_standby_feedbackaktiviert und wird der Primärserver zum Replikat herabgestuft, wird derNOT NULL-Wert vonxminder nun inaktiven Slots an den neuen Primärserver zurückgemeldet. Dadurch rückt derxmin-Horizont nicht vor und vacuum kann tote Tupel nicht entfernen. Mit dieser Korrektur erstellt Patroni physische Replikationsslots neu, die inaktiv sein sollten, aber einenNOT NULL-Wert fürxminbesitzen. -
Unbehandelten
DCSErrorwährend der Startphase behoben (Waynerv)Vor der Prüfung auf Eindeutigkeit des Knotennamens wird die Verbindung zum DCS sichergestellt.
-
GUCs aus
CMDLINE_OPTIONSbeim Abfragen vonpg_settingsausdrü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_namesbehoben (Alexander Kukushkin)Laut PostgreSQL-Dokumentation müssen die Schlüsselwörter
ANYundFIRSTin doppelte Anführungszeichen gesetzt werden. Patroni tat dies zuvor nicht. -
Überschreitung des Wertebereichs für Verbindungs-Keepalives behoben (hadizamani021)
Der anhand von
ttlberechnete Wert der Optionkeepaliveü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
nameGroßbuchstaben oder Sonderzeichen enthielt.
Version 4.0.0
Veröffentlicht am 2024-08-29
- 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
rolestandardmäßig aufprimary. Um das bisherige Verhalten beizubehalten und Ausfallzeiten oder langwierige, komplexe Migrationen zu vermeiden, können die Parameterkubernetes.leader_label_valueundkubernetes.standby_leader_label_valueaufmastergesetzt werden. Weitere Informationen finden sich hier . - Die Patroni-Rolle wird als
primarystatt alsmasterin den DCS geschrieben. - Die von der Patroni-REST-API zurückgegebene Rolle wurde von
masterinprimarygeändert. - Die Patroni-REST-API akzeptiert
role=masterin Anfragen an die Endpunkte/switchover,/failoverund/restartnicht mehr. - Der REST-API-Endpunkt
/metricsmeldet die Metrikpatroni_masternicht mehr. - patronictl
akzeptiert die Option
--masterfür keinen Befehl mehr. Stattdessen sollten--leaderoder--primaryverwendet werden. - Die Option
no_masterin der deklarativen Konfiguration benutzerdefinierter Methoden zur Replikaterstellung wird nicht mehr als besondere Option behandelt; verwenden Sie stattdessenno_leader. - Das Skript
patroni_wale_restoreakzeptiert die Option--no_masternicht mehr. - Das Skript
patroni_barmanakzeptiert die Option--role=masternicht mehr. - Allen Callback-Skripten wird bei der Ausführung die Option
role=primarystattrole=masterübergeben.
- Auf Kubernetes setzt Patroni das Label
patronictl failoverakzeptiert die seit Patroni 3.2.0 veraltete Option--leadernicht mehr.- Die seit Patroni 3.2.0 veraltete Funktion zur Benutzererstellung im Konfigurationsabschnitt
bootstrap.userswurde 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_noderegistriert (Alexander Kukushkin)Patroni verwaltet jetzt in
pg_dist_nodedie Liste der Knoten mitrole==replica,state==runningund ohne den Tagnoloadbalance. -
Aufbewahrungsdauer der Replikationsslots von Mitgliedern konfigurierbar gemacht (Alexander Kukushkin)
Der globale Konfigurationsparameter
member_slots_ttlwird 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
umaskgesetzt. -
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
dbnameinprimary_conninfo, da dies für die Synchronisierung logischer Replikationsslots erforderlich ist. -
Option
--ignore-listen-portfür die Validierung der Patroni-Konfiguration implementiert (Sahil Naphade)Bei der Ausführung von
patroni --validate-configkönnen bereits belegte Ports ignoriert werden.
Verbesserungen
-
wal_log_hintskonfigurierbar gemacht (Paul_Kim)Damit lässt sich der Mehraufwand durch aktiviertes
wal_log_hintsvermeiden, wennuse_pg_rewindaufoffgesetzt ist. -
Befehl
pg_basebackupauf StufeDEBUGprotokolliert (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 /failsafeum derenxlog_locationergänzt. -
Auswahl des aktuellen Knotens als synchronen Knoten verhindert (Alexander Kukushkin)
Es kann „etwas“ vom aktuellen Primärserver streamen, dessen
application_namedem 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_membersbei POST /failsafe ignoriert (Alexander Kukushkin) -
Validierung von GUCs verbessert (Polina Bungina)
Wegen der zusätzlichen Validierung durch
postgres --describe-configkonnten 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
localhostzur Datei.pgpasshinzugefügt (Alexander Kukushkin)Patroni ergänzt
.pgpassum eine weitere Zeile, wenn der angegebene Parameterhostmit/beginnt. Damit wird der Sonderfall abgedeckt, dasshostdem 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_namesauf 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.LogRecordwird 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_namesund synchrone Replikation funktionieren nur auf einem tatsächlichen Primärserver. Bei kaskadierender Replikation werden sie von Postgres schlicht ignoriert. Vor dieser Korrektur meldetenpatronictl listundGET /clustermanche Knoten fälschlich als synchron. -
Verfügbarkeit der GUC
allow_in_place_tablespaceskorrigiert (Polina Bungina)allow_in_place_tablespaceswurde nicht nur PostgreSQL 15 hinzugefügt, sondern auch auf PostgreSQL 10-14 zurückportiert.
Version 3.3.0
Veröffentlicht am 2024-04-04
Alle älteren Patroni-Versionen sind mit ydiff>=1.3 inkompatibel.
Folgende Möglichkeiten stehen zur „Behebung“ des Problems zur Verfügung:
- Patroni auf die neueste Version aktualisieren
- Nach der Installation von Patroni
ydiff<1.3installieren - Das Modul
cdiffinstallieren
Neue Funktionen
-
Übergabe von
auth_dataan 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
Barmanhinzugefügt (Israel Barth Rubio)Die Anwendung
patroni_barmanermöglicht die entfernte Ausführung vonBarman-Operationen. Sie kann als benutzerdefinierte Bootstrap- oder Replikaterstellungsmethode oder als Callbackon_role_changeverwendet werden. Weitere Informationen finden sich hier . -
Protokollformat
JSONunterstützt (alisalemmi)Neben
plain, dem Standard, unterstützt Patroni jetzt das Protokollformatjson. Dafür muss die Bibliothekpython-json-logger>=2.0.2installiert sein. -
Informationen zu
pending_restart_reasonangezeigt (Polina Bungina)Erweiterte Informationen zu den PostgreSQL-Parametern werden bereitgestellt, die das Setzen des Kennzeichens
pending_restartverursacht haben. Sowohlpatronictl listals auch der REST-API-Endpunkt/patronizeigen jetzt die Parameternamen und deren Unterschiede alspending_restart_reasonan. -
Tag
nostreamimplementiert (Grigory Smolkin)Wenn
nostreamauftruegesetzt ist, verwendet der Knoten nicht das Replikationsprotokoll zum Streamen von WAL, sondern die Archiv-Recovery, sofernrestore_commandkonfiguriert 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
logimplementiert (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_controldataund der globalen Patroni-Konfiguration protokolliert.
Fehlerbehebungen
-
Nicht zulässige Optionen von
pg_basebackupkorrekt herausgefiltert (Israel Barth Rubio)Aufgrund eines Fehlers filterte Patroni unzulässige Optionen für die Replikat-Bootstrap-Methode
basebackupnicht korrekt heraus, wenn sie im Format- setting: valueangegeben 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
importlibverwendet, um Dateien mit verfügbaren Konfigurationsparametern zu finden, ab Python 3.9+. Diese Implementierung ist stabiler und beeinträchtigt keine Patroni-Distributionen auf Basis vonzip-Archiven. -
target_session_attrsnur bei mehreren Hosts im Abschnitt standby_cluster verwendet (Alexander Kukushkin)target_session_attrs=read-writewird auf dem Standby-Leader nur noch dann zuprimary_conninfohinzugefügt, wennstandby_cluster.hostmehrere durch Kommas getrennte Hosts enthält. -
Kompatibilitätscode für Version 1.3+ der Bibliothek
ydiffhinzugefü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
ModifyIndexfü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_restartzurü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_bootstraperstellt werden, wenn weitere Abhängigkeiten zur Citus-Datenbank hinzugefügt werden müssen. -
Widersprüchlichen Tag
nofailovernicht 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 TagnofailoverVorrang haben sollte. -
Problem mit durch PyInstaller eingefrorenen Anwendungen behoben (Sophia Ruan)
freeze_support()wurde nachargparseaufgerufen, 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
portin einer internen Struktur. -
Korrekturen am Kennzeichen
pending_restart(Polina Bungina)pending_restartwird während eines benutzerdefinierten Bootstraps mitrecovery_target_action = promotenicht bereitgestellt. Dasselbe gilt, wenn jemandhot_standbyoderwal_log_hintsetwa überALTER SYSTEMgeändert hat.
Version 3.2.1
Veröffentlicht am 2023-11-30
Fehlerbehebungen
-
Zulässige Werte des Arguments
--formatin 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_rewindausfü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-proxygeleitet 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_rewindmit Postgres v16+ korrigiert (Alexander Kukushkin)In v16 änderte sich das Format der Fehlermeldung von
pg_waldump, sodass Patronipg_rewindauch 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
unknownzurückgegeben werden, weil Verbindungen nicht korrekt geschlossen worden waren. -
Ausgabe von
postgres --describe-configzwischengespeichert (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.userswird in Version 4.0.0 entfernt. Falls nach der Bereitstellung eines neuen Clusters Benutzer erstellt werden müssen, verwenden Sie dazu den Hookbootstrap.post_bootstrap.
Inkompatible Änderungen
-
Regel
loop_wait + 2*retry_timeout <= ttlerzwungen 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_prioritykann ein Knoten jetzt bei der Leader-Wahl bevorzugt werden. Weitere Einzelheiten enthält die Dokumentation zu Tags (ref tags). -
patroni --generate-config [--dsn DSN]undpatroni --generate-sample-configimplementiert (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
namedes Knotens ergänzt (sskserk)Beim Überwachungsendpunkt wird
namenebenscopehinzugefügt; beim Metrikendpunkt wirdnamein 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_lsnder Slots mitpg_replication_slot_advance()vorgerückt. -
Angabe des Namespace über das Argument
--dcsin 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
commandangehängt werden; jetzt lassen sie sich als Mapping angeben.
Verbesserungen
-
GUC
citus.local_hostnamewird 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
localhostverwendet, 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_reloadbehandelt (Alexander Kukushkin)Andernfalls entsteht ein Zombie-Prozess, der erst bei der nächsten Ausführung von
on_reloadaufgeräumt wird. -
Fehler
AuthOldRevisionbei 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_sizebehoben (Alexander Kukushkin)Die GUC
wal_keep_sizebesitzt normalerweise eine Einheit; Patroni konnte ihren Wert nicht inintumwandeln. Dadurch wurde anschließend der Wert vonbootstrap.dcsnicht in den Schlüssel/configgeschrieben. -
Inkonsistenzen zwischen dem Schlüssel
/syncundsynchronous_standby_nameserkannt und behoben (Alexander Kukushkin)Normalerweise aktualisiert Patroni
/syncundsynchronous_standby_namesin einer genau festgelegten Reihenfolge. Bei einem Fehler oder wenn jemandsynchronous_standby_namesmanuell 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_namesauspostgresql.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
urllib3Meldungen der StufeWARNING.
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
PGDATAzugreifen 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
0behoben (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 --helpvermieden (Israel Barth Rubio)Das Modul
clickbenötigt dafür einen besonderen Hinweis. -
Fehler bei
kubernetes.standby_leader_label_valuebehoben (Alexander Kukushkin)Diese Funktion hatte tatsächlich nie funktioniert.
-
Systemkennung des Clusters wieder in der Ausgabe von
patronictl listangezeigt (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_optimein 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_conninfogeändert hätten. -
Fehler im Befehl
patronictl querybehoben (Israel Barth Rubio)Der Befehl funktionierte nicht, wenn nur
-moder keines der Argumente-rund-mangegeben 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_transactionsfür Citus-Cluster anhand vonmax_connectionsfalsch berechnet. -
Bei der Entscheidung über
pg_rewindnicht aufpg_stat_wal_receiververtraut (Alexander Kukushkin)Der von
pg_stat_wal_receivergemeldete Wertreceived_tlikonnte der tatsächlich wiedergegebenen Timeline voraus sein. Dagegen ist die vonIDENTIFY_SYSTEMüber die Replikationsverbindung gemeldete Timeline immer korrekt.
Version 3.1.0
Veröffentlicht am 2023-08-03
Inkompatible Änderungen
-
Bedeutung von
restapi.keyfileundrestapi.certfilegeändert (Alexander Kukushkin)Zuvor verwendete Patroni
restapi.keyfileundrestapi.certfileersatzweise als Client-Zertifikate, wenn die entsprechenden Konfigurationsparameter im Abschnittctlfehlten.
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_valueundkubernetes.standby_leader_label_valueangepasst werden. Diese Funktion wird beim Wechsel von der Rollemasterzuprimarysehr 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,restapiund 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
/statusvermieden (Alexander Kukushkin)Wenn keine permanenten logischen Slots vorhanden waren, aktualisierte Patroni
/statusbei 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_slotsodermax_worker_processesfehlschlug, verwendete Patroni einen geeigneten Standardwert. Zusätzlich wird jetzt eine Warnung ausgegeben. -
Berechtigungen für in
PGDATAerstellte 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
PGDATAund setzt die Berechtigungen aller innerhalb vonPGDATAerstellten Dateien und Verzeichnisse korrekt.
Fehlerbehebungen
-
archive_commandüber eine Shell ausgeführt (Waynerv)Patroni kann vor einer Crash-Recovery im Einzelbenutzermodus oder vor
pg_rewindeinige 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 listkorrigiert (Alexander Kukushkin)Das Feld für den Clusternamen fehlte in den Ausgabeformaten
tsv,jsonundyaml. -
Verhalten von
pg_rewindnach 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_rewindwieder 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_revisionaufgrund 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_conninfounverä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 istrestore_commandgesetzt, wirdin archive recoverygemeldet. Der Zustand ist in den Schlüsselnmemberim DCS, in der REST API und in der Ausgabe vonpatronictl listsichtbar.
Verbesserungen
-
Fehlermeldungen mit etcd v3 verbessert (Alexander Kukushkin)
War ein etcd-v3-Cluster nicht erreichbar, meldete Patroni, dass es auf die Endpunkte
/v2nicht 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_connectionskorrigiert (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 mitsynchronous_commit=offausgeführt, damit es bei aktiviertemsynchronous_mode_strictnicht 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_sizehinzugefü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.
-
initdbbeim Bootstrap eines neuen Clusters direkt aufgerufen (Matt Baker)Zuvor wurde es über
pg_ctlaufgerufen, was eine besondere Behandlung der Anführungszeichen für die aninitdbübergebenen Parameter erforderte. -
Hook vor dem Stoppen hinzugefügt (Le Duane)
Der Hook kann über
postgresql.before_stopkonfiguriert werden und wird unmittelbar vorpg_ctl stopausgefü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 UmgebungsvariablenPATRONI_POSTGRESQL_BIN_*konfigurieren.
Verbesserungen
-
Verschiedene Verbesserungen an
patroni --validate-config(Polina Bungina)bootstrap.initdbist nun optional. Es ist nur für neue Cluster erforderlich, dochpatroni --validate-configbeanstandete bisher sein Fehlen in der Konfiguration.- Bei leerem oder nicht gesetztem
postgresql.bin_dirwird kein Fehler ausgelöst. Stattdessen wird zunächst im standardmäßigen PATH nach Postgres-Programmen gesucht. - Der Abschnitt
postgresql.authentication.rewindist nun optional. Fehlt er, verwendet Patroni den Superuser.
-
Fehlermeldungen in patronictl verbessert (Israel Barth Rubio)
Das Symbol
\nwurde 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-urlvon patronictl zugelassen (Israel Barth Rubio)Der Versuch, über die Option
--dcs-urlvon patronictl eineetcd3-URL zu übergeben, führte zu einer Ausnahme.
Version 3.0.2
Veröffentlicht am 2023-03-24
Version 3.0.2 stellt die Unterstützung für Python-Versionen vor 3.6 ein.
Neue Funktionen
-
Status synchroner Standby-Replikate zum Endpunkt
/metricshinzugefügt (Thomas von Dein, Alexander Kukushkin)Zuvor wurden nur
primary/standby_leader/replicagemeldet. -
Benutzerfreundliche Behandlung von
PAGERin patronictl (Israel Barth Rubio)Der Pager kann über die Umgebungsvariable
PAGERkonfiguriert werden, die die Standardprogrammelessundmoreüberschreibt. -
HTTP-Statuscodes für wiederholbare K8s-Anfragen konfigurierbar gemacht (Alexander Kukushkin)
Auf manchen verwalteten Plattformen kann der Statuscode
401 Unauthorizedauftreten; das Problem behebt sich bisweilen nach einigen Wiederholungsversuchen.
Verbesserungen
-
hot_standbywird während eines benutzerdefinierten Bootstraps nur aufoffgesetzt, wennrecovery_target_actionaufpromotegesetzt ist (Alexander Kukushkin)Dies war erforderlich, damit
recovery_target_action=pausekorrekt funktioniert. -
Verhindert, dass der Callback
on_reloadandere Callbacks beendet (Alexander Kukushkin)on_start/on_stop/on_role_changedienen üblicherweise zum Hinzufügen und Entfernen einer virtuellen IP.on_reloadsollte diese nicht beeinträchtigen. -
AWS-Callback-Beispielskript auf
IMDSFetcherumgestellt (Polina Bungina)IMDSv2benötigt ein Token;IMDSFetcherkümmert sich transparent darum.
Fehlerbehebungen
-
patronictl switchoverfür einen Citus-Cluster auf Kubernetes korrigiert (Lukáš Lalinský)Der Befehl funktionierte für andere Namespaces als
defaultnicht. -
Bei unbekannter Hauptversion wird nicht in
PGDATAgeschrieben (Alexander Kukushkin)War
PGDATAunmittelbar nach dem Start leer, etwa weil es noch nicht eingehängt war, nahm Patroni eine falsche PostgreSQL-Version an und erstellte fälschlichrecovery.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 zucitus_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
promotedan ein Callback-Skripton_role_change. Der übergebene Rollenname wurde wieder aufmastergeä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.
-
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_nameshinzugefügt, wird er im DCS erst dann als synchron eingetragen, wenn er nebenpg_stat_replication.sync_state = 'sync'auch zum Primärserver aufgeholt hat.
Entfernte Funktionen
-
patronictl scaffoldentfernt (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
amd64undx86_64wurden entfernt;libnss_files.so.*wird nicht entfernt.
Sicherheitsverbesserungen
-
search_path=pg_catalogfü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
publicgeschützt werden, die denselben Namen und dieselbe Signatur wie entsprechende Objekte inpg_cataloghaben. Dazu wirdsearch_path=pg_catalogfür alle von Patroni erstellten Verbindungen außer Replikationsverbindungen erzwungen. -
Aufzeichnung von Passwörtern in
pg_stat_statementsverhindert (Feike Steenbergen)Dazu wird beim Anlegen von Benutzern
pg_stat_statements.track_utility=offgesetzt.
Fehlerbehebungen
-
proxy_addressals optional deklariert (Denis Laxalde)Die Option ist tatsächlich nicht erforderlich.
-
Verhalten der Option insecure verbessert (Alexander Kukushkin)
Die Option
insecurevon 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)
.exewird 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.0verwendet, 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 configureentfernt (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-configverbessert (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
HEADfür Überwachungsendpunkte unterstützt (Robert Cutajar)Wird sie anstelle von
GETverwendet, gibt Patroni nur den HTTP-Statuscode zurück. -
behave-Tests unter Windows unterstützt (Alexander Kukushkin)
Der neue REST-API-Endpunkt
POST /sigtermermöglicht es, ein geordnetes Herunterfahren von Patroni (SIGTERM) unter Windows nachzubilden. -
postgresql.proxy_addresseingeführt (Alexander Kukushkin)Der Wert wird als
proxy_urlin 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_rewindauf 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_rewindkonnte diese Dateien vom alten Primärserver entfernen, sodass dieser nicht mehr als Standby gestartet werden konnte. Das Archivieren von WAL-Dateien im Zustandreadyverringert dieses Risiko und verbessert die kontinuierliche Archivierung insgesamt. -
Fehler
403beim 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
ttloder auf einem Replikat länger als2*ttllä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 AusnahmenTypeErrorundIOErrorauslösen, wennselect()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-syncbehoben (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()jedochOSErroraus, wodurch die Heartbeat-Schleife unterbrochen wurde. -
master_stop_timeoutbeim 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ürpostgresql.listenzugelassen (Denis Laxalde)patroni --validate-configmeldete 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_rewindauf typischen Debian-/Ubuntu-Systemen verbessert (Gunnar “Nick” Bluth)Bei Postgres-Installationen mit
postgresql.confaußerhalb des Datenverzeichnisses (z. B. Ubuntu-/Debian-Pakete) kannpg_rewind --restore-target-walden Wert vonrestore_commandnicht ermitteln. -
TLSServerNamefür Consul-Service-Prüfungen einstellbar (Michael Gmelin)Dies ist nützlich, wenn Prüfungen über IP-Adressen erfolgen und der Consul-
node_namekein FQDN ist. -
Unterstützung für
ppc64leim Watchdog hinzugefügt (Jean-Michel Scheiwiler)Außerdem wurde die Watchdog-Unterstützung auf einigen Nicht-x86-Plattformen korrigiert.
-
Callback aws.py von
botoaufboto3umgestellt (Alexander Kukushkin)
boto2.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-synchinzugefü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
pluginoderdatabasepasst. 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.confaktualisieren 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 auspg_settingsabzufragen. -
IPv6-Adressen in
postgresql.listenbesser behandelt (Alexander Kukushkin)Da
listeneinen 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
replicationfür die Divergenzprüfung nur unter PostgreSQL v10 und älter verwendet (Alexander Kukushkin)Ist
rewindaktiviert, verwendet Patroni auf neueren Postgres-Versionen wieder entwedersuperuser- oderrewind-Zugangsdaten.
Fehlerbehebungen
-
Fehlenden Import von
dateutil.parserergänzt (Wesley Mendes)Die Tests schlugen nur deshalb nicht fehl, weil das Modul auch aus anderen Modulen importiert wurde.
-
Sichergestellt, dass die Annotation
optimeeine Zeichenfolge ist (Sebastian Hasler)In bestimmten Fällen versuchte Patroni, sie als Zahl zu übergeben.
-
Fehlgeschlagene Versuche mit
pg_rewindbesser behandelt (Alexander Kukushkin)Wird der Primärserver während
pg_rewindunerreichbar, bleibt$PGDATAin einem beschädigten Zustand zurück. Anschließend entfernt Patroni das Datenverzeichnis, auch wenn die Konfiguration dies nicht erlaubt. -
Annotationen
slotswerden bei noch nicht bereitem PostgreSQL nicht aus der Leader-ConfigMapbzw. dem Leader-Endpointentfernt (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_passwordoder die UmgebungsvariablePATRONI_CTL_KEYFILE_PASSWORD. -
Weitere Metriken zum Endpunkt /metrics hinzugefügt (Alexandre Pereira)
Konkret sind dies
patroni_pending_restartundpatroni_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
libpqseit PostgreSQL v10 unterstützt. Dazu setzenprimary_conninfoauf dem Standby-Leader undpg_rewinddie Optiontarget_session_attrs=read-writein der Verbindungszeichenfolge. Die Dateipgpasswird mit mehreren Zeilen erzeugt, einer pro Host. StattCHECKPOINTauf den Knoten des Primärclusters aufzurufen, wartet der Standby-Cluster darauf, dasspg_controlaktualisiert wird.
Stabilitätsverbesserungen
-
Kompatibilität mit älterem
psycopg2(Alexander Kukushkin)Beispielsweise enthält das über Ubuntu-18.04-Pakete installierte
psycopg2die AusnahmeUndefinedFilenoch 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_timelinesgesetzt ist, aber keinerewind_credentialsdefiniert 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 Methodecursor.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_timelinesgesetzt, 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
psycopg2bevorzugt.psycopg>=3.0wird nur verwendet, wennpsycopg2fehlt oder zu alt ist. -
Feld
dcs_last_seenzur 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_commandzu beheben, entfernt Patroni den Leader-Schlüssel, sobaldpg_controldataPGDATA als saubershut downmeldet 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
sslcrldirunterstü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_aclsveranlasst 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überno action. I am ({0}), a secondary -
wal_keep_segmentsbei der Umrechnung inwal_keep_sizein eine Ganzzahl umgewandelt (Jorge Solórzano)wal_keep_segmentskann 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 in100100100100100100100100100100100100100100100100MBumgewandelt. -
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_timeoutkonnte 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 zwischengespeicherterole, 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)
CHECKPOINTwird vermieden, wenn die neueste Zeitleiste bereits inpg_controlgespeichert ist. Dadurch entfällt ein unnötigerCHECKPOINTunmittelbar nach der Initialisierung eines neuen Clusters mitinitdb. -
Mitglieder ohne
nofailoverbei der Wahl synchroner Knoten bevorzugt (Alexander Kukushkin)Zuvor wurden synchrone Knoten allein anhand des Replikationsrückstands gewählt. Ein Knoten mit dem Tag
nofailoverhatte 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_basebackupeinen 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 Sichtpg_replication_slotsalle 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 wachsendenpg_walund zu Bloat inpg_catalogführte. -
/statuswurde bei einer Herabstufung nicht aktualisiert (Alexander Kukushkin)Nach der Herabstufung von PostgreSQL aktualisiert der alte Leader die letzte LSN im DCS. Mit
2.1.0wurde der neue Schlüssel/statuseingeführt, die optime wurde jedoch weiterhin nach/optime/leadergeschrieben. -
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_replfunktionierte in einigen Fällen nicht (Alexander Kukushkin)Insbesondere betraf dies Fälle ohne gesetztes
postgresql.unix_socket_directories. Patroni sollte dann den Standardwert vonlibpqverwenden. -
Mehrere Probleme mit der REST-API von Patroni behoben (Alexander Kukushkin)
clusters_unlockedwar manchmal nicht definiert, wodurch Ausnahmen im EndpunktGET /metricsentstanden. Außerdem nahm die Fehlerbehandlung an, dass das Tupelconnect_addressstets 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 historyerhä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 eigenenkubernetes.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_proxiesnicht 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_replicationNULL-Werte inreplay_lsn,flush_lsnoderwrite_lsnenthalten, selbst wennstate = '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 listund in der REST-API und lassen sich nun auch in Health Checks verwenden. -
Prometheus-Endpunkt
/metricshinzugefügt (Mark Mercado, Michael Banck)Der Endpunkt stellt dieselben Metriken wie
/patronibereit. -
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 slotsfunktioniert 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
/leaderliefert 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
/leadergeä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
PySyncObjwar die Verschlüsselungsunterstützung sehr instabil. -
DNS-Probleme in der Raft-Implementierung behandelt (Alexander Kukushkin)
Wurden
self_addrund/oderpartner_addrsüber DNS-Namen statt IP-Adressen konfiguriert, löstePySyncObjsie 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
psycopg2wirdautocommit = Trueim Blockwith connectionignoriert, 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=offgestartet 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
kazooangewiesen, 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,/v3betaoder/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.ciphersoder die UmgebungsvariablePATRONI_RESTAPI_CIPHERS. -
Verschlüsselte TLS-Schlüssel für die REST-API unterstützt (Jonathan S. Katz)
Die Konfiguration erfolgt über
restapi.keyfile_passwordoder die UmgebungsvariablePATRONI_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_syncnodegesteuert.
Stabilitätsverbesserungen
-
Postgres wird beim benutzerdefinierten Bootstrap mit
hot_standby = offgestartet (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-consul2ergänzt (Alexander Kukushkin, Wilfried Roset)Das bewährte
python-consulwird seit einigen Jahren nicht mehr gepflegt. Deshalb entstand ein Fork mit neuen Funktionen und Fehlerbehebungen. -
bypass_api_servicewird 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 ignoriertbypass_api_service. Bei patronictl war diese Warnung störend. -
raft.data_dirwird 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
srcunddstvertauscht waren. -
Fehler in post_bootstrap() behoben (Alexander Kukushkin)
War kein Superuser-Passwort konfiguriert, konnte Patroni das Skript
post_initnicht aufrufen, wodurch der gesamte Bootstrap fehlschlug. -
Problem mit pg_rewind im Standby-Cluster behoben (Alexander Kukushkin)
Wenn der Superuser-Name von
postgresabwich, schlugpg_rewindim 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_ENDPOINTSals booleschen Wert behandelt (Alexander Kukushkin)Ohne diese Behandlung ließ sich
kubernetes.use_endpointsnicht ü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
-
moreals Pager inpatronictl edit-configverwendet, wennlessfehlt (Pavel Golub)Unter Windows ist dies
more.com. Außerdem wurde inrequirements.txtcdiffdurchydiffersetzt; patronictl unterstützt aus Kompatibilitätsgründen weiterhin beide. -
bind_addrundpasswordfürraftunterstützt (Alexander Kukushkin)raft.bind_addrkann beim Betrieb hinter NAT nützlich sein.raft.passwordaktiviert die Verschlüsselung des Datenverkehrs und erfordert das Modulcryptography. -
Verbindungsparameter
sslpasswordunterstützt (Kostiantyn Nemchenko)Dieser Parameter wurde mit PostgreSQL 13 eingeführt.
Stabilitätsverbesserungen
-
Verhalten im pausierten Modus geändert (Alexander Kukushkin)
- Patroni ruft die Methode
bootstrapnicht auf, wenn das VerzeichnisPGDATAfehlt oder leer ist. - Patroni beendet sich bei abweichender sysid im pausierten Modus nicht, sondern protokolliert nur eine Warnung.
- 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.
- Patroni ruft die Methode
-
master_start_timeoutbei 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_timeoutSekunden nicht beendet, bricht Patroni sie zwangsweise ab und gibt die Leader-Sperre frei. -
Extra
secureaus denurllib3-Abhängigkeiten entfernt (Alexander Kukushkin)Der einzige Grund für die ursprüngliche Aufnahme war die Abhängigkeit von
ipaddressfü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_addrzupartner_addrshinzugefügt werden. -
Fehler in
get_guc_value()behoben (Alexander Kukushkin)Patroni konnte unter PostgreSQL 12 den Wert von
restore_commandnicht ermitteln, sodass das Nachladen fehlender WAL-Dateien fürpg_rewindnicht 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_reloadbei der Hochstufung zumstandby_leaderunter PostgreSQL 13+ (Alexander Kukushkin)Bei der Hochstufung zum
standby_leaderwirdprimary_conninfogeändert, die Rolle aktualisiert und Postgres neu geladen. Da sichon_role_changeundon_reloadpraktisch doppeln, ruft Patroni nuron_role_changeauf. -
Verbindungsparameter
gssencmodeundchannel_bindingunterstützt (Alexander Kukushkin)PostgreSQL 12 führte
gssencmodeund PostgreSQL 13channel_bindingein. Diese Verbindungsparameter können nun verwendet werden, wenn sie im Abschnittpostgresql.authenticationdefiniert sind. -
Umbenennung von
wal_keep_segmentsinwal_keep_sizeberücksichtigt (Alexander Kukushkin)Bei einer Fehlkonfiguration (
wal_keep_segmentsunter 13 oderwal_keep_sizeunter älteren Versionen) passt Patroni die Konfiguration automatisch an. -
pg_rewindunter 13 nach Möglichkeit mit--restore-target-walverwendet (Alexander Kukushkin)Unter PostgreSQL 13 prüft Patroni, ob
restore_commandkonfiguriert ist, und weistpg_rewindan, es zu verwenden.
Neue Funktionen
-
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_controllerbenötigt. Weitere Informationen stehen in der Dokumentation . -
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
etcd3angelegt 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 gleichoffhat er keine Wirkung. -
Optionaler Aufruf des Skripts
pre_promotehinzugefügt (Sergey Dudoladov)Anders als Callbacks wird
pre_promotesynchron 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_waitSekunden länger als nötig warten. -
Sicht
pg_stat_wal_receiverunter 9.6+ verwendet (Alexander Kukushkin)Die Sicht enthält aktuelle Werte für
primary_conninfoundprimary_slot_name, während der Inhalt vonrecovery.confveraltet 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_tagshinzugefü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.0erforderlich. -
Option
no_paramsfür benutzerdefinierte Bootstrap-Methoden implementiert (Kostiantyn Nemchenko)Damit können
wal-g,pgBackRestund andere Backup-Werkzeuge ohne umschließende Shellskripte aufgerufen werden. -
WAL und Tablespaces nach fehlgeschlagener Initialisierung verschoben (Feike Steenbergen)
Bei
reinitentfernte Patroni bereits nebenPGDATAauch das über einen symbolischen Link eingebundene WAL-Verzeichnis und die Tablespaces. Nun führtmove_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_waldumpverwendet und dessen Ausgabe ausgewertet. -
Das Nachladen fehlender WAL-Dateien wird versucht, wenn
pg_rewindsie meldet (Alexander Kukushkin)Ein von
pg_rewindbenötigtes WAL-Segment kann bereits auspg_walverschwunden sein. Dann kannpg_rewinddie Checkpoint-Position vor dem Divergenzpunkt nicht finden. Seit PostgreSQL 13 kannpg_rewindfehlende WAL-Dateien überrestore_commandnachladen. Bei älteren PostgreSQL-Versionen wertet Patroni die Fehler eines fehlgeschlagenen Rewind-Versuchs aus und versucht selbst, die fehlende WAL-Datei überrestore_commandabzurufen. -
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_leaderregelmäßig, ob neue History-Dateien inpg_walvorhanden sind. -
Ausgabe des Verlaufsprotokolls gekürzt und übersichtlicher gestaltet (Alexander Kukushkin)
Bei der Prüfung, ob
pg_rewinderforderlich 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 vonkube-proxybehandelt, das je nach Konfiguration ein Userspace-Programm oderiptableszur 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
ttlaufttl + loop_wait. -
referencesundnodenamein 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.configden WertNonehat. 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_conninfound 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-authin 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
CRLFnach den HTTP-Headern einerOPTIONS-Anfrage geschrieben (Sergey Burladyan)HAProxy kam mit einem einzelnen
CRLFzurecht, während der Consul-Health-Check eine unterbrochene Verbindung und ein unerwartetes EOF meldete. -
GET /clusterzeigte 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-leaderantwortete für einen Primärserver undGET /masterfür einenstandby_leaderfälschlich mit 200. -
DELETE /switchoverimplementiert (Alexander Kukushkin)Der REST-API-Aufruf löscht ein geplantes Switchover.
-
Endpunkte
/readinessund/livenesserstellt (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 /replicaundGET /asyncerweitert (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 alleloop_waitSekunden 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_urleines 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 switchoverimplementiert (Alexander Kukushkin)Bisher konnte
patronictl flushnur geplante Neustarts abbrechen.
Fehlerbehebungen
-
Attributfehler beim Cluster-Bootstrap mit vorhandenem PGDATA (Krishna Sarabu)
Beim Anlegen oder Aktualisieren von
/historygriff Patroni auf ein ObjektClusterConfigzu, 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=localfür das Skriptpost_initerzwungen (Alexander Kukushkin)Beim Anlegen der Benutzer (
replication,rewind) tat Patroni dies bereits; beipost_initwar es übersehen worden. Setzte das Skript den Wert nicht selbst, konnte die Initialisierung im synchronous_mode nicht abgeschlossen werden. -
maxsizeim Consul-Pool-Manager erhöht (ponvenkates)Der Standardwert
size=1erzeugte 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 inpgpassgeschrieben (Alexander Kukushkin)War etwa
standby_cluster.portnicht angegeben, wurde die Dateipgpassfehlerhaft erzeugt. -
Erstellung eines physischen Replikationsslots für den Leader mit Sonderzeichen im Namen übersprungen (Krishna Sarabu)
Bei definierten
slotsschien 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.confbeim benutzerdefinierten Bootstrap vermieden (Krishna Sarabu)Patroni schlug fehl, wenn
pg_hba.confnach dem benutzerdefinierten Bootstrap außerhalb vonpgdatalag.
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
SIGKILLan den Postmaster, wenn das Stoppen länger als der mitmaster_stop_timeoutfestgelegte 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, hatmaster_stop_timeoutkeine 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
slotsauffü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.yamllä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
/historyim DCS. Mit der Zeit wird dieser Schlüssel groß, obwohl meist nur die letzten Zeilen von Interesse sind. Mitmax_timelines_historylä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.
-
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-afterzurü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
PGDATAund 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
CHECKPOINTausführen (Alexander Kukushkin)Dadurch verkürzt sich die Zeit, bis der neue Primärserver für
pg_rewindverwendbar 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- oderSRV-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
urllib3musscert_reqsausdrücklich aufssl.CERT_NONEgesetzt 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_changeauf 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.confden Wert vonrecovery_min_apply_delayinmsumrechnenWar
recovery_min_apply_delayunter 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
forkzuspawnfürmultiprocessingverloren.
Version 1.6.4
Veröffentlicht am 2020-01-27
Neue Funktionen
-
Option
--waitfürpatronictl reinitimplementieren (Igor Yanchenko)Mit der Option
--waitwartet Patronictl auf den Abschluss vonreinit. -
Weitere Verbesserungen der Windows-Unterstützung (Igor Yanchenko, Alexander Kukushkin)
- Alle für Integrationstests verwendeten Shell-Skripte wurden in Python neu geschrieben.
- Auf Nicht-POSIX-Systemen wird Postgres mit
pg_ctl killgestoppt. - Es wird nicht versucht, Unix-Domain-Sockets zu verwenden.
Stabilitätsverbesserungen
-
Sicherstellen, dass
unix_socket_directoriesundstats_temp_directoryexistieren (Igor Yanchenko)Beim Start von Patroni und Postgres wird geprüft, ob
unix_socket_directoriesundstats_temp_directoryexistieren, andernfalls wird versucht, sie anzulegen. Schlägt das Anlegen fehl, beendet sich Patroni. -
Sicherstellen, dass
postgresql.pgpassan einem Ort liegt, auf den Patroni Schreibzugriff hat (Igor Yanchenko)Ohne Schreibzugriff beendet sich Patroni mit einer Ausnahme.
-
Consul-Prüfung
serfHealthstandardmäß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 vonttlverloren, 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_statementundlog_min_error_statementvor dem Versuch, einen Benutzer zu erstellen oder zu aktualisieren, auf sichere Werte.
Fehlerbehebungen
-
Auf kaskadierenden Replikaten
restore_commandaus der Konfiguration standby_cluster verwenden (Alexander Kukushkin)Der
standby_leadertat 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_delayundrestore_command, wenn sie nicht in der Patroni-Konfiguration, sondern in anderen Dateien alspostgresql.auto.confoderpostgresql.conffestgelegt 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_rewindnicht offenlegen (Alexander Kukushkin)Der Fehler wurde mit #1301 eingeführt.
-
Verbindungsparameter aus
postgresql.authenticationaufpg_basebackupund 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 --versionimplementieren (Igor Yanchenko)Der Befehl gibt die aktuelle Patroni-Version aus und beendet sich.
-
HTTP-Header
user-agentfü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=DEBUGwerden Tracebacks nur angezeigt, wennlog.level=DEBUGgesetzt 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
requestsaus den expliziten Abhängigkeiten entfernen (Alexander Kukushkin)Es wurde für keine kritische Funktion verwendet, verursachte aber bei neuen Versionen von
urllib3zahlreiche Probleme. -
Behandlung von
etcd.hostsals 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_bufferskorrigieren (Alexander Kukushkin)In PostgreSQL 11 wurde die Basiseinheit von Blöcken mit 8 kB auf Bytes geändert.
-
passfileinprimary_conninfonur unter PostgreSQL 10+ verwenden (Alexander Kukushkin)Bei älteren Versionen ist die Funktion von
passfilenur gewährleistet, wenn die neueste Version vonlibpqinstalliert ist.
Version 1.6.1
Veröffentlicht am 2019-11-15
Neue Funktionen
-
Umgebungsvariable
PATRONICTL_CONFIG_FILEhinzufügen (msvechla)Damit lässt sich das Argument
--config-filefür patronictl über die Umgebung konfigurieren. -
patronictl historyimplementieren (Alexander Kukushkin)Der Befehl zeigt die Historie von Failover und Switchover.
-
Bei
pg_rewindden Wert-c statement_timeout=0inPGOPTIONSübergeben (Alexander Kukushkin)Dadurch wird verhindert, dass eine von pg_rewind ausgeführte Anweisung abgebrochen wird, weil
statement_timeoutauf 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
sslmodefür die Verbindung festgelegt werden. -
In
primary_conninfoanstelle des Passwortspassfileverwenden (Alexander Kukushkin)Dadurch müssen für postgresql.conf keine Berechtigungen von
600gesetzt werden. -
pg_ctl reloadunabhä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
postgresqlder 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 anprimary_conninfound 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_commandundrecovery_min_apply_delay. Diese Liste wird in künftigen Postgres-Versionen erweitert, und Patroni wird dies automatisch unterstützen. -
Änderung von
use_slotsim 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
initdbkann PGDATA als leer gelten, wenn es lediglichlost+foundund.dotfilesenthält. Patroni verhält sich nun ebenso. IstPGDATAnicht leer und aus Sicht vonpg_controldatazugleich 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 Dateiglobal/pg_controlin 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
spawnverwenden (Maciej Kowalczyk)In Python besteht ein bekanntes Problem beim Zusammenspiel von Threads und Multiprocessing. Der Wechsel von der Standardmethode
forkzuspawnwird als Umgehung empfohlen. Andernfalls kann der Prozess zum Starten des Postmasters hängen bleiben, und Patroni meldet endlosINFO: 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_clientmit dem Wertrequiredprüft Patroni Client-Zertifikate für alle REST-API-Aufrufe. Beioptionalwerden Client-Zertifikate für alle unsicheren REST-API-Endpunkte geprüft. -
Bei der Health-Check-Anfrage
GET /replicaden 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
/historyund/clusterimplementieren (Alexander Kukushkin)Der Endpunkt
/historyzeigt den Inhalt des Schlüsselshistoryim DCS. Der Endpunkt/clusterzeigt 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_timeoutzu nutzen. Dies konnte zur Herabstufung des Primärservers führen.
Fehlerbehebungen
-
synchronous_commitbeim Erteilen von Ausführungsrechten an den Benutzer fürpg_rewinddeaktivieren (kremius)Beim Bootstrap mit
synchronous_mode_strict: truewartete die AnweisungGRANT EXECUTEunbegrenzt, da keine synchronen Standby-Knoten verfügbar waren. -
Speicherleck unter Python 3.7 beheben (Alexander Kukushkin)
Patroni verwendet
ThreadingMixInzur 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 --forcedurch 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_namemit dem Wert insynchronous_standby_namesebenso 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
psycopg2in zwei Pakete aufgeteilt:psycopg2undpsycopg2-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.confmehr; alle bisherigen Recovery-Parameter wurden in GUCs umgewandelt. Zum Schutz vorALTER SYSTEM SET primary_conninfound ähnlichen Änderungen analysiert Patronipostgresql.auto.confund entfernt daraus alle Standby- und Recovery-Parameter. Die Patroni-Konfiguration bleibt abwärtskompatibel: Obwohlrestore_commandnun ein GUC ist, kann es weiterhin im Abschnittpostgresql.recovery_conf.restore_commandangegeben werden. Patroni schreibt es für PostgreSQL 12 inpostgresql.conf. -
pg_rewindohne Superuser unter PostgreSQL 11 und neuer ermöglichen (Alexander Kukushkin)Für diese Funktion müssen
usernameundpasswordim Abschnittpostgresql.authentication.rewindder Patroni-Konfigurationsdatei festgelegt werden. Bei einem bestehenden Cluster muss der Benutzer manuell erstellt und für einige Funktionen die BerechtigungGRANT EXECUTEerteilt werden. Weitere Einzelheiten finden sich in der PostgreSQL-Dokumentation . -
Tatsächliche und gewünschte Werte von
primary_conninfoauf 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 inapi_urlundconn_urlwurden 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.confverwalten (Alexander Kukushkin)Diese Funktion arbeitet ähnlich wie
pg_hba.conf: Istpostgresql.pg_identin der Konfigurationsdatei oder im DCS definiert, schreibt Patroni dessen Wert inpg_ident.conf. Ist jedochpostgresql.parameters.ident_filedefiniert, geht Patroni davon aus, dasspg_identextern verwaltet wird, und aktualisiert die Datei nicht.
Verbesserungen der REST API
-
Endpunkt
/healthhinzufügen (Wilfried Roset)Er gibt nur dann den HTTP-Statuscode 200 zurück, wenn PostgreSQL läuft.
-
Endpunkte
/read-onlyund/read-writehinzufügen (Julien Riou)Der Endpunkt
/read-onlyverteilt Lesezugriffe auf Replikate und den Primärserver. Der Endpunkt/read-writeist ein Alias für/primary,/leaderund/master. -
REST-API-Socket mit
SSLContextumschließ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
EDITORhinzufügen (Wilfried Roset)War die Umgebungsvariable
EDITORnicht definiert, brachpatronictl edit-configmitPatroniCtlExceptionab. Die neue Strategie versucht zunächsteditor, dannvi, 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
tokengeändert wird.
Fehlerbehebungen
-
Sonderfall bei Switchover/Failover beheben (Sharoon Thomas)
Die Variable
scheduled_atkann 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.conffreigeben (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_proxiesgesteuert. -
Callback-Verhalten bei Rollenänderung eines Knotens ändern (Alexander Kukushkin)
Wechselt die Rolle von
masteroderstandby_leaderzureplicaoder vonreplicazustandby_leader, wird statton_restartnun der Callbackon_role_changeaufgerufen. -
Startverfahren für Postgres ändern (Alexander Kukushkin)
Statt sich selbst auszuführen, wird
multiprocessing.Processverwendet. Die Postmaster-PID wird übermultiprocessing.Pipean 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
replicastattstandby_leaderzurückgegeben. -
Auf das Ende eines Callbacks warten, wenn er nicht beendet werden kann (Julien Tachoires)
Patroni hat nicht genügend Rechte, um ein unter
sudolaufendes 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_xlogein 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_USERNAMEundPATRONI_ETCD_PASSWORDunterstützen (Étienne M)Zuvor konnten diese Werte nur in der Konfigurationsdatei oder als Teil von
PATRONI_ETCD_URLfestgelegt 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
Hostden 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 wirdwait / 15oder 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
hostnochportdefiniert war, schrieb Patroniprimary_conninfoinrecovery.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_timelineauftruegesetzt 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_waitfü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-configkonfigurieren. 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_dataeingeführt. Weitere Beispiele enthält der Abschnitt Methode zur Replikaterstellung .
Fehlerbehebungen
-
Fehlerbehebungen im Ablauf für Standby-Cluster (Alexander Kukushkin)
Weitere Einzelheiten finden sich unter https://github.com/patroni/patroni/pull/823 .
-
REST-API-Health-Check bei pausierter Cluster-Verwaltung und nicht erreichbarem DCS korrigieren (Alexander Kukushkin)
Diese Regression wurde mit https://github.com/patroni/patroni/commit/90cf930036a9d5249265af15d2b787ec7517cf57 eingeführt.
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_servicein der Consul-Konfiguration aktiviert, registriert der Knoten einen Dienst mit dem Namenscopeund dem Tagmaster,replicaoderstandby-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_slotden zusätzlichen booleschen Parameterimmediately_reserve. Beifalse, 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: trueträgt Patroni in manchen Fällen*insynchronous_standby_namesein. Dadurch wechselt der Synchronisationszustand der meisten Replikationsverbindungen zupotential. Bisher konnte Patroni dann keinen synchronen Kandidaten auswählen, da es nur Verbindungen im Zustandasyncberü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_connectionsund 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 auspg_controldata, wendet ihn an, startet Postgres und setzt das Flagpending_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
liststatt alsdict. -
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_controldatamuss ‘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_memberwird 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
maintenancekann das Datenverzeichnis vollständig neu geschrieben worden sein. Daher muss geprüft werden, obDatabase system identifierweiterhin 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.subsetsalsNonestatt als[]zurückgegeben.
Verbesserungen beim Bootstrap
-
Löschen von recovery.conf optional machen (Brad Nicholson)
Wenn
bootstrap.<custom_bootstrap_method_name>.keep_existing_recovery_confdefiniert und aufTruegesetzt ist, entfernt Patroni die vorhandene Dateirecovery.confnicht. Dies ist beim Bootstrap aus einem Backup mit Werkzeugen wie pgBackRest nützlich, die eine passenderecovery.conferzeugen. -
Optionen für die integrierte basebackup-Methode zulassen (Oleksii Kliukin)
Der integrierten basebackup-Methode können jetzt Optionen übergeben werden, indem der Abschnitt
basebackupin der Konfiguration definiert wird, ähnlich wie bei benutzerdefinierten Methoden zur Replikaterstellung. Der Unterschied liegt im akzeptierten Format des Abschnittsbasebackup: Da pg_basebackup sowohl Optionen mit--key=valueals auch mit--keyakzeptiert, 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_LOGLEVELlegt die allgemeine Protokollstufe fest.PATRONI_REQUESTS_LOGLEVELlegt 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 listmeldete jedoch weiterhinScheduled failoverstattScheduled 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, wirdNoSuchProcessausgelö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/k8sverwendet. -
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
scopeverwendet. -
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 reinitverbessern (Alexander Kukushkin)patronictl reinitweigerte 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 vonreinitbricht andere lang laufende Aktionen zwangsweise ab, bevor sie mit der Neuinitialisierung fortfährt. -
Option
--waitinpatronictl pauseundpatronictl resumeimplementieren (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 failoverinpatronictl switchoverumbenennen (Alexander Kukushkin)Das bisherige
failoverkonnte 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
noloadbalancemarkierte Replikate sind ausgeschlossen.
Mehrere Hosts für etcd zulassen
-
Neuen Parameter
hostszur 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
hostszurü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_rewindkann nicht ausgeführt werden. Die Crash-Recovery im Einzelbenutzermodus wird nur durchgeführt, wennpg_rewindaktiviert 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.tokenin 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_LOGFORMATdefinieren (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.confeinrestore_commanddefiniert, bricht postgres den Start mit hoher Wahrscheinlichkeit ab und lässt controldata unverändert. Dadurch kannpg_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,tokensowie 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_namesinpostgresql.confmuss 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.conferstellen, wenn sie nach der Wiederherstellung aus dem Backup fehlt (Alexander Kukushkin) - Zugriff in
pg_hba.confauf 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
_MemberStatusdefekt (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
initdbverwendet 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.confkann im Unterabschnittpg_hbades Konfigurationsabschnittspostgresqldefiniert werden. Dies vereinfacht die Verwaltung vonpg_hba.confauf 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.confvollständig. Patroni ignoriert ihn, wenn der PostgreSQL-Parameterhba_filegesetzt ist. -
Verbindung zum lokalen PostgreSQL-Cluster über einen UNIX-Socket unterstützen (Alexander Kukushkin)
Die Option
use_unix_socketwurde zum Abschnittpostgresqlder Patroni-Konfiguration hinzugefügt. Wenn sie auf true gesetzt ist und die PostgreSQL-Optionunix_socket_directoriesnicht leer ist, verwendet Patroni deren ersten Wert zur Verbindung mit dem lokalen PostgreSQL-Cluster. Istunix_socket_directoriesnicht definiert, nimmt Patroni den Standardwert an und lässt den Parameterhostin 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_dirwurde zum Abschnittpostgresqlhinzugefü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 startupbei 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 optimegespeicherte 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)
-
--dcsund--config-fileauf 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_ctlgestartet 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
runningist, 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überpg_basebackup. Diese Änderung stellt die ursprüngliche Bedeutung vonno_masterwieder 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_ctlbis 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 Parametermaster_start_timeoutund den neuen Zustandstartingfür die HA-Hauptschleife. Wennmaster_start_timeoutauf 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
timeoutwurde zum API-Endpunktrestartund 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_rewindim 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_rewindfehlt. Wenn im fürpg_rewindrelevanten Abschnitt der Patroni-Konfiguration die Authentifizierung fürsuperuserfehlt, wird auf die Standardwerte vonlibpqfürsuperuserzurü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_initfür den Bootstrap hinzufügen. (Alejandro Martínez)Patroni ruft das als Argument dieser Option angegebene Skript unmittelbar nach
initdbund dem Start von PostgreSQL für einen neuen Cluster auf. Das Skript erhält eine Verbindungs-URL mitsuperuser. Wenn ein Passwort angegeben ist, setzt PatroniPGPASSFILEauf 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 = replicawird als Synonym fürhot_standbyverwendet, 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 Docsverlagern. 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_dirzur 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_confermö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
databaseundconfig_base_namewurden 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_timeouteingeführt, um die Zeitüberschreitung für Start-, Stopp- und Neustartaufrufe überpg_ctlfestzulegen. -
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 .