リリースノート
バージョン 4.1.5
2026-08-12 リリース
互換性の向上
-
PostgreSQL 14.24、15.19、16.15、17.11、18.6 との互換性 (Alexander Kukushkin)
新しい
output_plugin_librariesGUC を追加します。これは、論理デコード出力プラグインを制限します。
改善点
-
REST API 接続リセットのログを
WARNINGではなくDEBUGで記録 (Kyle McLaren)本物の (接続以外の) エラーの処理に影響を与えることなく、一般的な「書き込み中にクライアントが消えた」という亜種が沈黙していることを確認します。
バグ修正
-
thread_stack_size検証の調整を修正 (Sundong Kim)thread_stack_sizeスキーマ エントリのaligned値を65535から65536に修正します。以前は、patroni --validate-configは、デーモン自体によって適用される524288デフォルトを含む、ほぼすべての現実的な値を拒否していました。 -
'quorum'およびブール型の文字列を受け入れるためのsynchronous_modeの検証を許可します (Eray Araz)patroni --validate-configは、以前は、実行時に受け入れられるquorumや PostgreSQL スタイルのブール文字列などのsynchronous_mode値を拒否していました。
バージョン 4.1.4
2026-07-07 リリース
バグ修正
-
systemdパッケージを使用する前にNOTIFY_SOCKET環境変数を確認してください (Polina Bungina)FileNotFoundError: [Errno 2] No such file or directory例外を回避するために、NOTIFY_SOCKET環境変数が設定されている場合にのみ、パッケージをインポートして使用してください。 -
pg_replication_slotsクエリーを統合 (Polina Bungina)failover値とsynced値の不適切な処理により、不適切な論理レプリケーション スロットの削除中にKeyError例外が発生していました。 -
構成生成時にバージョン固有の認証パラメーターを考慮する (Polina Bungina)
patroni --generate-configコマンドでは、PostgreSQL 接続から取得したバージョンに基づいて、環境から誤って取得された適用できない認証パラメーターをすべて削除します。 -
PostgreSQL インスタンスがスタンバイとして起動している間に
pg_rewindを処理します (Alexander Kukushkin)PostgreSQL インスタンスが実行中であるがまだ接続を受け入れていない場合は、
pg_controldata情報にフォールバックします。 -
patroni_postgres_timelineの Prometheus メトリック タイプを修正しました (Huseyin Demir)patroni_postgres_timelineメトリクスは、常に単調増加するとは限らないため、counterではなくgaugeとして宣言します (たとえば、PostgreSQL インスタンスが実行されていない場合は、0 にリセットされる可能性があります)。 -
クライアントのバックエンドが完全に停止するまでウォッチドッグを停止しないでください。 (Alexander Kukushkin)
以前は、
primary_stop_timeoutが最小ウォッチドッグ タイムアウトより短く、停止タイムアウトが実際に期限切れになった場合、すべてのクライアント バックエンドが終了する前に Patroni がウォッチドッグを無効にしていました。 -
監視クエリーのステートメント タイムアウト エラーを処理 (Alexander Kukushkin)
ステートメントのタイムアウト エラーが発生した場合は、キャッシュされたロールをフォールバックとして使用して、プライマリーの降格を回避します。さらに、高価な
pg_stat_statementsGC 呼び出しを回避するために、監視クエリーのpg_stat_statements.trackをnoneに強制的に設定します。 -
wal_status=lostを使用した Patroni 管理のレプリケーション スロットの削除 (Alexander Kukushkin)wal_status=lostを使用したレプリケーション スロットは使用できなくなりました。 Patroni は、そのようなスロットを削除し、必要に応じて再作成するようになりました。 -
patronictl メンバー検証エラーのロール表現を修正しました (Polina Bungina)
例外メッセージ内で正しい文字列表現が使用されていることを確認し、エラーが
Error: No CtlPostgresqlRole.REPLICA among provided membersのような形式になるのを防ぎます。
バージョン 4.1.3
2026-05-05 リリース
安定性の向上
-
ラベルが間違っている etcd エラーを適切に処理する (Ants Aasma)
現在の etcd バージョンでは、リースの更新中に etcd リーダーが失われると、
Unknownエラーが発生します。 Patroni は、報告されたエラー コードをUnavailableにオーバーライドします。
バグ修正
-
PG_VERSIONファイルが存在しない場合はバイナリ バージョンを使用する (Polina Bungina)場合によっては、たとえばカスタム ブートストラップを使用する場合、
PG_VERSIONファイルがデータ ディレクトリに存在しないことがあります。この場合、Patroni はバージョンを 0.0 として扱っていたため、バージョン固有のロジックの一部で問題が発生していました。この修正により、Patroni はそのような場合にバイナリからバージョンを取得しようとします。 -
初期のログメッセージの欠落を避けるためにロガーの初期化をリファクタリングしました。 (Alexander Kukushkin)
初期のログ メッセージをキャプチャするには、
Configをロードする前にPatroniLoggerを作成します。 -
RELOADING=1systemd 通知にMONOTONIC_USECを含めます (Alexander Kukushkin)systemd 257+ では、
Type=notify-reloadサービス用にRELOADING=1とともにMONOTONIC_USECが必要です。これがないと、systemctl reloadは無期限にハングします。
改善点
-
backup_labelが存在する場合、シングルユーザーのクラッシュ リカバリをスキップします。 (Vadim Ponomarev)(カスタム ブートストラップ メソッドを使用せずに) 外部バックアップから復元されたレプリカを起動するときは、シングル ユーザー クラッシュ リカバリをスキップし、通常の起動中に PostgreSQL に処理させます。
-
python-systemdパッケージを使用せずにsystemdで実行されている場合に警告するようになりました。 (Alexander Kukushkin)起動時に「systemd 統合はサポートされていません」とログに記録する代わりに、
NOTIFY_SOCKETを確認し、python-systemdパッケージがインストールされていないsystemdで実際に実行している場合にのみ警告します。
バージョン 4.1.2
2026-04-21 リリース
Systemd サポートの改善
-
notify-reloadsystemd ユニット タイプのサポートを追加しました (Ronan Dunklau)RELOADING=1およびREADY=1通知を systemd に送信することで、Patroni が実際に構成のリロードを処理するまで、systemctl reloadが待機できるようにします。 -
シャットダウン時に
STOPPING=1通知を systemd に送信します (Alexander Kukushkin)Patroni は、systemd 通知プロトコルに従って、systemd にシャットダウンしていることを適切に通知するようになりました。
-
PostgreSQL に systemd を通知させないでください。 (Alexander Kukushkin)
サンプルの systemd ユニット ファイルから
NotifyAccess=allを削除します。 PostgreSQL の起動時に環境からNOTIFY_SOCKETをフィルターして、READY=1またはSTOPPING=1が systemd に送信されないようにします。 Patroni より前に開始され、すでにNOTIFY_SOCKETがある PostgreSQL を引き継ぐ場合は、PostgreSQL のシャットダウン中にREADY=1を再アサートして、そのSTOPPING=1を無効にします。
バージョン 4.1.1
2026-04-08 リリース
安定性の向上
-
Python 3.11+ のスレッド変更との互換性 (Alexander Kukushkin)
実行時にスレッドを開始/停止しないようにします。 REST API および非同期タスクを実行するためのスレッド プールを導入します。グローバル
thread_pool_sizeおよびrestapi.thread_pool_sizeの構成を許可します。 -
Python 3.14 との互換性 (Alexander Kukushkin)
Python 3.14 に対してテストを実行し、互換性の問題を修正します。
-
v3.6.9、v3.5.28、v3.4.42 の etcd セキュリティ修正との互換性 (Alexander Kukushkin)
これらの etcd リリースでは CVE に対処し、動作が変更されたため、クラスター トポロジの読み取りとリース キープアライブは認証なしでは許可されなくなりました。 Patroni は、メンバー検出パスとリースキープアライブ パスで認証し、認証失敗時に再認証し、それに応じてリクエストを再試行することでこれを処理するようになりました。
-
Etcd3 エラー処理の改善 (Alexander Kukushkin)
壊れた JSON 応答を処理し、JSON エラーの解析方法を柔軟にし、etcd 内部エラーのレポートを改善します。
バグ修正
-
一時的な Kubernetes
403エラーでリーダーの更新を再試行します (Sophia Ruan、Alexander Kukushkin)Kubernetes API が一時的に
403 Permission Deniedを返す場合 (たとえば、一時的な RBAC の問題中)、Patroni は現在のノードがまだリーダーシップを保持しているかどうかを確認し、すぐに降格するのではなくretry_timeout内でリーダーの更新を再試行するようになりました。 -
同期モードおよび一時停止時のリーダーノードの名前変更に関する問題を修正しました。 (Alexander Kukushkin)
/syncキーは、一時停止中の Patroni 再起動 (Postgres 再起動なし) でリーダー ノードの名前を変更した後、更新されませんでした。これにより、次回の再起動後に一時停止せずに Patroni が昇格できなくなりました。 -
同じプライマリーがタイムラインを増やしたときに
pg_rewindチェックをトリガーする (Alexander Kukushkin)このようなタイムラインの増加は、シングル ユーザー モードでのクラッシュ リカバリと、他のレプリカ ノードが DCS から分離されている間にリーダー キーを取得した後のプロモートの結果として発生する可能性があります。この場合、リーダー、したがって
primary_conninfoが変更されなかったため、レプリカ ノードはpg_rewindステート マシンをトリガーしませんでした。 -
initdbブートストラップ中は、スーパーユーザーのパスワードが空でない場合にのみ書き込みます。 (Michael Banck)initdbブートストラップ中に空のパスワードを書き込むと問題が発生していました。 -
failover_priorityのバグをsynchronous_mode=onで修正しました (Alexander Kukushkin)synchronous_node_count > 1の場合、tag.failover_priority値は無視されました。 -
primary_conninfoパスワード比較のバグを修正しました (Alexander Kukushkin)PostgreSQL 10 以降、Patroni は
primary_conninfoでパスファイルを使用しますが、リロードを伴う yaml ファイル構成でレプリケーション パスワードが更新された後、パスファイルの更新に失敗しました。 -
nofailoverタグを使用してレプリカを一時停止モードで再起動しないでください。 (Alexander Kukushkin)Patroni は、
nofailoverタグがtrueに設定されている場合、手動でシャットダウンした PostgreSQL レプリカを一時停止モードで起動していました。 -
PostgreSQL が開始状態の場合の
check_recovery_conf()を修正しました。 (Alexander Kukushkin)PostgreSQL v12 以降の場合、サーバーがまだ起動中で接続を受け入れていない間は、
pg_settingsをクエリーできません。postgresql.confを書き込むときに、不足している回復パラメーターが内部状態に追加されるようになりました。さらに、Ha.is_healthiest_node()のPostgresql.is_starting()チェックを復元します。 -
initdb/basebackupのユーザー オプションを辞書形式で検証します (m4rrypro)initdbまたはbasebackupオプションが (リストではなく) ディクショナリとして提供された場合、option_is_allowed()検証がバイパスされ、ブロックされたオプションの使用が可能になりました。 -
basebackupオプションのサーバー側圧縮を許可する (m4rrypro)compressオプションはbasebackupでは完全にブロックされていましたが、PostgreSQL 15 以降、サーバー側の圧縮は便利で、プレーンな形式で透過的に機能します。クライアント側の圧縮は依然として拒否されます。 -
カスタム ブートストラップの実行中に PostgreSQL 設定をリロードしないでください。 (Alexander Kukushkin)
カスタム ブートストラップは複雑で、PostgreSQL の起動と停止が複数回行われる可能性があります。このプロセス中に PostgreSQL 構成をリロードすると、予期しない動作が発生する可能性があります。
-
postgresql.parametersが辞書であることを確認します。 (Alexander Kukushkin)postgresql.parametersが辞書ではない場合、新しい設定を破棄します。
バージョン 4.1.0
2025-09-23 リリース
新機能
-
systemd “notify” ユニット タイプのサポートを追加しました (Ronan Dunklau)
通知ユニット タイプを使用しない場合、Patroni を開始し、systemd を使用してすぐに SIGHUP シグナルを送信し、シグナル ハンドラーを設定する前に事実上強制終了することができます。
-
API および ctl で受信および再生 LSN/ラグ情報を提供します (Polina Bungina)
Patroni REST API
/clusterエンドポイントとpatronictl listコマンドは、各レプリカ メンバーの受信 LSN、リプレイ LSN、受信ラグ、およびリプレイ ラグ情報を提供するようになりました。 -
スタンバイ クラスターへの完全な降格を確実にする (Polina Bungina)
動的構成に standby_cluster セクションを導入すると、クラスターが適切に降格されるようにしてください。
-
patronictl demote-clusterおよびpromote-clusterコマンドを実装する (Polina Bungina)クラスターの降格と昇格のための新しいコマンドは、動的構成の編集と結果ステータスの確認の両方を処理します。
-
sync_priorityタグを実装する (Polina Bungina)このパラメータは、synchronous_mode が
onに設定されている場合に、同期レプリカの選択中にメンバーが持つべき優先順位を制御します。 -
--validate-configの--printオプションを実装します (Polina Bungina)検証が成功したら、ローカル構成 (環境構成の上書きを含む) を出力します。
-
kubernetes.bootstrap_labelsの実装 (Polina Bungina)この機能を使用すると、
initializing new cluster、running custom bootstrap script、starting after custom bootstrap、またはcreating replica状態にあるときにメンバー ポッドに割り当てられるラベルを定義できます。 -
重複するハートビート ログを抑制する構成オプションを追加しました (Michael Morris)
trueに設定すると、同一のハートビートログが連続して出力されなくなります。 -
オプションの
cluster_type属性を永続レプリケーション スロットに追加しました (Michael Banck)これにより、特定の永続レプリケーション スロットを常に作成するか、プライマリー クラスターまたはスタンバイ クラスター上にのみ作成するかを設定できます。
-
HTTP サーバー ヘッダーを構成可能にする (David Grierson)
HTTP サーバー ヘッダーで公開される情報を制限できる
restapi.server_tokens構成パラメーターを導入します。 -
レプリカ メンバーのレプリケーションに対する準備状況 API チェックを実装 (Ants Aasma)
以前の実装では、PostgreSQL が開始されるとすぐにレプリカが準備完了したとみなされました。この変更により、レプリカ ポッドは、PostgreSQL がレプリケート中で、リーダーからそれほど遠くない場合にのみ準備ができているとみなされます。
改善点
-
ウォッチドッグ構成エラーのログ レベルを下げる (Ants Aasma)
ウォッチドッグが
requiredモードで構成されていない限り、デバッグ ログ レベルでCould not activate Linux watchdog deviceログ行を表示します。以前は情報レベルで表示されていました。 -
pg_stat_wal_receiverのwritten_lsnとlatest_end_lsnを活用します (Alexander Kukushkin)written_lsn(実際の書き込み LSN) は、pg_last_wal_receive_lsn()によって返されるもの (実際にはフラッシュ LSN) よりも優先されるようになりました。latest_end_lsnは、ソース ホスト上の WAL フラッシュを指します。プライマリーの場合、DCS に格納されている値はloop_wait秒ごとにのみ更新されるため、リプレイ ラグをより適切に計算できます。 -
failover=trueオプションで作成されたスロットとの相互作用を回避します。 (Alexander Kukushkin)この変更は、論理フェイルオーバー スロット機能を完全に機能させるために必要です。
-
PostgreSQL 状態を
/metricsREST API エンドポイントに追加します (Ivan Filianin)PostgreSQL インスタンスの状態情報が、
/metricsREST API エンドポイントの Prometheus 形式の出力で利用できるようになりました。
バージョン 4.0.7
2025-09-22 リリース
新機能
-
PostgreSQL 18 RC1 のサポートを追加 (Alexander Kukushkin)
GUC のバリデータ ルールが拡張されました。 Patroni は、新しいバックグラウンド I/O ワーカーを適切に処理するようになりました。
バグ修正
-
Windows でのローカルホストの IPv6 への解決に関する潜在的な問題を修正しました。 (András Váczi)
PostgreSQL で
listen_addressesを構成する場合、0.0.0.0または127.0.0.1を使用すると、リッスンするアドレスは IPv4 のみに制限され、IPv6 は除外されます。ただし、一般的な Windows システムでは、localhostはデフォルトで IPv6 アドレス::1に解決されることがよくあります。互換性を確保するために、Patroni は、Windows システム上でlocalhostではなく127.0.0.1をリッスンするように PostgreSQL を構成するようになりました。 -
/configキーが DCS に存在する場合のみグローバル設定を返すようにしました。 (Alexander Kukushkin)Patroni REST API は、
/configキーが DCS にない場合、エラーを生成する代わりに空の構成を返していました。 -
Etcd が利用できない場合にフェイルセーフ モードがトリガーされない問題を修正しました。 (Alexander Kukushkin)
Patroni は、
etcd3例外を常に適切に処理するとは限らず、その結果、フェイルセーフ モードがトリガーされませんでした。 -
シグナル ハンドラーの再入デッドロックを修正 (Waynerv)
PID=1を使用して Docker コンテナーで実行されている Patroni は、いくつかの特殊な場合に、SIGCHLDを受信した後にデッドロックが発生していました。 -
WAL が予約されていない場合に (永続的な) 物理スロットを再作成します (Israel Barth Rubio)
WAL を予約せずに Patroni スコープ外で作成された永続的な物理レプリケーション スロットにより、
replication slot cannot be advancedエラーが発生していました。これを回避するために、Patroni はそのようなスロットを再作成するようになりました。 -
etcd3の監視キャンセル メッセージを適切に処理するようにしました。 (Alexander Kukushkin)etcd3が監視チャネルにキャンセル メッセージを送信するとき、接続は閉じられません。これにより、Patroni が古いデータを使用することになります。 Patroni は、チャンク化された応答を読み取るループを中断し、Patroni 側の接続を閉じることで問題を解決するようになりました。 -
HTTPConnectionソケットがpyopensslでラップされている場合の処理 (Alexander Kukushkin)Patroni は、
python-etcdで強制されているpyopensslインターフェイスを正しく使用していませんでした。
ドキュメントの改善
-
2 ノード クラスター ガイダンスを改善しました (Nikolay Samokhvalov)
フェイルオーバー中の動作と DCS 要件を明確にします。
バージョン 4.0.6
2025-06-06 リリース
バグ修正
-
優先順位の高いリーダーからのフェイルオーバーのバグを修正しました。 (Alexander Kukushkin)
以前のリーダーが現在のノードと同じ
LSNを報告する場合、Patroni は優先順位の高いそのリーダーを無視します。 -
PGDATAの外部で作成されたpostgresql.confファイルの権限を修正しました (Michael Banck)PGDATAディレクトリの外にpostgresql.confファイルを作成する場合は、システム全体の umask 値を尊重してください。 -
synchronous_mode=quorumのスイッチオーバーに関するバグを修正しました。 (Alexander Kukushkin)候補者が指定されている場合は、定足数要件をチェックしません。
-
クラスターの term を比較して古い etcd ノードを無視する (Alexander Kukushkin)
etcd クラスターの最後の既知の “raft_term” を記憶し、クライアント リクエストを実行するときに、それを etcd ノードによって報告された “raft_term” と比較します。
-
SIGHUP受信時に PostgreSQL 構成ファイルを更新する (Alexander Kukushkin)以前は、Patroni は、グローバルまたはローカル構成の変更が検出された場合にのみ、PostgreSQL 構成ファイルを置き換えていました。
-
etcd3によって発生したUnavailable例外を適切に処理するようにしました。 (Alexander Kukushkin)Patroni は以前、そのようなリクエストを同じ
etcd3ノードで再試行していましたが、別のノードに切り替える方がより良い戦略です。 -
etcd3リース処理を改善しました (Alexander Kukushkin)Patroni が HA ループごとに少なくとも 1 回、
etcd3リースを更新するようにしてください。 -
リーダー ロックを取得しようとするときに、409 ステータス コードの注釈を再確認します。 (Alexander Kukushkin)
Patroni バージョン 4.0.3 で読み取られたリーダー オブジェクトに対して行われたのと同じ動作を実装します。
-
スロットを進めるときは
replay_lsnを考慮してください (Polina Bungina)replay_lsnを超えてレプリカのスロットを進めようとしないでください。さらに、replay_lsnがレプリカ上のこのスロットのconfirmed_flush_lsnを既に超えているが、レプリカがこのスロットがプライマリー上にある実際のLSNをまだ再生していない場合は、スロットをreplay_lsnの位置に進めます。 -
プロモート後に
CHECKPOINTが実行されていることを確認してください。 (Alexander Kukushkin)CHECKPOINTがまだ終了していないため、チェックポイント タスクが降格時にリセットされなかった可能性があります。その結果、次のプロモートがトリガーされるときに、古いresultが使用されることになりました。 -
“offline” 降格を同時に実行しないでください。 (Alexander Kukushkin)
シャットダウンが遅い場合、次のハートビート ループで DCS エラー処理メソッドが再度ヒットし、
AsyncExecutor is busy, demoting from the main thread警告が発生し、オフライン降格が再び開始される可能性があります。 -
初期化失敗時にデータ ディレクトリの名前を変更する前に
data_dir値を正規化します (Waynerv)data_dirパラメーター値の末尾のスラッシュによって、初期化の失敗後に名前変更プロセスが中断されないようにします。 -
synchronous_standby_namesに期待値が含まれていることを確認します (Alexander Kukushkin)以前は、非クォーラム同期レプリケーションのステート マシンを実装するメカニズムは、
synchronous_standby_namesの実際の値をチェックしませんでした。その結果、pg_stat_replicationがsynchronous_standby_namesのサブセットである場合、synchronous_standby_namesの古い値が使用されていました。
バージョン 4.0.5
2025-02-20 リリース
安定性の向上
-
python-json-logger>=3.1との互換性 (Alexander Kukushkin)古い API の使用法によって生成される警告を削除します。
-
Python 3.13 との互換性 (Alexander Kukushkin)
Python 3.13 に対してテストを実行します。
-
pyinstaller>=4.4との互換性 (Joe Jensen)pyinstallertoc属性が存在しない場合は、デフォルトのiter_modulesにフォールバックします。 -
PostgreSQL 9.5 サポートに関する問題を修正しました (Alexander Kukushkin)
pg_rewind出力形式を適切に処理します。synchronous_standby_names形式が “num” 仕様をサポートしていないことを考慮してください。
-
urlparseの最新の変更との互換性 (Alexander Kukushkin)urlparseは、URL に[]文字を含む複数のホストを受け入れなくなりました。この問題を軽減するには、可能な場合はlibpqからPQconninfoParse()のネイティブ ラッパーに切り替え、古いバージョンのlibpqにリンクされている古いpsycopg2バージョンに対してのみ実装を使用してください。
バグ修正
-
再起動の確認時に再起動されるメンバーのみを表示します (András Váczi)
以前は、
patronictl restart <clustername> --pendingを実行すると、再起動が保留されているかどうかに関係なく、確認ですべてのメンバーがリストされていました。 -
Patroni 停止時に長時間実行中のジョブをキャンセルし、レプリカ ブートストラップ失敗時にデータ ディレクトリを削除する (Alexander Kukushkin)
以前は、レプリカのブートストラップ中に Patroni が停止しても、
pg_basebackup/wal-g/pgBackRest/barmanなどのツールが動作を継続することがありました。 -
patronictl edit-configでスラッシュを含むクラスター名を適切に処理するようにしました。 (Antoni Mur)cluster_nameのスラッシュをアンダースコアに置き換えます。 -
物理スロットを早期に削除しないようにします (Alexander Kukushkin)
フェイルオーバー後に、
xminを含む物理レプリケーション スロットの削除を延期します。新しいプライマリーでは、このメンバーが昇格されるまで、レプリカでは、クラスター内にリーダーが存在するまで延期します。 -
controldata()のサブプロセスによって発生したすべての例外を処理します。 (Alexander Kukushkin)Patroni は、
pg_controldataユーティリティの呼び出し時に発生する可能性のあるすべての例外を適切に処理していませんでした。 -
フェイルオーバー時に元リーダーのスロットが保持されないバグを修正しました。 (Alexander Kukushkin)
フェイルオーバー時に前のリーダーの
/memberキーが同時に期限切れになるときに、DCS に存在するメンバーに誤って依存することを避けてください。 -
クォーラム ステート マシンのいくつかのバグを修正しました (Alexander Kukushkin)
- リーダー レースに健全なノードがあるかどうかを評価する場合、降格する前にクォーラム要件を考慮する必要があります。これがないと、元のリーダーが非同期ノードに囲まれて回復することになる可能性があります。
QuorumStateResolverは、レプリカ ノードがすぐに参加して切断される場合を正しく処理していませんでした。
改善点
-
空の設定ファイルまたは辞書以外の設定ファイルでのエラーを改善しました (Julian)
Patroni 構成ファイルに有効な
Mappingオブジェクトが含まれているかどうかを検証するときに、より明示的な例外をスローします。
バージョン 4.0.4
2024-11-22 リリース
安定性の向上
-
py-consulモジュールとの互換性を追加しました (Alexander Kukushkin)python-consulモジュールは長い間メンテナンスされていませんが、py-consulが正式な代替品です。 python-consul との下位互換性は維持されます。 -
prettytable>=3.12.0モジュールとの互換性を追加しました (Alexander Kukushkin)非推奨の警告に対処します。
-
ydiff==1.4.2モジュールとの互換性 (Alexander Kukushkin)最新バージョンの互換性の問題を修正し、
requirements.txtでバージョンを制限し、最新バージョンの互換性テストを導入します。
バグ修正
-
プライマリー リカバリの失敗後に
on_role_changeコールバックを実行する (Polina Bungina、Alexander Kukushkin)さらに、クラッシュ後に起動に失敗したプライマリーに対して
on_role_changeコールバックを実行して、レプリカとしてのその後の起動が失敗した場合でも、コールバックが実行される可能性を高めます。 -
patronictl list -Wのスレッド リークを修正しました (Alexander Kukushkin)DCS インスタンス オブジェクトをキャッシュして、スレッド リークを回避します。
-
サポートされているパラメータのみが接続文字列に書き込まれるようにしました。 (Alexander Kukushkin)
Patroni は、新しいバージョンで導入されたパラメータを接続文字列に渡していたため、接続エラーが発生していました。
バージョン 4.0.3
2024-10-18 リリース
バグ修正
-
ユーザー作成時にパスワードが漏えいしないよう
pgauditを無効にする (kviset)pgaudit拡張機能が有効になっている場合、Patroni は作成時にsuperuser、replication、およびrewindのパスワードをログに記録していました。 -
混合セットアップの問題を修正しました: プライマリーが Patroni v4 より前、レプリカが v4+ (Alexander Kukushkin)
リーダー上で実行されている Patroni バージョンが 4.0.0 より前の場合は、
/statusキーからメンバーのスロット位置を取得しようとするのではなく、/membersキーから抽出されたxlog_locationを使用します。そうしないと、レプリカ上で WAL が蓄積されていました。 -
Patroni バリデーターを持たない有効な PostgreSQL GUC を無視しないでください (Polina Bungina)
GUC に Patroni バリデーターがなくても、実際には有効な GUC であるかどうかを、引き続き
postgres --describe-configに対してチェックします。
改善点
-
K8s でリーダー オブジェクトを読み取るときに、409 ステータス コードの注釈を再確認します。 (Alexander Kukushkin)
リクエストがターゲットを正常に更新している間に、
PATCHリクエストが Patroni によってキャンセルされた場合は、追加の更新を回避します。 -
sslnegotiationクライアント側接続オプションのサポートを追加しました (Alexander Kukushkin)sslnegotiationは、最終的な PostgreSQL 17 リリースに追加されました。
バージョン 4.0.2
2024-09-17 リリース
バグ修正
-
構成検証ファイルの検出中に例外を処理します (Alexander Kukushkin)
Patroni にリスト操作を実行するための十分な権限がないディレクトリをスキップします。
-
非アクティブなホット物理レプリケーション スロットが
xminを保持しないようにします (Alexander Kukushkin、Polina Bungina)バージョン 3.2.0 以降、Patroni はレプリカ上のすべてのメンバーに対して物理レプリケーション スロットを作成し、
pg_replication_slot_advance()関数を使用してそれらを定期的に前方に移動します。ただし、何らかの理由でhot_standby_feedbackが有効で、プライマリーがレプリカに降格された場合、現在非アクティブなスロットのNOT NULLxmin値が新しいプライマリーに伝播されます。その結果、xminホライズンは前方に移動されず、バキュームはデッドタプルをクリーンアップできなくなります。この修正により、Patroni は、非アクティブであるはずだがNOT NULLxmin値を持つ物理レプリケーション スロットを再作成します。 -
起動フェーズ中に未処理の
DCSErrorを修正しました (Waynerv)ノード名の一意性を確認する前に、DCS 接続を確認してください。
-
pg_settingsのクエリー時にCMDLINE_OPTIONSGUC を明示的に含めるようになりました。 (Alexander Kukushkin)Patroni が実行中のスタンバイに参加するときに、コマンド ライン パラメーターとしてポストマスターに渡されるすべての GUC が復元されていることを確認してください。これは、Patroni 3.2.2 で修正されたバグのフォローアップです。
-
synchronous_standby_names引用ロジックのバグを修正しました (Alexander Kukushkin)PostgreSQL ドキュメントによると、
ANYおよびFIRSTキーワードは二重引用符で囲まれることになっていますが、Patroni では以前は二重引用符で囲まれていませんでした。 -
キープアライブ接続の範囲外の問題を修正 (hadizamani021)
設定された
ttlに基づいて計算されたkeepaliveオプション値が、現在のプラットフォームで許可されている最大値を超えていないことを確認してください。
バージョン 4.0.1
2024-08-30 リリース
バグ修正
-
Patroni はそれ自体に不要なレプリケーション スロットを作成していました。 (Alexander Kukushkin)
この問題は、
nameに大文字または特殊文字が含まれている場合に発生していました。
バージョン 4.0.0
2024-08-29 リリース
- このバージョンでは、“master” という用語を削除し、“primary” を使用する作業が完了しました。これは、いくつかの後方互換性のない変更を意味します。リリース ノートをよく読んでください。 Patroni 4+ へのアップグレードは、Patroni 3.1.0 以降を実行している場合にのみ確実に機能します。古いバージョンから 4+ に直接アップグレードすることは可能ですが、残りのノードが他の Patroni バージョンで実行されているときにプライマリーで障害が発生すると、予期しない動作が発生する可能性があります。
後方互換性のない変更
- Patroni コード内の非包括的な “master” 用語を削除する際に、次の後方互換性のない変更が導入されました。
- Kubernetes では、Patroni はデフォルトで
roleラベルをprimaryに設定します。以前の動作を維持し、ダウンタイムや長時間にわたる複雑な移行を回避したい場合は、パラメーターkubernetes.leader_label_valueおよびkubernetes.standby_leader_label_valueをmasterに構成できます。続きを読む ここで 。 - Patroni ロールは、
masterではなくprimaryとして DCS に書き込まれます。 - Patroni REST API によって返される Patroni ロールが
masterからprimaryに変更されました。 - Patroni REST API は、
/switchover、/failover、/restartエンドポイントへのリクエストでrole=masterを受け入れなくなりました。 /metricsREST API エンドポイントはpatroni_masterメトリックを報告しなくなります。- patronictl
は、どのコマンドでも
--masterオプションを受け入れなくなりました。代わりに--leaderまたは--primaryオプションを使用する必要があります。 - カスタム レプリカ作成メソッドの宣言的構成の
no_masterオプションは特別なオプションとして扱われなくなりました。代わりにno_leaderを使用してください。 patroni_wale_restoreスクリプトは--no_masterオプションを受け入れなくなりました。patroni_barmanスクリプトは--role=masterオプションを受け入れなくなりました。- すべてのコールバック スクリプトは、
role=masterの代わりに渡されたrole=primaryオプションを使用して実行されます。
- Kubernetes では、Patroni はデフォルトで
patronictl failoverは、Patroni 3.2.0 以降非推奨となった--leaderオプションを受け入れません。- ユーザー作成機能 (
bootstrap.users構成セクション) は、Patroni 3.2.0 以降に非推奨となっていたものが削除されました。
新機能
-
Quorum ベースのフェイルオーバー (Ants Aasma、Alexander Kukushkin)
この機能は、クォーラム ベースの同期レプリケーション (PostgreSQL v10 から利用可能) を実装します。これにより、1 つのスタンバイへのレプリケーションの待ち時間が長くなっても、他のスタンバイで補うことができるため、通常の運用中であっても最悪の場合の待ち時間を短縮できます。 Patroni は、受信した最新のトランザクションに基づいてフェイルオーバー候補を選択することにより、ユーザーに見えるデータ損失を防ぐ追加の保護手段を実装します。
-
Citus セカンダリを
pg_dist_nodeに登録します (Alexander Kukushkin)Patroni は、
role==replica、state==runningで、noloadbalanceタグ を持たないノードのリストをpg_dist_nodeに維持するようになりました。 -
メンバーのレプリケーション スロットの保持を構成可能 (Alexander Kukushkin)
メンバー キーが存在しない場合にメンバー レプリケーション スロットを維持する期間を制御する
member_slots_ttlグローバル構成パラメーターのサポートを実装します。 -
Patroni によって作成されたログ ファイルのアクセス許可を設定可能にしました (Alexander Kukushkin)
Patroni によって作成されたログ ファイルに特定のアクセス許可を設定できます。指定しない場合、現在の
umask値に基づいて権限が設定されます。 -
PostgreSQL 17 beta3 との互換性 (Alexander Kukushkin)
GUC のバリデータ ルールが拡張されました。 Patroni はシャットダウン中にすべての新しい補助バックエンドを処理し、論理レプリケーション スロットの同期に必要な
dbnameをprimary_conninfoに設定します。 -
Patroni 構成検証用の
--ignore-listen-portオプションを実装します (Sahil Naphade)patroni --validate-configの実行時に、すでにバインドされているポートを無視できるようにします。
改善点
-
wal_log_hintsを構成可能にする (Paul_Kim)use_pg_rewindがoffに設定されている場合に、wal_log_hints構成が有効になることによるオーバーヘッドを回避できます。 -
pg_basebackupコマンドをDEBUGレベルでログに記録 (Waynerv)失敗した初期化のデバッグを容易にします。
バグ修正
-
フェイルセーフ時にカスケード ノードの永続スロットを前進させる (Alexander Kukushkin)
フェールセーフ モードがアクティブになっているときに、カスケード レプリカのスロットがプライマリー上で適切に前進していることを確認します。これは、
POST /failsafeREST API リクエストに対するレプリカの応答をxlog_locationで拡張することによって行われます。 -
現在のノードを同期として選択させないでください。 (Alexander Kukushkin)
現在のプライマリー ノードから、現在のプライマリーの名前と一致する
application_nameを含む “something” ストリーミングが存在する可能性があります。 Patroni はこの状況を適切に処理していなかったので、プライマリーが同期ノードとして宣言される可能性があり、その結果、スイッチオーバーがブロックされていました。 -
POST /failsafe の
restapi.allowlist_include_membersを無視します (Alexander Kukushkin) -
GUC 検証を改善しました (Polina Bungina)
postgres --describe-configコマンドの実行による追加の検証のため、以前は Patroni 構成を通じてそこにリストされていない GUC を設定することはできませんでした。この制限は現在では削除されています。 -
UNIX ソケットが検出された場合、
localhostの行を.pgpassファイルに追加しました。 (Alexander Kukushkin)指定された
hostパラメータが/文字で始まる場合、Patroni は.pgpassファイルに追加行を追加します。これにより、hostがデフォルトのソケット ディレクトリ パスと一致する場合の特殊なケースに対処できます。 -
ログの問題を修正 (Waynerv)
フェールセーフ処理ログに適切なリクエスト URL を定義し、ポストマスター チェック ログのタイムスタンプの順序を修正しました。
バージョン 3.3.2
2024-07-11 リリース
バグ修正
-
プレーンな Postgres 同期レプリケーション モードを修正しました (Israel Barth Rubio)
synchronous_mode が Patroni に導入されて以来、プレーンな Postgres 同期レプリケーションは機能しませんでした。このバグ修正により、synchronous_mode が無効になっている場合、Patroni はユーザーの構成に従って
synchronous_standby_namesの値を設定します。 -
スタンバイで論理スロットの無効化を処理します (Polina Bungina)
PG16 以降、スタンバイ上の論理レプリケーション スロットは、horizon (ホライズン) により無効化される可能性があるため、これ以降、Patroni は無効化されたスロットのコピー (つまり、再作成) を強制します。
-
論理スロットのアドバンスとコピーによる競合状態を修正しました。 (Alexander Kukushkin)
このバグにより、無効化された論理レプリケーション スロットが PostgreSQL 再起動で複数回コピーされる場合に発生する可能性がありました。
バージョン 3.3.1
2024-06-17 リリース
安定性の向上
-
Python 3.12 との互換性 (Alexander Kukushkin)
logging.LogRecordに追加された新しい属性を処理します。
バグ修正
-
replicatefromタグ処理における無限再帰を修正しました。 (Alexander Kukushkin)この修正の一環として、
is_physical_slot()のチェックも改善し、ドキュメントを調整します。 -
スタンバイクラスターでの間違ったロールレポートを修正しました。 (Alexander Kukushkin)
synchronous_standby_namesと同期レプリケーションは実際のプライマリー ノードでのみ機能し、カスケード レプリケーションの場合は Postgres によって単純に無視されます。この修正が行われる前は、patronictl listとGET /clusterは一部のノードを同期していると誤って報告していました。 -
allow_in_place_tablespacesGUC の可用性を修正 (Polina Bungina)allow_in_place_tablespacesは PostgreSQL 15 に追加されただけでなく、PostgreSQL 10-14 にもバックパッチされました。
バージョン 3.3.0
2024-04-04 リリース
すべての古い Patroni バージョンは ydiff>=1.3 と互換性がありません。
問題の “fix” に使用できるオプションは次のとおりです。
- Patroni を最新バージョンにアップグレードします
- Patroni のインストール後に
ydiff<1.3をインストールする cdiffモジュールをインストールする
新機能
-
auth_dataを Zookeeper クライアントに渡す機能を追加しました (Aras Mumcuyan)接続に使用する認証資格情報を指定できます。
-
Barman統合用の contrib スクリプトを追加しました (Israel Barth Rubio)Barman操作をリモートで実行できるようにし、カスタム ブートストラップ/カスタム レプリカ メソッドまたはon_role_changeコールバックとして使用できるアプリケーションpatroni_barmanを提供します。詳細については、ここで を確認してください。 -
JSONログ形式をサポート (alisalemmi)plain(デフォルト) とは別に、Patroni はjsonログ形式もサポートするようになりました。python-json-logger>=2.0.2ライブラリをインストールする必要があります。 -
pending_restart_reason情報を表示 (Polina Bungina)pending_restartフラグが設定される原因となった PostgreSQL パラメーターに関する拡張情報を提供します。patronictl listと/patroniREST API エンドポイントの両方で、パラメーター名とその “diff” がpending_restart_reasonとして表示されるようになりました。 -
nostreamタグを実装する (Grigory Smolkin)nostreamタグがtrueに設定されている場合、ノードは WAL をストリーミングするためにレプリケーション プロトコルを使用せず、代わりにアーカイブ リカバリに依存します (restore_commandが構成されている場合)。また、ノード自体とそのすべてのカスケード レプリカ上の永続的な論理レプリケーション スロットのコピーと同期も無効になります。
改善点
-
logセクションの検証を実装します (Alexander Kukushkin)これまで、バリデーターは提供されたログ構成の正確性をチェックしていませんでした。
-
PostgreSQL パラメーター変更のログを改善しました (Polina Bungina)
古い値を人間が判読できる形式に変換し、
pg_controldataと Patroni のグローバル構成の不一致に関する情報をログに記録します。
バグ修正
-
許可されていない
pg_basebackupオプションを適切に除外しました (Israel Barth Rubio)バグのため、Patroni は、
- setting: value形式で提供されている場合、basebackupレプリカ ブートストラップ メソッドに構成された許可されていないオプションを適切にフィルターで除外していませんでした。 -
etcd3認証エラー処理を修正しました (Alexander Kukushkin)リクエストを実行する直前に認証が行われなかった場合、
etcd3認証エラーが発生した場合は常に 1 回再試行します。また、再認証時にウォッチャーを再起動しないでください。 -
バリデーター ファイル検出のロジックを改善 (Waynerv)
可能な場合は、
importlibライブラリを使用して、利用可能な構成パラメータを持つファイルを検出します (Python 3.9+ の場合)。この実装はより安定しており、zipアーカイブに基づく Patroni ディストリビューションを壊すことはありません。 -
standby_cluster セクションで複数のホストが指定されている場合にのみ
target_session_attrsを使用するようにしました。 (Alexander Kukushkin)standby_cluster.hostセクションにカンマで区切られた複数のホストが含まれている場合にのみ、target_session_attrs=read-writeがスタンバイ リーダー ノードのprimary_conninfoに追加されるようになりました。 -
ydiffライブラリ バージョン 1.3+ の互換性コードを追加しました (Alexander Kukushkin)Patroni は、Python モジュールではなく単なる端末ツールであると想定されているため、公開されていない
ydiffの一部の API に依存しています。残念ながら、1.3 の API の変更により、古い Patroni バージョンが壊れてしまいました。
バージョン 3.2.2
2024-01-17 リリース
バグ修正
-
DCS が消去されたときに、レプリカが initialize キーを復元しないようにする (Alexander Kukushkin)
この問題は、Patroni がスタンドアロンの PG クラスターを引き継ぐメソッドで発生していました。
-
Consul から更新されたばかりの同期キーを取得するときに一貫した読み取りを使用します。 (Alexander Kukushkin)
Consul には、更新したばかりのキーの
ModifyIndexをすぐに取得するためのインターフェイスが提供されていないため、明示的な読み取り操作を実行する必要があります。デフォルトでは古い読み取りが許可されているため、古いバージョンのキーを取得することがありました。 -
再起動が必要なパラメーターが元の値にリセットされた場合に PostgreSQL 構成をリロードする (Polina Bungina)
以前は、Patroni は構成を更新せず、
pending_restartをリセットするだけでした。 -
同期モードで非同期候補へのフェイルオーバーを実行する際の確認プロンプト メッセージの誤った反転ロジックを修正しました (Polina Bungina)
この問題は patronictl にのみ存在しました。
-
patronictl のフェイルオーバー候補からリーダーを除外します (Polina Bungina)
クラスターが正常な場合、既存のリーダーへのフェイルオーバーは何も行われません。
-
Citus データベースと拡張機能をべき等に作成する (Alexander Kukushkin、Zhao Junwang)
Citus データベースにさらに依存関係を追加する必要がある場合に備えて、
post_bootstrapスクリプトでそれらを作成できるようになります。 -
矛盾する
nofailoverタグをフィルタリングしないでください (Polina Bungina)ノードに設定された構成
{nofailover: false, failover_priority: 0}ではレースに参加できませんでしたが、nofailoverタグが優先されるため、レースに参加できるはずです。 -
PyInstaller の凍結問題を修正しました (Sophia Ruan)
freeze_support()がargparseの後に呼び出されたため、Patroni は Postgres を開始できませんでした。 -
patronictl および Citus 構成の構成ジェネレーターのバグを修正しました (Israel Barth Rubio)
これにより、環境変数を介して設定された patronictl および Citus 構成パラメーターが、生成された構成に書き込まれることが妨げられました。
-
実行中のスタンバイに参加するときに、リカバリ GUC と一部の Patroni 管理パラメータを復元します (Alexander Kukushkin)
Patroni は、内部構造の 1 つで
portが欠落しているというエラーにより、Postgres v12 以降の再起動に失敗していました。 -
pending_restartフラグ周りの修正 (Polina Bungina)recovery_target_action = promoteを使用したカスタム ブートストラップの場合、または誰かがALTER SYSTEMなどを使用してhot_standbyまたはwal_log_hintsを変更した場合は、pending_restartを公開しないでください。
バージョン 3.2.1
2023-11-30 リリース
バグ修正
-
patronictl の
--format引数に受け入れられる値を制限しました (Alexander Kukushkin)以前は任意の文字列を受け入れ、値が認識されない場合は出力を生成していませんでした。
-
リーダー キーを解放する前に、シャットダウン時にレプリカ ノードがチェックポイント LSN を受信したことを確認します。 (Alexander Kukushkin)
以前は、場合によっては、その後に CHECKPOINT が続く SWITCH レコードの LSN を使用していました (アーカイブ モードが有効な場合)。その結果、以前のプライマリーは
pg_rewindを実行する必要がある場合がありましたが、データ損失は発生しませんでした。 -
ノード名の一意性チェックを実行するときに実際の HTTP リクエストを実行します。 (Alexander Kukushkin)
コンテナー内でPatroniを実行すると、ポートをリッスンして着信接続を受け入れる
docker-proxy経由でトラフィックがルーティングされる場合があります。このことが誤検出の原因になっていました。 -
Etcd v2 を使用した Citus サポートを修正しました (Alexander Kukushkin)
Patroni は、etcd v2 を使用した新しい Citus クラスターのデプロイに失敗していました。
-
Postgres v16+ での
pg_rewindの動作を修正しました。 (Alexander Kukushkin)pg_waldumpのエラー メッセージ形式が v16 で変更されたため、必要でない場合でもpg_rewindが Patroni によって呼び出されていました。 -
カスタム ブートストラップのバグを修正しました (Alexander Kukushkin)
Patroni は、ブートストラップ コマンドそのものである
--command引数を誤って適用していました。 -
REST API ヘルスチェックエンドポイントの問題を修正しました (Sophia Ruan)
接続が適切に閉じられなかったために、Postgres の再起動後に Postgres の
unknown状態が返される可能性がありました。 -
postgres --describe-configの出力結果をキャッシュ (Waynerv)これらは、PostgreSQL 構成の検証にどの GUC が利用できるかを判断するために使用され、Patroni の実行中にこのリストが変更されることは想定されていません。
バージョン 3.2.0
2023-10-25 リリース
非推奨の通知
bootstrap.usersサポートはバージョン 4.0.0 で削除されます。新しいクラスターのデプロイ後にユーザーを作成する必要がある場合は、bootstrap.post_bootstrapフックを使用してください。
後方互換性のない変更
-
loop_wait + 2*retry_timeout <= ttlルールを強制し、可能な最小値をハードコードします (Alexander Kukushkin)最小値:
loop_wait=2、retry_timeout=3、ttl=20。値が小さい場合、またはルールに違反している場合は、値が調整され、警告が Patroni ログに書き込まれます。
新機能
-
フェイルオーバーの優先順位 (Mark Pekala)
tags.failover_priorityの助けを借りて、リーダー レース中にノードをより優先させることができるようになりました。詳細については、ドキュメント (ref タグ) を参照してください。 -
patroni --generate-config [--dsn DSN]およびpatroni --generate-sample-configを実装しました (Polina Bungina)実行中の PostgreSQL クラスターの構成ファイル、または新しい Patroni クラスターのサンプル構成ファイルを生成できます。
-
Patroni REST API には Postgres への専用接続を使用します (Alexander Kukushkin)
システムにストレスがかかっている場合に、メインのハートビート ループがブロックされるのを避けるのに役立ちます。
-
ノードの
nameを使用して一部のエンドポイントを強化します (sskserk)モニタリング エンドポイントの場合は
nameがscopeの隣に追加され、メトリクス エンドポイントの場合はnameがタグに追加されます。 -
フェイルオーバー/スイッチオーバーの厳密な違いを確保する (Polina Bungina)
ログ メッセージをより正確にし、正常な同期クラスター内の非同期ノードへのフェイルオーバーを許可します。
-
永続的な物理レプリケーション スロットを永続的な論理スロットと同様に動作させるようにしました。 (Alexander Kukushkin)
リーダーになることが許可されているすべてのノード上に永続的な物理レプリケーション スロットを作成し、
pg_replication_slot_advance()関数を使用してスタンバイ ノード上のスロットのrestart_lsnを進めます。 -
patronictl の
--dcs引数を通じて名前空間を指定する機能を追加しました (Israel Barth Rubio)構成ファイルなしで patronictl を使用する場合に、この機能が便利です。
-
カスタム ブートストラップ構成に追加パラメーターのサポートを追加しました (Israel Barth Rubio)
以前は、カスタム引数を
commandに追加することしかできませんでしたが、現在はそれらをマッピングとしてリストできるようになりました。
改善点
-
citus.local_hostnameGUC を、Patroni が Postgres に接続するために使用するのと同じ値に設定します。 (Alexander Kukushkin)Citus がローカルの Postgres への接続を必要とする場合があります。デフォルトでは
localhostが使用されますが、常に使用できるわけではありません。
バグ修正
-
スタンバイ クラスターの synchronous_mode 設定を無視する (Polina Bungina)
Postgres はカスケード同期レプリケーションをサポートしておらず、synchronous_mode を無視しないことによってスタンバイ クラスターでのスイッチオーバーが壊れていました。
-
on_reloadコールバックの SIGCHLD を処理 (Alexander Kukushkin)そうしないとゾンビ プロセスが発生し、次の
on_reloadが実行されるときにのみ回収されます。 -
etcd v3 を使用する場合の
AuthOldRevisionエラーを処理 (Alexander Kukushkin、Kenny Do)このエラーは、etcd が JWT を使用するように構成されている場合、および etcd のユーザー データベースが更新されたときに発生します。
バージョン 3.1.2
2023-09-26 リリース
バグ修正
-
wal_keep_sizeチェックのバグを修正しました (Alexander Kukushkin)wal_keep_sizeは、通常はユニットを持つ GUC ですが、Patroni はその値をintにキャストできませんでした。その結果、bootstrap.dcsの値はその後/configキーに書き込まれませんでした。 -
/syncキーとsynchronous_standby_names間の不一致を検出して解決します。 (Alexander Kukushkin)通常、Patroni は非常に特定の順序で
/syncとsynchronous_standby_namesを更新しますが、バグが発生した場合、または手動でsynchronous_standby_namesをリセットした場合、Patroni は矛盾した状態になりました。その結果、非同期ノードでフェイルオーバーが発生する可能性がありました。 -
実行中の Postgres に参加するときに GUC の値を読み取ります (Alexander Kukushkin)
一時停止する で再起動すると、Patroni は
postgresql.confからsynchronous_standby_namesGUC を破棄していました。これを解決し、同様の問題を回避するために、Patroni は、すでに実行中の Postgres に結合する場合、GUC の値を読み取ります。 -
ノードの一意性をチェックする際の煩わしい警告をサイレントにしました (Alexander Kukushkin)
Patroni がすぐに再起動されると、
WARNINGメッセージがurllib3によって生成されます。
バージョン 3.1.1
2023-09-20 リリース
バグ修正
-
プロモート時にフェイルセーフ状態をリセット (ChenChangAo)
フェールセーフ モードがアクティブ化された直後にスイッチオーバー/フェイルオーバーが発生した場合、フェールセーフが非アクティブになった後、新たに昇格されたプライマリーは自身を降格していました。
-
patronictl で無用な警告をサイレントにしました (Alexander Kukushkin)
patronictl が Patroni と同じ patroni.yaml ファイルを使用し、
PGDATAディレクトリにアクセスできる場合、グローバル構成の不正な値に関する煩わしい警告が表示されていた可能性があります。 -
特殊なケースに対して同期モードを明示的に有効にしました (Alexander Kukushkin)
プライマリーからストリーミングするレプリカがない場合、同期モードは事実上アクティブ化されていませんでした。
-
0整数値の検証に関するバグを修正しました (Israel Barth Rubio)ほとんどの場合、警告が表示されるだけで、問題は発生しませんでした。
-
スタンバイクラスターの論理スロットを返さないようにしました。 (Alexander Kukushkin)
Patroni はスタンバイ クラスターに論理レプリケーション スロットを作成できないため、グローバル構成で定義されている場合は無視する必要があります。
-
patronictl --help出力で docstring を表示しないようにしました (Israel Barth Rubio)clickモジュールは、そのための特別なヒントを取得する必要があります。 -
kubernetes.standby_leader_label_valueのバグを修正しました (Alexander Kukushkin)この機能は事実上、まったく機能しませんでした。
-
クラスター システム識別子を
patronictl list出力に返しました (Polina Bungina)この問題は、Citus のサポートを実装する際に発生しました。識別子はコーディネーターとすべてのワーカーで異なるため、識別子を隠す必要があります。
-
Kubernetes 実装で
write_leader_optimeメソッドをオーバーライド (Alexander Kukushkin)このメソッドは、新しいプライマリーとなる使用可能な正常なレプリカがない場合に、リーダー エンドポイント/ConfigMap にシャットダウン LSN を書き込むことになっています。
-
一時停止中の停止した postgres を開始しないでください。 (Alexander Kukushkin)
競合状態のため、Patroni は、一部のリカバリ パラメーター (
primary_conninfoなど) が変更されたため、スタンバイを再起動する必要があると誤って想定していました。 -
patronictl queryコマンドのバグを修正しました (Israel Barth Rubio)-m引数のみが指定された場合、または-rまたは-mがいずれも指定されなかった場合は機能しませんでした。 -
postgres を起動するためにコマンドラインで使用される整数パラメーターを適切に処理します (Polina Bungina)
値が文字列として提供され、整数にキャストされていない場合、Citus クラスターの
max_connectionsに基づくmax_prepared_transactionsの計算が正しく行われませんでした。 -
pg_rewindを決定するときはpg_stat_wal_receiverに依存しないでください (Alexander Kukushkin)レプリケーション接続を介して
IDENTIFY_SYSTEMによって報告されるタイムラインが常に正しい一方で、pg_stat_wal_receiverによって報告されるreceived_tliが実際に再生されるタイムラインよりも進んでいることが発生する可能性があります。
バージョン 3.1.0
2023-08-03 リリース
後方互換性のない変更
-
restapi.keyfileおよびrestapi.certfileのセマンティクスを変更しました (Alexander Kukushkin)以前は、Patroni は、
ctlセクションにそれぞれの構成パラメーターがない場合、フォールバックとしてrestapi.keyfileおよびrestapi.certfileをクライアント証明書として使用していました。
クライアント証明書の検証を有効にした場合 (restapi.verify_client が required に設定されている場合)、ctl.certfile、ctl.keyfile、ctl.keyfile_password で 有効なクライアント証明書 も提供しなければなりません。指定しない場合、Patroni は正しく動作しません。
新機能
-
Pod ロール ラベルを構成可能にする (Waynerv)
値は、
kubernetes.leader_label_value、kubernetes.follower_label_value、およびkubernetes.standby_leader_label_valueパラメーターを使用してカスタマイズできます。この機能は、masterロールをprimaryに変更するときに非常に役立ちます。機能と移行手順の詳細については、ここで をご覧ください。
改善点
-
patroni --validate-configのさまざまな改善 (Alexander Kukushkin)さまざまな DCS、
bootstrap.dcs、ctl、restapi、および ウォッチドッグ セクションのパラメーター検証が改善されました。 -
Patroni の実行中にリカバリ中にクラッシュした場合、Postgres をリカバリモード以外で起動する (Alexander Kukushkin)
これにより、回復時間が短縮され、不必要なタイムラインの増加を防ぐことができます。
-
/statusキーの不必要な更新を避ける (Alexander Kukushkin)永続的な論理スロットがない場合、プライマリーの LSN が先に進まない場合でも、Patroni はハートビート ループごとに
/statusを更新していました。 -
古いプライマリーがリーダー レースに勝つのを許可しない (Alexander Kukushkin)
リソース不足により Patroni が長時間ハングしていた場合、リーダー ロックを取得する前に、他のノードが Postgres を昇格していないかどうかがさらにチェックされます。
-
特定の PostgreSQL パラメーター検証の可視性を実装しました (Alexander Kukushkin、Feike Steenbergen)
max_connections、max_wal_senders、max_prepared_transactions、max_locks_per_transaction、max_replication_slots、またはmax_worker_processesの検証が失敗した場合、Patroni は適切なデフォルト値を使用していました。これに加えて、警告も表示されます。 -
PGDATAで作成されたファイルとディレクトリのアクセス許可を設定します (Alexander Kukushkin)Patroni によって作成されたすべてのファイルには、所有者の読み取り/書き込み権限のみがありました。この動作により、別のユーザーで実行され、グループの読み取り権限に依存するバックアップ ツールが機能しなくなります。現在、Patroni は
PGDATAに対するアクセス許可を尊重し、PGDATA内に作成されるすべてのディレクトリとファイルに対するアクセス許可を正しく設定します。
バグ修正
-
シェルを介して
archive_commandを実行します (Waynerv)。Patroni は、シングルユーザー モードでクラッシュ リカバリを実行する前、または
pg_rewindの前に、一部の WAL セグメントをアーカイブする場合があります。 archive_command に&&などのいくつかのシェル演算子が含まれている場合、Patroni では機能しませんでした。 -
「スイッチオーバー時」シャットダウンチェックを修正しました (Polina Bungina)
指定された候補がまだストリーミング中であり、シャットダウン チェックポイントを受信していない可能性がありますが、他のいくつかのノードが正常であったためにリーダー キーが削除されました。
-
「プライマリーである」チェックを修正しました (Alexander Kukushkin)
リーダーのレース中、レプリカは古いリーダーの Postgres がまだプライマリーとして実行されていることを認識できませんでした。
-
patronictl listを修正しました (Alexander Kukushkin)tsv、json、およびyaml出力形式にクラスター名フィールドがありませんでした。 -
一時停止後の
pg_rewindの動作を修正しました (Alexander Kukushkin)特定の条件下では、Patroni は、メンテナンス モードを終了した後、偽のプライマリーを
pg_rewindを使用してクラスターに戻すことができませんでした。 -
Etcd v3 実装のバグを修正しました (Alexander Kukushkin)
create_revision/mod_revisionフィールドを使用するキー更新がリビジョンの不一致により失敗した場合、内部 KV キャッシュを無効にします。 -
一時停止中のスタンバイ クラスターのレプリカの動作を修正しました (Alexander Kukushkin)
リーダー キーの有効期限が切れると、スタンバイ クラスターのレプリカはリモート ノードに従わず、
primary_conninfoをそのまま保持します。
バージョン 3.0.4
2023-07-13 リリース
新機能
-
スタンバイ ノードのレプリケーション ステータスを表示するようにしました (Alexander Kukushkin)
PostgreSQL 9.6+ の場合、Patroni は、スタンバイが他のノードからストリーミングしている場合はレプリケーション状態を
streamingとして報告し、レプリケーション接続がなく、restore_commandが設定されている場合はin archive recoveryとして報告します。状態は、DCS のmemberキー、REST API、およびpatronictl list出力に表示されます。
改善点
-
Etcd v3 のエラー メッセージを改善しました (Alexander Kukushkin)
etcd v3 クラスターにアクセスできない場合、Patroni は
/v2エンドポイントにアクセスできないことを報告していました。 -
可能な場合は patronictl でクォーラム リードを使用する (Alexander Kukushkin)
etcd または Consul クラスターは読み取り専用に低下する可能性がありますが、patronictl ビューからはすべて問題ありませんでした。今はエラーが出て失敗します。
-
構成内の名前の重複によるスプリットブレインを防止します (Mark Pekala)
Patroni の起動時に、同じ名前のノードが DCS に登録されているかどうかを確認し、その REST API のクエリーを試みます。 REST API にアクセスできる場合、Patroni はエラーで終了します。人的ミスから守るのに役立ちます。
-
Patroni の実行中にクラッシュした場合、Postgres をリカバリモード以外で起動する (Alexander Kukushkin)
これにより、回復時間が短縮され、不必要なタイムラインの増加を防ぐことができます。
バグ修正
-
REST API SSL 証明書は、SIGHUP の受信時にリロードされませんでした (Israel Barth Rubio)
回帰は 3.0.3 で導入されました。
-
max_connectionsのようなパラメータの整数 GUC 検証を修正しました (Feike Steenbergen)Patroni は引用符で囲まれた数値を好みませんでした。回帰は 3.0.3 で導入されました。
-
synchronous_mode の問題を修正しました (Alexander Kukushkin)
synchronous_mode_strictが有効なときに、欠落している同期スタンバイを誤って待機しないように、synchronous_commit=offを使用してtxid_current()を実行します。
バージョン 3.0.3
2023-06-22 リリース
新機能
-
PostgreSQL 16 beta1 との互換性 (Alexander Kukushkin)
GUC のバリデータ ルールを拡張しました。
-
PostgreSQL GUC のバリデーターを拡張可能にします (Israel Barth Rubio)
バリデータ ルールは、
patroni/postgresql/available_parameters/ディレクトリにある YAML ファイルからロードされます。ファイルはアルファベット順に並べられ、次々に適用されます。これにより、非標準の Postgres ディストリビューション用のカスタム バリデーターを使用できるようになります。 -
restapi.request_queue_sizeオプションを追加しました (Andrey Zhidenkov、Aleksei Sukhov)Patroni REST API によって使用される TCP ソケットのリクエスト キュー サイズを設定します。キューがいっぱいになると、それ以降のリクエストでは「Connection denied」エラーが発生します。デフォルト値は 5 です。
-
新しいクラスターを初期化するときに
initdbを直接呼び出します (Matt Baker)以前は
pg_ctlを介して呼び出されていましたが、initdbに渡すパラメーターの特別な引用符が必要でした。 -
停止前フックを追加 (Le Duane)
フックは
postgresql.before_stopを介して設定でき、pg_ctl stopの直前に実行されます。終了コードはシャットダウン プロセスには影響しません。 -
カスタム Postgres バイナリ名のサポートを追加しました (Israel Barth Rubio、Polina Bungina)
カスタム Postgres ディストリビューションを使用する場合、Postgres バイナリが、コミュニティの Postgres ディストリビューションで使用されるものとは異なる名前でコンパイルされる場合があります。カスタム バイナリ名は、
postgresql.bin_name.*設定項目およびPATRONI_POSTGRESQL_BIN_*環境変数を使用して構成できます。
改善点
-
patroni --validate-configのさまざまな改善 (Polina Bungina)bootstrap.initdbをオプションにします。これは新しいクラスターの場合にのみ必要ですが、構成に欠落しているとpatroni --validate-configがエラーを出しました。postgresql.bin_dirが空の場合、または設定されていない場合にエラーを発生させません。代わりに、まずデフォルトの PATH で Postgres バイナリを検索してみてください。postgresql.authentication.rewindセクションをオプションにします。これが存在しない場合、Patroni はスーパーユーザーを使用しています。
-
patronictl のエラーレポートを改善しました (Israel Barth Rubio)
\nシンボルは、実際の改行シンボルではなく、そのままレンダリングされました。
バグ修正
-
Citus サポートの問題を修正しました (Alexander Kukushkin)
昇格されたワーカーからコーディネーターへの REST API 呼び出しがスイッチオーバー中に失敗した場合、指定された Citus グループは無期限にブロックされたままになっていました。
-
patronictl の
--dcs-urlオプションでetcd3URL を許可します (Israel Barth Rubio)ユーザーが patronictl の
--dcs-urlオプションを介してetcd3URL を渡そうとすると、以前は例外が発生していました。
バージョン 3.0.2
2023-03-24 リリース
バージョン 3.0.2 は、3.6 よりも古い Python のサポートを終了しました。
新機能
-
同期スタンバイ レプリカ ステータスを
/metricsエンドポイントに追加しました (Thomas von Dein、Alexander Kukushkin)以前は
primary/standby_leader/replicaのみをレポートしていました。 -
patronictl での
PAGERのユーザーフレンドリーな処理 (Israel Barth Rubio)これにより、
PAGER環境変数を介してページャーを構成できるようになり、デフォルトのlessおよびmoreがオーバーライドされます。 -
K8s の再試行可能な HTTP ステータス コードを構成可能にする (Alexander Kukushkin)
一部の管理対象プラットフォームでは、ステータス コード
401 Unauthorizedを取得する可能性がありますが、数回再試行すると解決される場合があります。
改善点
-
recovery_target_actionがpromoteに設定されている場合にのみ、カスタム ブートストラップ中にhot_standbyをoffに設定します。 (Alexander Kukushkin)recovery_target_action=pauseを正しく動作させるために必要でした。 -
on_reloadコールバックが他のコールバックを強制終了することを許可しないでください。 (Alexander Kukushkin)on_start/on_stop/on_role_changeは通常、仮想 IP の追加/削除に使用されますが、on_reloadはそれらを妨げるべきではありません。 -
AWS コールバック サンプル スクリプトで
IMDSFetcherに切り替えました (Polina Bungina)IMDSv2では動作するトークンが必要ですが、IMDSFetcherはそれを透過的に処理します。
バグ修正
-
Kubernetes 上で実行されている Citus クラスターの
patronictl switchoverを修正しました (Lukáš Lalinský)defaultとは異なる名前空間では機能しませんでした。 -
メジャー バージョンが不明な場合は
PGDATAに書き込まないでください。 (Alexander Kukushkin)開始直後の
PGDATAが空だった場合 (まだマウントされていない可能性があります)、Patroni は、実際のメジャー バージョンが v10+ であっても、PostgreSQL バージョンについて誤った仮定を立て、誤ってrecovery.confファイルを作成していました。 -
コーディネーターフェイルオーバー後のCitusメタデータのバグを修正しました (Alexander Kukushkin)
citus_set_coordinator_host()呼び出しではメタデータの同期は発生せず、変更はワーカー ノードでは認識されませんでした。この問題は、citus_update_node()に切り替えることで解決されます。 -
すべての etcd ノードが “failed” である場合、構成ファイルにリストされている etcd ホストをフォールバックとして使用します (Alexander Kukushkin)
etcd クラスターは時間の経過とともにトポロジを変更する可能性があり、Patroni はそれに従おうとします。ある時点ですべてのノードが到達不能になった場合、Patroni は、再接続を試行するときに、構成のノードと最後に知られているトポロジの組み合わせを使用します。
バージョン 3.0.1
2023-02-16 リリース
バグ修正
-
on_role_changeコールバック スクリプトに適切なロール名を渡します。 (Alexander Kukushkin, Polina Bungina)Patroni は、昇格時に
promotedロールをon_role_changeコールバック スクリプトに誤って渡していました。渡されたロール名がmasterに戻されました。この回帰は 3.0.0 で導入されました。
バージョン 3.0.0
2023-01-30 リリース
このバージョンでは、Citus との統合が追加され、プライマリーを降格することなく、一時的な DCS の停止に耐えることが可能になります。
-
Version 3.0.0 は、Python 2.7 をサポートする最後のリリースです。今後のリリースでは、3.7 よりも古い Python バージョンのサポートが終了します。
-
RAFT サポートは非推奨になりました。メンテナンスには最善を尽くしますが、起こり得る問題については保証も責任も負いません。
-
このバージョンは、“master” を削除し、“primary” を使用するための最初のステップです。次のメジャー リリースへのアップグレードは、少なくとも 3.0.0 を実行している場合にのみ確実に機能します。
新機能
-
DCS フェイルセーフ モード (Alexander Kukushkin、Polina Bungina)
この機能が有効になっている場合、Patroni クラスターは一時的な DCS の停止にも耐えることができます。詳細については、ドキュメント を参照してください。
-
Citus サポート (Alexander Kukushkin、Polina Bungina、Jelte Fennema)
Patroni を使用すると、HA を使用した Citus クラスターのデプロイと管理が容易になります。詳細については、ここで ページを確認してください。
改善点
-
不明だがアクティブなレプリケーション スロットを削除するときに繰り返されるエラーを抑制しました (Michael Banck)
Patroni は引き続きこれらのログを書き込みますが、DEBUG にのみ書き込みます。
-
HA ループごとに監視クエリーを 1 つだけ実行します (Alexander Kukushkin)
同期レプリケーションが有効な場合はそうではありませんでした。
-
失敗した最新のデータ ディレクトリのみを保持する (William Albertus Dembo)
ブートストラップが失敗した場合、Patroni はタイムスタンプ サフィックスを付けて $PGDATA フォルダーの名前を変更するために使用されていました。今後、サフィックスは
.failedになり、そのようなフォルダーが存在する場合は、名前を変更する前に削除されます。 -
同期レプリケーション接続のチェックを改善しました (Alexander Kukushkin)
新しいホストが
synchronous_standby_namesに追加されると、pg_stat_replication.sync_state = 'sync'に加えてプライマリーに追いついた場合にのみ、DCS で同期として設定されます。
削除された機能
-
patronictl scaffoldを削除 (Alexander Kukushkin)これを導入した唯一の理由は、スタンバイ クラスターを実行する暫定的な回避策でした。
バージョン 2.1.7
2023-01-04 リリース
バグ修正
-
レガシー Python モジュールとの小さな非互換性を修正しました (Alexander Kukushkin)
これらにより、Debian buster/Ubuntu bionic上で Patroni をビルド/実行できなくなりました。
バージョン 2.1.6
2022-12-30 リリース
改善点
-
SSL ソケットのシャットダウン時の迷惑な例外を修正しました。 (Alexander Kukushkin)
HAProxy は、HTTP ステータス コードを取得するとすぐに接続を閉じているため、Patroni が SSL 接続を適切にシャットダウンする時間がありません。
-
arm64 用の Dockerfile の例を調整 (Polina Bungina)
明示的な
amd64とx86_64を削除します。libnss_files.so.*は削除しないでください。
セキュリティの向上
-
非レプリケーション接続に対して
search_path=pg_catalogを強制する (Alexander Kukushkin)Patroni はスーパーユーザー接続に大きく依存しているため、
pg_catalogの対応するオブジェクトと同じ名前と署名を持つpublicスキーマのユーザー定義関数や演算子を使用して実行される可能性のある攻撃から保護したいと考えています。そのため、Patroni によって作成されたすべての接続に対してsearch_path=pg_catalogが適用されます (レプリケーション接続を除く)。 -
パスワードが
pg_stat_statementsに記録されないようにする (Feike Steenbergen)これは、ユーザーの作成時に
pg_stat_statements.track_utility=offを設定することで実現されます。
バグ修正
-
proxy_addressをオプションとして宣言 (Denis Laxalde)これは事実上必須ではないオプションであるためです。
-
insecureオプションの動作を改善しました(Alexander Kukushkin)。
REST API要求にクライアント証明書を使用していると、ctlの
insecureオプションが正しく動作していませんでした。 -
新しいクラスターがブートストラップされるときに、
bootstrap.dcsからウォッチドッグ構成を取得します (Matt Baker)Patroni は、DCS のブートストラップに使用される構成を取得するのではなく、新しいクラスターをブートストラップするときにデフォルトでウォッチドッグを最初に構成していました。
-
WIN32で実行可能ファイルを探す際のファイル拡張子の扱いを修正しました(Martín Marqués)。
ファイル名に拡張子がまだない場合のみ、
.exeを追加してください。 -
Consul TTL 設定を修正 (Alexander Kukushkin)
HTTPClient で値を設定するときに
ttl/2.0を使用しましたが、クラスのプロパティで現在の値に 2 を乗算するのを忘れていました。その結果、Consul TTL が 2 倍ずれていました。
削除された機能
-
patronictl configureを削除 (Polina Bungina)個別の patronictl 構成作成はもう必要ありません。
バージョン 2.1.5
2022-11-28 リリース
このバージョンでは、PostgreSQL 15 との互換性が強化され、etcd v3 のサポートが実稼働対応として宣言されています。 Raft の Patroni はベータ版のままです。
新機能
-
patroni --validate-configの改善 (Denis Laxalde)構成が無効な場合はコード 1 で終了し、エラーを標準エラー出力に出力します。
-
一時停止中にレプリケーション スロットを削除しないでください。 (Alexander Kukushkin)
Patroni は、メンバーがクラスターに参加またはクラスターから離脱するときに、物理レプリケーション スロットを自動的に作成または削除します。一時停止中のスロットは削除されなくなります。
-
エンドポイントを監視するための
HEADリクエスト メソッドをサポートします (Robert Cutajar)GETの代わりに使用された場合、Patroni は HTTP ステータス コードのみを返します。 -
Windows での behave テストをサポート (Alexander Kukushkin)
新しい REST API エンドポイント
POST /sigtermを導入することにより、Windows で正常な Patroni シャットダウン (SIGTERM) をエミュレートします。 -
postgresql.proxy_addressの紹介 (Alexander Kukushkin)これは、DCS のメンバー キーに
proxy_urlとして書き込まれ、サービスの検出に使用または役立つ可能性があります。
安定性の向上
-
スレッドから
pg_replication_slot_advance()を呼び出します (Alexander Kukushkin)多くの論理レプリケーション スロットを持つビジーなクラスターでは、
pg_replication_slot_advance()呼び出しがメインの HA ループに影響を及ぼし、メンバー キーの有効期限が切れる可能性がありました。 -
古いプライマリーで
pg_rewindを呼び出す前に、欠落している可能性のある WAL をアーカイブします (Polina Bungina)プライマリーがクラッシュして長時間ダウンした場合、一部の WAL ファイルがアーカイブと新しいプライマリーから失われる可能性があります。
pg_rewindが古いプライマリーからこれらの WAL ファイルを削除し、スタンバイとして起動できなくなる可能性があります。readyWAL ファイルをアーカイブすることで、この問題が軽減されるだけでなく、一般的に継続的なアーカイブ エクスペリエンスが向上します。 -
Kubernetes サービスを作成しようとするときの
403エラーを無視する (Nick Hudson、Polina Bungina)Patroni は、サービスの作成に失敗してログをスパム送信していましたが、実際にはすでに存在している可能性があります。
-
liveness プローブの改善 (Alexander Kukushkin)
ハートビート ループがプライマリーの
ttlよりも長く実行されている場合、またはレプリカの2*ttlよりも長く実行されている場合、liveness プローブが失敗するようになります。これにより、Kubernetes 上の ウォッチドッグ の代替として使用できるようになります。 -
スイッチオーバー時に同期ノードのみがロックを取得しようとするようにしました。 (Alexander Kukushkin、Polina Bungina)
以前は、ターゲットを指定せずに手動スイッチオーバーが実行された場合、最新のデータを持つ非同期メンバーが、わずかな確率でリーダーになることがありました。
-
ブートストラップの実行中にクローン作成を避ける (Ants Aasma)
クラスターのブートストラップの実行中に、リーダーを必要としないレプリカ作成メソッドが起動されないようにします。
-
kazoo-2.9.0 との互換性 (Alexander Kukushkin)
Python のバージョンによっては、クローズされたソケットで
select()が呼び出された場合、SequentialThreadingHandler.select()メソッドでTypeError例外とIOError例外が発生する場合があります。 -
ソケットのシャットダウン前にSSL接続を明示的にシャットダウンしました。 (Alexander Kukushkin)
これを行わないと、OpenSSL 3.0 で
unexpected eof while readingエラーが発生しました。 -
prettytable>=2.2.0との互換性 (Alexander Kukushkin)内部の API 変更により、クラスター名のヘッダーが間違った行に表示されていました。
バグ修正
-
Etcd lease_grant の期限切れトークンを処理 (monsterxx03)
エラーが発生した場合は、新しいトークンを取得してリクエストを再試行します。
-
GET /read-only-syncエンドポイントのバグを修正しました (Alexander Kukushkin)これは以前のリリースで導入されましたが、実際には機能しませんでした。
-
データ ディレクトリ ストレージが消失した場合の処理 (Alexander Kukushkin)
Patroni は、PGDATA が存在し、空でないことを定期的にチェックしますが、ストレージに問題が発生した場合、
os.listdir()はOSError例外を発生させ、ハートビート ループを中断します。 -
ユーザー バックエンドが閉じるのを待機するときに
master_stop_timeoutを適用します (Alexander Kukushkin)ユーザー バックエンドのように見えるものは、実際には停止に失敗しているバックグラウンド ワーカー (Citus Maintenance Daemonなど) である可能性があります。
-
postgresql.listenに対して*:<port>を受け入れます (Denis Laxalde)patroni --validate-configは無効であると訴えていました。 -
Raft でのタイムアウトの修正 (Alexander Kukushkin)
Patroni または patronictl は、起動時に既知のメンバーから Raft クラスター トポロジを取得しようとします。これらの呼び出しは適切なタイムアウトなしで行われました。
-
トークンが変更された場合に Consul サービスを強制的に更新 (John A. Lotoski)
そうしないと、「rpc error making call: rpc error making call: ACL not found」というエラーが発生します。
バージョン 2.1.4
2022-06-01 リリース
新機能
-
典型的な Debian/Ubuntu システムでの
pg_rewindの動作を改善しました (Gunnar “Nick” Bluth)postgresql.confをデータ ディレクトリの外に保持する Postgres セットアップ (例: Ubuntu/Debian パッケージ) では、pg_rewind --restore-target-walはrestore_commandの値を把握できません。 -
Consul サービス チェックで
TLSServerNameの設定を許可する (Michael Gmelin)チェックが IP によって実行され、Consul
node_nameが FQDN ではない場合に便利です。 -
ウォッチドッグに
ppc64leサポートを追加しました (Jean-Michel Scheiwiler)また、一部の非 x86 プラットフォームでのウォッチドッグのサポートが修正されました。
-
aws.py コールバックを
botoからboto3に切り替えました (Alexander Kukushkin)
boto2.x は 2018 以降放棄され、Python 3.9 で失敗します。
-
K8s 上のサービス アカウント トークンを定期的に更新 (Haitao Li)
Kubernetes v1.21 以降、サービス アカウント トークンは 1 時間で期限切れになります。
-
/read-only-sync監視エンドポイントを追加しました (Dennis4b)これは
/read-onlyに似ていますが、同期レプリカのみが含まれます。
安定性の向上
-
プライマリーとの論理デコード設定に構成の不一致がある場合は、論理レプリケーション スロットをレプリカにコピーしないでください。 (Alexander Kukushkin)
スロットが
pluginまたはdatabase構成オプションと一致しない場合、レプリカはプライマリーから論理レプリケーション スロットをコピーしなくなります。以前は、スロットがこれらの構成オプションと一致するかどうかのチェックは、レプリカがスロットをコピーしてそれを使用して開始するまで実行されず、不必要な再起動が繰り返されていました。 -
PostgreSQL v12+ のリカバリ構成パラメーターの特別な処理 (Alexander Kukushkin)
レプリカとして開始するとき、Patroni は、
pg_settingsからクエリーする代わりに現在のパラメーター値をキャッシュすることで、リーダー アドレスが変更された場合にpostgresql.confを更新し、再起動/リロードできる必要があります。 -
postgresql.listenパラメータでの IPv6 アドレスの処理が改善されました (Alexander Kukushkin)listenパラメータにはポートがあるため、IPv6 アドレスを角括弧内に入れようとしますが、リストに複数の IP がある場合、角括弧は正しく削除されませんでした。 -
ダイバージェンス チェック時に
replication資格情報を使用するのは PostgreSQL v10 以前のみとする (Alexander Kukushkin)rewindが有効な場合、Patroni は、新しい Postgres バージョンでsuperuserまたはrewind資格情報を再度使用します。
バグ修正
-
dateutil.parserのインポートが欠落していたのを修正しました (Wesley Mendes)テストが失敗しなかったのは、それが他のモジュールからもインポートされていたためです。
-
optimeアノテーションが文字列であることを確認します。 (Sebastian Hasler)場合によっては、Patroni が数値として渡そうとしていました。
-
失敗した
pg_rewind試行の処理を改善しました (Alexander Kukushkin)pg_rewind中にプライマリーが使用できなくなると、$PGDATAは壊れた状態のままになります。その後、構成で許可されていない場合でも、Patroni はデータ ディレクトリを削除します。 -
PostgreSQL の準備ができていない場合は、リーダー
ConfigMap/Endpointからslotsアノテーションを削除しないでください。 (Alexander Kukushkin)slots値が渡されない場合、アノテーションは現在の値を保持します。 -
K8s API ウォッチャーの同時実行の問題を処理 (Alexander Kukushkin)
特定の (未知の) 条件下では、ウォッチャーが古い状態のままになる可能性があります。その結果、
attempt_to_acquire_leader()メソッドは、HTTP ステータス コード 409 により失敗する可能性があります。その場合、ウォッチャーの接続をリセットし、最初から再起動します。
バージョン 2.1.3
2022-02-18 リリース
新機能
-
patronictl の暗号化された TLS キーのサポートを追加しました。 (Alexander Kukushkin)
これは、
ctl.keyfile_passwordまたはPATRONI_CTL_KEYFILE_PASSWORD環境変数を介して構成できます。 -
/metrics エンドポイントにメトリクスを追加しました (Alexandre Pereira)
具体的には、
patroni_pending_restartとpatroni_is_pausedです。 -
スタンバイクラスター構成で複数ホストを指定できるようにしました。 (Michael Banck)
スタンバイ クラスターが Patroni クラスターからレプリケートされている場合は、PostgreSQL v10 以降の
libpqで利用できるクライアント側のフェイルオーバーを利用するとよいでしょう。つまり、スタンバイ リーダーのprimary_conninfoと、接続文字列のtarget_session_attrs=read-writeを設定するpg_rewindです。pgpassファイルは複数行 (ホストごとに 1 行) で生成され、プライマリー クラスター ノードでCHECKPOINTを呼び出す代わりに、スタンバイ クラスターはpg_controlが更新されるのを待ちます。
安定性の向上
-
従来の
psycopg2との互換性 (Alexander Kukushkin)たとえば、Ubuntu 18.04 パッケージからインストールされた
psycopg2には、UndefinedFile例外がまだありません。 -
すべての etcd ノードが応答しない場合は
etcd3ウォッチャーを再起動します (Alexander Kukushkin)ウォッチャーが生きている場合、すべての etcd ノードに障害が発生していても、
get_cluster()メソッドは古い情報を返し続けます。 -
一時停止中にスタンバイクラスターのリーダーロックを削除しないでください。 (Alexander Kukushkin)
以前は、ロックはスタンバイ リーダーではなくプライマリーとして実行されているノードによってのみ維持されていました。
バグ修正
-
スタンバイ リーダー ブートストラップのバグを修正しました (Alexander Kukushkin)
Patroni は、Postgres が 60 秒後に接続の受け入れを開始しない場合、ブートストラップが失敗したとみなしていました。このバグは 2.1.2 リリースで導入されました。
-
カスケード スタンバイへのフェイルオーバーに関するバグを修正しました (Alexander Kukushkin)
カスケード スタンバイでどのスロットを作成するかを判断する際、リーダーが存在しない可能性があることを考慮するのを忘れていました。
-
Postgres 構成バリデーターの小さな問題を修正しました (Alexander Kukushkin)
PostgreSQL v14 で導入された整数パラメータは、validator.py で最小値と最大値が引用符で囲まれていたため、検証に失敗していました。
-
リーダーのステータスを確認するときにレプリケーション資格情報を使用する (Alexander Kukushkin)
remove_data_directory_on_diverged_timelinesが設定されているものの、rewind_credentialsが定義されておらず、ノード間のスーパーユーザー アクセスが許可されていない可能性があります。 -
REST API 証明書の置換での「ポートが使用中」エラーを修正しました (Ants Aasma)
証明書を切り替えるときに、同時の API リクエストで競合状態が発生しました。交換期間中にアクティブな API リクエストがある場合、交換はポート使用中エラーでエラーとなり、Patroni はアクティブな API サーバーがない状態でスタックします。
-
パスワードに
%文字が含まれている場合のクラスター ブートストラップのバグを修正しました。 (Bastien Wirtz)ブートストラップ メソッドは、すべてのパラメーターを適切に引用符で囲んで
DOブロックを実行しますが、cursor.execute()メソッドはパラメーターが渡された空のリストを好みませんでした。 -
「AttributeError: no attribute ’leader’」例外を修正しました。 (Hrvoje Milković)
これは、同期モードが有効で、DCS コンテンツが消去された場合に発生する可能性があります。
-
発散タイムラインチェックのバグを修正しました (Alexander Kukushkin)
Patroni は、タイムラインが分岐していると誤って想定していました。 pg_rewind の場合は問題は発生しませんでしたが、pg_rewind が許可されておらず、
remove_data_directory_on_diverged_timelinesが設定されている場合は、以前のリーダーが再初期化されることになります。
バージョン 2.1.2
2021-12-03 リリース
新機能
-
psycopg>=3.0との互換性 (Alexander Kukushkin)デフォルトでは、
psycopg2が優先されます。psycopg>=3.0は、psycopg2が利用できない場合、またはバージョンが古すぎる場合にのみ使用されます。 -
dcs_last_seenフィールドを REST API に追加します (Michael Banck)このフィールドには、クラスター メンバーが最後に (UNIX エポックとして) DCS と正常に通信した時刻が記録されます。これは、ネットワーク パーティションの特定や分析に役立ちます。
-
pg_controldataが「shut down」を報告したときにリーダーのロックを解除します。 (Alexander Kukushkin)archive_commandが遅い/障害が発生している場合のスイッチオーバー/シャットダウンが遅いという問題を解決するために、Patroni は、pg_controldataが PGDATA が正常に終了した状態shut downであると報告し始め、すべての変更を受信したレプリカが少なくとも 1 つあることを確認した直後にリーダー キーを削除します。この条件を満たすレプリカがない場合、リーダー キーは削除されず、古い動作が保持されます。つまり、Patroni はロックを更新し続けます。 -
sslcrldir接続パラメータのサポートを追加しました (Kostiantyn Nemchenko)新しい接続パラメータが PostgreSQL v14 に導入されました。
-
Zookeeper で ZNode の ACL 設定を許可する (Alwyn Davis)
新しい構成オプション
zookeeper.set_aclsを導入して、Kazoo が作成する各 ZNode にデフォルトの ACL を適用するようにします。
安定性の向上
-
次回のリカバリの試行を次の HA ループまで遅らせます。 (Alexander Kukushkin)
(たとえば) ディスク容量不足により Postgres がクラッシュし、そのために起動に失敗した場合、Patroni は熱心にリカバリしようとするため、ログが溢れます。
-
降格する前にログを追加します。これには時間がかかる場合があります (Michael Banck)
降格が完了するまでに時間がかかる場合があり、ログを見ても実際に何が起こっているのかが明らかではない場合があります。
-
「I am」ステータス メッセージを改善しました (Michael Banck)
no action. I am a secondary ({0})とno action. I am ({0}), a secondary -
wal_keep_sizeに変換するときにwal_keep_segmentsを int にキャストする (Jorge Solórzano)wal_keep_segmentsをグローバル 動的構成 の文字列として指定することができますが、Python は動的に型付けされた言語であるため、文字列は単純に乗算されます。例:wal_keep_segments: "100"は100100100100100100100100100100100100100100100100MBに変換されました。 -
同期レプリケーションが有効な場合、同期ノードのみにスイッチオーバーを許可します。 (Alexander Kukushkin)
それに加えて、ノードは既知の同期ノードに対してのみリーダー選挙を行います。
-
Postgres が遅い場合にキャッシュされたロールをフォールバックとして使用します。 (Alexander Kukushkin)
極端な場合には、Postgres が非常に遅くなり、通常の監視クエリーが数秒で終了しないことがあります。
statement_timeout例外が適切に処理されないと、リーダー キーの有効期限が切れたり、更新が失敗したりしたときに、Postgres が時間どおりに降格されないという状況が発生する可能性があります。このような例外が発生した場合、Patroni はキャッシュされたroleを使用して、Postgres がプライマリーとして実行されているかどうかを判断します。 -
メンバー ZNode の不必要な更新を回避します (Alexander Kukushkin)
メンバー データの値が変更されていない場合、更新は行われません。
-
プロモート後のチェックポイントの最適化 (Alexander Kukushkin)
最新のタイムラインがすでに
pg_controlに保存されている場合は、CHECKPOINTを実行しないでください。initdbで新しいクラスターを初期化した直後の不要なCHECKPOINTを回避するのに役立ちます。 -
同期ノードを選択する際に
nofailoverのないメンバーを優先します (Alexander Kukushkin)以前は、同期ノードはレプリケーション ラグにのみ基づいて選択されていたため、
nofailoverタグを持つノードは、他のノードと同じ確率で同期ノードになる可能性がありました。プライマリーに障害が発生した場合、フェイルオーバーが自動的に実行できないため、この動作は混乱を招くと同時に危険でもありました。 -
etcd マシン キャッシュから重複したホストを削除します (Michael Banck)
etcd クラスター内のアドバタイズされたクライアント URL が正しく構成されていない可能性があります。この場合、Patroni 内の重複を削除するのは簡単な成果です。
バグ修正
-
スロット管理中に一時レプリケーション スロットをスキップします (Alexander Kukushkin)
v10 から開始すると、
pg_basebackupは WAL ストリーミング用の一時レプリケーション スロットを作成しますが、スロット名が不明であるため、Patroni はそれを削除しようとしていました。これを修正するために、pg_replication_slotsビューをクエリーするときにすべての一時スロットをスキップします。 -
pg_replication_slot_advance()がタイムアウトしないようにします (Alexander Kukushkin)この場合、Patroni はデフォルトの
statement_timeoutを使用していたため、呼び出しが失敗すると回復できない可能性が非常に高く、その結果、pg_walとpg_catalogのサイズが増大して肥大化します。 -
/statusは降格時に更新されませんでした (Alexander Kukushkin)PostgreSQL を降格した後、古いリーダーは DCS 内の最後の LSN を更新します。
2.1.0から、新しい/statusキーが導入されましたが、optime は依然として/optime/leaderに書き込まれていました。 -
降格時に DCS 例外を処理します (Alexander Kukushkin)
リーダー ロックの更新に失敗したためにマスターを降格しているときに、DCS が完全にダウンし、
get_cluster()呼び出しで例外が発生する可能性があります。適切に処理されないと、DCS が回復するまで Postgres が停止したままになります。 -
use_unix_socket_replが機能しない場合もありました (Alexander Kukushkin)具体的には、
postgresql.unix_socket_directoriesが設定されていない場合です。この場合、Patroni はlibpqのデフォルト値を使用することになります。 -
Patroni REST API に関するいくつかの問題を修正しました (Alexander Kukushkin)
clusters_unlockedが未定義の場合があり、GET /metricsエンドポイントで例外が発生しました。さらに、エラー処理方法では、connect_addressタプルには常に 2 つの要素があると想定していましたが、実際には IPv6 の場合はさらに多くの要素がある可能性があります。 -
巻き戻しを決定する前に、新しく昇格したノードが回復を完了するまで待ちます。 (Alexander Kukushkin)
実際のプロモーションが行われて新しいタイムラインが作成されるまでには、しばらく時間がかかる場合があります。待機せずに、レプリカは巻き戻しが必要ではないという結論に達する可能性があります。
-
巻き戻しを決定する際に、履歴ファイル内で欠落しているタイムラインを処理するようになりました。 (Alexander Kukushkin)
現在のレプリカ タイムラインがプライマリーの履歴ファイルにない場合、レプリカは巻き戻しが必要ないと誤って想定していました。
バージョン 2.1.1
2021-08-19 リリース
新機能
-
ETCD SRV 名前サフィックスのサポート (David Pavlicek)
etcd を使用すると、同じドメイン内の複数の etcd クラスターを区別できるようになり、Patroni もこの機能をサポートするようになりました。
-
履歴に新しいリーダー情報を追加 (huiyalin525)
新しい列が
patronictl history出力に追加されます。 -
CA バンドルをクラスター内 Kubernetes 構成用に構成可能にします (Aron Parsons)
デフォルトでは、Patroni は
/var/run/secrets/kubernetes.io/serviceaccount/ca.crtを使用しており、この新機能によりカスタムkubernetes.cacertを指定できます。 -
Consul サービスとしての動的な登録/登録解除とタグの変更をサポートします (Tommy Li)
以前は、Patroni の再起動が必要でした。
バグ修正
-
REST API の不必要なリロードを回避します (Alexander Kukushkin)
以前のリリースでは、ディスク上で変更された場合に REST API 証明書を再ロードする機能が追加されました。残念ながら開始直後に無条件でリロードが発生してしまいました。
-
etcd.use_proxiesが設定されている場合はクラスター メンバーを解決しません。 (Alexander Kukushkin)Patroni は起動時にメンバーのリストをクエリーして etcd クラスターの健全性をチェックします。それに加えて、ホスト名を解決しようとしましたが、これはプロキシ経由で etcd を操作する場合には必要なく、不要な警告を引き起こしていました。
-
pg_stat_replication内の NULL 値を持つ行をスキップします (Alexander Kukushkin)state = 'streaming'の場合でも、pg_stat_replicationビューのreplay_lsn、flush_lsn、またはwrite_lsnフィールドに NULL 値が含まれる可能性があるようです。
バージョン 2.1.0
2021-07-06 リリース
このバージョンでは、PostgreSQL v14 との互換性が追加され、論理レプリケーション スロットがフェイルオーバー/スイッチオーバーを切り抜けられるようになり、REST API の許可リスト (allowlist) のサポートが実装され、ログの数もハートビートごとに 1 行に削減されます。
新機能
-
PostgreSQL v14 との互換性 (Alexander Kukushkin)
Patroni 自体が “pause” モードでない場合は、WAL 再生の一時停止を解除します。プライマリーの
max_connectionsなどの特定のパラメーターの変更により、“paused” になる可能性があります。 -
フェイルオーバー論理スロット (Alexander Kukushkin)
PostgreSQL v11+ で、フェイルオーバー/スイッチオーバーをまたいで論理レプリケーション スロットを存続させます。 レプリケーション スロットは、再起動によってプライマリーからレプリカにコピーされ、その後、pg_replication_slot_advance() 関数を使用して前に移動されます。その結果、スロットはフェイルオーバー前にすでに存在しており、イベントは失われないはずですが、一部のイベントが複数回配信される可能性があります。
-
Patroni REST API の許可リストを実装しました (Alexander Kukushkin)
構成されている場合、ルールに一致する IP のみが安全でないエンドポイントの呼び出しを許可されます。それに加えて、クラスターのメンバーの IP をリストに自動的に含めることもできます。
-
UNIX ソケット経由のレプリケーション接続のサポートを追加しました (Mohamad El-Rifai)
以前は、Patroni はレプリケーション接続に常に TCP を使用していたため、SSL 検証で問題が発生する可能性がありました。 UNIX ソケットを使用すると、レプリケーション ユーザーを SSL 検証から免除できます。
-
ユーザー定義タグのヘルスチェック (Arman Jafari Tehrani)
事前定義されたタグ: とともに、
patronictl list出力および REST API に表示されるカスタム タグをいくつでも指定できます。今後、ヘルスチェックでカスタムタグを使用できるようになります。 -
Prometheus
/metricsエンドポイントを追加しました (Mark Mercado、Michael Banck)/patroniと同じメトリクスを公開するエンドポイント。 -
Patroni ログのおしゃべり性を軽減しました (Alexander Kukushkin)
すべてが正常に進むと、HA ループの実行ごとに 1 行だけが書き込まれます。
後方互換性のない変更
-
古い
permanent logical replication slots機能は、PostgreSQL v10 以前では動作しなくなります。 (Alexander Kukushkin)プロモーションの実行後に論理スロットを作成する戦略では、論理イベントが失われないことを保証できないため、無効化されました。
-
ノードがロックを保持している場合、
/leaderエンドポイントは常に 200 を返します (Alexander Kukushkin)スタンバイ クラスターを昇格するには、ロード バランサーのヘルス チェックを更新する必要がありますが、これはあまり便利ではなく、忘れがちです。これを解決するために、
/leaderヘルス チェック エンドポイントの動作を変更します。通常のクラスターであるか standby_cluster であるかを考慮せずに、200 を返します。
Raft サポートの改善
-
Raft トラフィック暗号化の信頼できるサポート (Alexander Kukushkin)
PySyncObjのさまざまな問題により、暗号化サポートは非常に不安定でした -
Raft 実装における DNS の問題を処理します (Alexander Kukushkin)
self_addrおよび/またはpartner_addrsが IP の代わりに DNS 名を使用して構成されている場合、PySyncObjはオブジェクトの作成時に 1 回だけ効果的に解決を実行していました。同じノードが別の IP でオンラインに戻ると問題が発生していました。
安定性の向上
-
psycopg2-2.9+との互換性 (Alexander Kukushkin)psycopg2では、autocommit = Trueはwith connectionブロックで無視され、レプリケーション プロトコル接続が切断されます。 -
Zookeeper で実行される過剰な HA ループを修正しました。 (Alexander Kukushkin)
メンバー ZNodes の更新により連鎖反応が発生し、HA ループが連続して複数回実行されることになりました。
-
REST API 証明書がディスク上で変更された場合、リロードします (Michael Todorovic)
REST API 証明書ファイルがその場で (in place) 更新された場合、Patroni はリロードを実行していませんでした。
-
kerberos 認証が使用されている場合は pgpass ディレクトリを作成しないでください。 (Kostiantyn Nemchenko)
Kerberos とパスワード認証は相互に排他的です。
-
カスタム ブートストラップに関する小さな問題を修正しました (Alexander Kukushkin)
PITR を実行する場合にのみ Postgres を
hot_standby=offで開始し、PITR が完了した後に再起動します。
バグ修正
-
kazoo-2.7+との互換性 (Alexander Kukushkin)Patroni は独自に再試行を処理するため、使用可能な接続がない場合は Zookeeper クラスターへのリクエストが直ちに破棄されるという
kazooの古い動作に依存しています。 -
プロキシ経由で接続していることがわかっている場合、etcd v3 クラスターのバージョンを明示的に要求します。 (Alexander Kukushkin)
Patroni は、gRPC-gateway 経由で etcd v3 クラスターと連携しており、クラスターのバージョンに応じて、異なるエンドポイント (
/v3、/v3beta、または/v3alpha) を使用する必要があります。このバージョンはクラスター トポロジと一緒にのみ解決されましたが、プロキシ経由で接続する場合は後者が実行されなかったためです。
バージョン 2.0.2
2021-02-22 リリース
新機能
-
外部管理のレプリケーション スロットを無視する機能 (James Coleman)
Patroni は、未知のレプリケーション スロットを削除しようとしていますが、レプリケーション スロットを外部で管理する必要がある場合は確かにあります。今後は、削除してはならないスロットを設定できるようになります。
-
REST API の暗号スイート制限のサポートを追加しました (Gunnar “Nick” Bluth)
これは、
restapi.ciphersまたはPATRONI_RESTAPI_CIPHERS環境変数を介して構成できます。 -
REST API の暗号化された TLS キーのサポートを追加しました (Jonathan S. Katz)
これは、
restapi.keyfile_passwordまたはPATRONI_RESTAPI_KEYFILE_PASSWORD環境変数を介して構成できます。 -
REST API 認証資格情報の定数時間比較 (Alex Brasetvik)
タイミング攻撃に対して脆弱な
==の代わりにhmac.compare_digest()を使用してください。 -
レプリケーション ラグに基づいて同期ノードを選択する (Krishna Sarabu)
同期ノード上のレプリケーション ラグが設定されたしきい値を超え始めた場合、そのノードは非同期に降格されるか、他のノードに置き換えられるか、あるいはその両方になる可能性があります。動作は
maximum_lag_on_syncnodeで制御されます。
安定性の向上
-
カスタム ブートストラップを実行するときに
hot_standby = offで postgres を開始します (Igor Yanchenko)カスタム ブートストラップ中、Patroni はベースバックアップを復元し、Postgres を起動して、リカバリが完了するまで待機します。スタンバイ上の一部の PostgreSQL パラメーターはプライマリーよりも小さくすることができず、新しい値 (WAL から復元された) が構成された値より大きい場合、Postgres はパニックを起こして停止します。このような動作を回避するために、
hot_standbyモードを使用せずにカスタム ブートストラップを実行します。 -
必要なウォッチドッグが正常でない場合にユーザーに警告します。 (Nicolas Thauvin)
required モードでウォッチドッグ デバイスに書き込めないか、デバイスが存在しない場合、メンバーを昇格することはできません。この構成ミスを検索する場所をユーザーに示す警告を追加しました。
-
シングルユーザー モードのリカバリのログ出力を詳しくする (Alexander Kukushkin)
Patroni が PostgreSQL が正常にシャットダウンされていないことに気付いた場合、場合によっては、Postgres をシングル ユーザー モードで起動することによってクラッシュ リカバリが実行されます。 (ディスク上のスペース不足などにより) リカバリが失敗しても、エラーが飲み込まれる可能性があります。
-
python-consul2モジュールとの互換性を追加しました (Alexander Kukushkin、Wilfried Roset)古き良き
python-consulは数年前からメンテナンスされていないため、誰かが新機能とバグ修正を備えたフォークを作成しました。 -
patronictl を実行する場合は
bypass_api_serviceを使用しないでください。 (Alexander Kukushkin)K8s ポッドが非
default名前空間で実行されている場合、Kubernetes エンドポイントをクエリーするための十分な権限があるとは限りません。この場合、Patroni は警告を表示し、bypass_api_service設定を無視します。 patronictl の場合、警告は少し面倒でした。 -
raft.data_dirが存在しない場合は作成するか、書き込み可能であることを確認してください (Mark Mercado)ユーザーフレンドリー性と使いやすさが向上します。
バグ修正
-
一時停止中にリーダーのロックが失われた場合、再起動またはプロモートを中断しないでください。 (Alexander Kukushkin)
一時停止中は、ロックなしで postgres をプライマリーとして実行できます。
-
REST API の
shutdown_request()に関する問題を修正しました (Nicolas Limage)SSL 接続の処理を改善し、スレッドが開始されるまでハンドシェイクを遅らせるために、Patroni は
HTTPServerのいくつかのメソッドをオーバーライドします。shutdown_request()メソッドが忘れられていました。 -
Zookeeper使用時のスリープ時間の問題を修正しました。 (Alexander Kukushkin)
HA コードの実行の間に、Patroni が最大 2 倍長くスリープしている可能性がありました。
-
ブートストラップの失敗後にデータ ディレクトリを移動するときの無効な
os.symlink()呼び出しを修正しました。 (Andrew L’Ecuyer)ブートストラップが失敗した場合、Patroni はデータ ディレクトリ、pg_wal、およびすべてのテーブルスペースの名前を変更します。その後、シンボリックリンクを更新して、ファイルシステムの一貫性を保ちます。
src引数とdst引数が交換されているため、シンボリックリンクの作成は失敗していました。 -
post_bootstrap() メソッドのバグを修正しました (Alexander Kukushkin)
スーパーユーザーのパスワードが構成されていない場合、Patroni は
post_initスクリプトの呼び出しに失敗し、そのためブートストラップ全体が失敗していました。 -
スタンバイ クラスターの pg_rewind に関する問題を修正しました (Alexander Kukushkin)
スーパーユーザー名が
postgresと異なる場合は、接続文字列にデータベース名が含まれていないため、スタンバイ クラスターのpg_rewindが失敗していました。 -
Etcd v3 による認証が明示的に失敗した場合のみ終了します。 (Alexander Kukushkin)
起動時に Patroni は etcd クラスター トポロジの検出を実行し、必要に応じて認証を行います。 etcd サーバーの 1 つがアクセスできず、Patroni がこのサーバーで認証を実行しようとして、次のノードで再試行せずに失敗することが考えられます。
-
psutil cmdline() が空のリストを返す場合の処理 (Alexander Kukushkin)
ゾンビプロセスは依然としてポストマスターの子ですが、cmdline() を持っていません。
-
PATRONI_KUBERNETES_USE_ENDPOINTS環境変数をブール値として扱います。 (Alexander Kukushkin)そうしないと、環境経由で
kubernetes.use_endpointsを無効にすることができなくなりました。 -
同時エンドポイント更新エラーの処理を改善しました (Alexander Kukushkin)
Patroni は現在のエンドポイント オブジェクトを明示的にクエリーし、現在のポッドがまだリーダー ロックを保持していることを確認して、更新を繰り返します。
バージョン 2.0.1
2020-10-01 リリース
新機能
-
lessが利用できない場合、patronictl edit-configのページャーとしてmoreを使用する (Pavel Golub)Windows では、
more.comになります。それに加えて、requirements.txtではcdiffがydiffに変更されましたが、patronictl は互換性のために両方をサポートしています。 -
raftbind_addrおよびpasswordのサポートを追加しました (Alexander Kukushkin)raft.bind_addrは、NAT の背後で実行する場合に便利です。raft.passwordはトラフィック暗号化を有効にします (cryptographyモジュールが必要です)。 -
sslpassword接続パラメータのサポートを追加しました (Kostiantyn Nemchenko)接続パラメーターは PostgreSQL 13 で導入されました。
安定性の向上
-
一時停止時の動作を変更しました (Alexander Kukushkin)
PGDATAディレクトリが見つからない、または空の場合、Patroni はbootstrapメソッドを呼び出しません。- Patroni は、一時停止中に sysid が一致しない場合には終了せず、警告をログに記録するだけです。
- Postgres がリカバリ中ではなく実行されている (書き込みを受け入れている) が、sysid が初期化キーと一致しない場合、ノードは一時停止モードでリーダー キーを取得しようとしません。
-
クラッシュ リカバリの実行時に
master_start_timeoutを適用します (Alexander Kukushkin)Postgres がリーダー ノードでクラッシュした場合、Patroni はシングル ユーザー モードで Postgres を起動することによってクラッシュ リカバリを実行します。クラッシュリカバリ中に、リーダーのロックが更新されます。クラッシュ リカバリが
master_start_timeout秒以内に終了しなかった場合、Patroni はクラッシュ リカバリを強制的に停止し、リーダー ロックを解放します。 -
urllib3要件からsecureエクストラを削除しました (Alexander Kukushkin)これを追加した唯一の理由は、Python 2.7 の
ipaddress依存関係でした。
バグ修正
-
Kubernetes.update_leader()のバグを修正しました。 (Alexander Kukushkin)リーダー オブジェクトの更新が失敗した場合、未処理の例外によりプライマリーの降格が妨げられていました。
-
RAFT 使用時のハングする patronictl を修正しました。 (Alexander Kukushkin)
Patroni 構成で patronictl を使用する場合、
self_addrをpartner_addrsに追加すべきです。 -
get_guc_value()のバグを修正しました (Alexander Kukushkin)Patroni は、PostgreSQL 12 の
restore_commandの値の取得に失敗していたため、pg_rewindの欠落している WAL を取得できませんでした。
バージョン 2.0.0
2020-09-02 リリース
このバージョンでは、PostgreSQL 13 との互換性が強化され、複数の同期スタンバイのサポートが追加され、pg_rewind の処理が大幅に改善され、Etcd v3 のサポートと、純粋な RAFT (etcd、Consul、Zookeeper なし) 上の Patroni のサポートが追加され、オプションで pre_promote (フェンシング) スクリプトを呼び出すことが可能になります。
PostgreSQL 13 のサポート
-
PostgreSQL 13+ で
standby_leaderに昇格するときにon_reloadを起動しないでください。 (Alexander Kukushkin)standby_leaderに昇格する場合、primary_conninfoを変更し、ロールを更新して、Postgres をリロードします。on_role_changeとon_reloadは実質的に相互に重複するため、Patroni はon_role_changeのみを呼び出します。 -
gssencmodeおよびchannel_binding接続パラメータのサポートを追加しました。 (Alexander Kukushkin)PostgreSQL 12 では
gssencmodeが、PostgreSQL 13 ではchannel_binding接続パラメーターが導入され、postgresql.authenticationセクションで定義されている場合はそれらを使用できるようになりました。 -
wal_keep_segmentsからwal_keep_sizeへの名前変更を処理 (Alexander Kukushkin)構成に誤りがある場合 (13 では
wal_keep_segments、古いバージョンではwal_keep_size)、Patroni が自動的に構成を調整します。 -
可能であれば、13 で
pg_rewindを--restore-target-walとともに使用してください (Alexander Kukushkin)PostgreSQL 13 では、Patroni が
restore_commandが構成されているかどうかを確認し、pg_rewindにそれを使用するように指示します。
新機能
-
純粋な RAFT に Patroni のサポートを実装しました。 (Alexander Kukushkin)
これにより、etcd、Consul、Zookeeper などのサードパーティの依存関係なしで Patroni を実行できるようになります。 HA の場合は、3 つの Patroni ノード、または Patroni を含む 2 つのノードと
patroni_raft_controllerを含む 1 つのノードを実行する必要があります。詳細については、ドキュメント を確認してください。 -
gRPC ゲートウェイ経由で etcd v3 プロトコルのサポートを実装しました (Alexander Kukushkin)
etcd 3.0 は 4 年以上前にリリースされており、etcd 3.4 では v2 がデフォルトで無効になっています。 v2 が etcd から完全に削除される可能性もあるため、etcd v3 のサポートを Patroni に実装しました。これを使用するには、Patroni 構成ファイルに
etcd3セクションを明示的に作成する必要があります。 -
複数の同期スタンバイのサポート (Krishna Sarabu)
これにより、複数の同期レプリカを含むクラスターを実行できます。同期レプリカの最大数は、新しいパラメータ
synchronous_node_countによって制御されます。デフォルトでは 1 に設定されており、synchronous_mode がoffに設定されている場合は効果がありません。 -
pre_promoteスクリプトを呼び出す可能性を追加しました (Sergey Dudoladov)コールバックとは異なり、
pre_promoteスクリプトは、リーダー ロックを取得した後、Postgres をプロモートする前に同期的に呼び出されます。スクリプトが失敗するか、ゼロ以外の終了コードで終了すると、現在のノードはリーダー ロックを解放します。 -
構成ディレクトリのサポートを追加しました (Floris van Nee)
ディレクトリ内の YAML ファイルがアルファベット順にロードされ、適用されます。
-
PostgreSQL パラメータの高度な検証 (Alexander Kukushkin)
特定のパラメーターが現在の PostgreSQL バージョンでサポートされていない場合、またはその値が正しくない場合、Patroni はパラメーターを完全に削除するか、値の修正を試みます。
-
プロモート後の強制チェックポイントが完了したらメインスレッドを起こします。 (Alexander Kukushkin)
レプリカは、DCS のリーダーのメンバー キーを介してチェックポイントの指示を待っています。通常、キーは HA ループごとに 1 回だけ更新されます。メインスレッドを起こさないと、レプリカは必要以上に最大
loop_wait秒長く待機する必要があります。 -
9.6+ での
pg_stat_wal_receiverビューの使用 (Alexander Kukushkin)ビューには
primary_conninfoとprimary_slot_nameの最新の値が含まれていますが、recovery.confの内容は古い可能性があります。 -
Patroni 設定ファイルでの IPv6 アドレスの処理を改善しました (Mateusz Kowalski)
IPv6 アドレスは角括弧で囲む必要がありますが、Patroni はプレーンなアドレスを取得することを期待していました。現在は両方の形式がサポートされています。
-
Consul
service_tags設定パラメータを追加しました (Robert Edström)これらは、ロード バランサーなどによる動的なサービス検出に役立ちます。
-
Zookeeper の SSL サポートを実装しました (Kostiantyn Nemchenko)
kazoo>=2.6.0が必要です。 -
カスタム ブートストラップ メソッドの
no_paramsオプションを実装しました (Kostiantyn Nemchenko)これにより、
wal-g、pgBackRest、およびその他のバックアップ ツールをシェル スクリプトにラップせずに呼び出すことができます。 -
初期化に失敗した後に WAL とテーブルスペースを移動します (Feike Steenbergen)
reinitを実行すると、Patroni はPGDATAだけでなく、シンボリックリンクされた WAL ディレクトリとテーブルスペースもすでに削除していました。move_data_directory()メソッドは同様のジョブを実行します。つまり、WAL ディレクトリとテーブルスペースの名前を変更し、PGDATA 内のシンボリックリンクを更新します。
pg_rewind サポートの改善
-
タイムラインの発散チェックの改善 (Alexander Kukushkin)
レプリカ上の再生位置がスイッチポイントを超えていない場合、または元のプライマリー上のチェックポイント レコードの終わりがスイッチポイントと同じである場合は、巻き戻す必要はありません。チェックポイント レコードの終わりを取得するために、
pg_waldumpを使用し、その出力を解析します。 -
pg_rewindがそれについて文句を言ったら、欠落している WAL を取得してみます。 (Alexander Kukushkin)pg_rewindに必要な WAL セグメントがpg_walディレクトリに存在しないため、pg_rewindが分岐点より前のチェックポイントの場所を見つけることができない場合があります。 PostgreSQL 13pg_rewindからは、欠落している WAL を取得するためにrestore_commandを使用できるようになりました。古い PostgreSQL バージョンの場合、Patroni は、失敗した巻き戻し試行のエラーを解析し、restore_commandを独自に呼び出して、不足している WAL を取得しようとします。 -
スタンバイ クラスターで新しいタイムラインを検出し、必要に応じて巻き戻し/再初期化をトリガーします (Alexander Kukushkin)
standby_cluster はプライマリー クラスターから切り離されているため、リーダーの選出やタイムラインの切り替えについてはすぐには認識されません。この事実を検出するために、
standby_leaderはpg_wal内の新しい履歴ファイルを定期的にチェックします。 -
履歴ログ出力を短縮して美しくしました (Alexander Kukushkin)
Patroni が
pg_rewindの必要性を判断しようとすると、プライマリーからの履歴ファイルの内容がログに書き込まれる可能性があります。履歴ファイルはフェイルオーバー/スイッチオーバーのたびに増大し、最終的には多くの行を占めるようになり、そのほとんどはあまり役に立ちません。 Patroni は、生データを表示する代わりに、現在のレプリカ タイムラインより前の 3 行とその後の 2 行のみを表示します。
K8s の改善
-
Kubernetes Python モジュールを削除します (Alexander Kukushkin)
公式の Python Kubernetes クライアントには自動生成されたコードが多数含まれているため、非常に重くなっています。 Patroni は、K8s の API エンドポイントのほんの一部のみを使用しており、それらのサポートの実装は難しくありませんでした。
-
Kubernetes サービスをバイパスできるようにしました。 (Alexander Kukushkin)
K8s で実行している場合、Patroni は通常、Kubernetes サービスを介して K8s API と通信します。そのアドレスは
KUBERNETES_SERVICE_HOST環境変数で公開されます。他のサービスと同様に、Kubernetes サービスはkube-proxyによって処理され、構成に応じてトラフィック ルーティングをユーザー空間プログラムまたはiptablesに依存します。中間コンポーネントをスキップして K8s マスター ノードに直接接続すると、より適切な再試行戦略を実装でき、K8s マスター ノードがアップグレードされるときに Postgres を降格するリスクを軽減できます。 -
Patroni クラスターのすべてのポッドの HA ループを同期 (Alexander Kukushkin)
そうしないと、障害検出時間が
ttlからttl + loop_waitに増加しました。 -
K8s のサブセット アドレスに
referencesとnodenameを設定する (Alexander Kukushkin)一部のロードバランサーはこの情報に依存しています。
-
update_leader()で発生する可能性のある競合状態を修正しました。 (Alexander Kukushkin)Patroni の外部でリーダー ConfigMapまたはエンドポイントの同時更新が行われると、
update_leader()呼び出しが失敗する可能性があります。この場合、Patroni は現在のノードがまだリーダー ロックを所有していることを再確認し、更新を繰り返します。 -
存在しない構成へのパッチ適用を明示的に禁止します (Alexander Kukushkin)
Kubernetes 以外の DCS では、
cluster.configがNoneであるため、PATCH 呼び出しは例外で失敗しますが、Kubernetes では構成アノテーションが問題なく作成され、ブートストラップ終了後にブートストラップ構成を書き込むことができませんでした。 -
一時停止する のバグを修正しました (Alexander Kukushkin)
リーダー キーが存在しない場合、レプリカは
primary_conninfoを削除し、Postgres を再起動していましたが、何も行わないはずです。
REST API の改善
-
ワーカー スレッドが開始されるまで TLS ハンドシェイクを延期します。 (Alexander Kukushkin、Ben Harris)
TLS ハンドシェイクが API スレッドで実行され、クライアント側がデータを送信しなかった場合、API スレッドはブロックされました (DoS の危険があります)。
-
REST API で
basic-authをクライアント証明書とは独立してチェックする (Alexander Kukushkin)以前は、クライアント証明書のみが検証されていました。 2 つのチェックを独立して実行することは、完全に有効な使用例です。
-
OPTIONSリクエストの HTTP ヘッダーの後にCRLFを二重に書き込みます (Sergey Burladyan)HAProxy は 1 つの
CRLFに満足していましたが、Consul ヘルスチェックでは接続の切断と予期しない EOF が発生したと報告されました。 -
GET /clusterで Zookeeper の古いメンバー情報が表示されていました (Alexander Kukushkin)エンドポイントは Patroni 内部クラスター ビューを使用していました。 Patroni 自体については問題は発生しませんでしたが、外部に公開する場合は、最新の情報、特にレプリケーション ラグを表示する必要があります。
-
スタンバイ クラスターのヘルスチェックを修正しました (Alexander Kukushkin)
マスターの
GET /standby-leaderとstandby_leaderのGET /masterが、誤って 200 で応答していました。 -
DELETE /switchoverを実装 (Alexander Kukushkin)REST API 呼び出しは、スケジュールされたスイッチオーバーを削除します。
-
/readinessおよび/livenessエンドポイントを作成しました (Alexander Kukushkin)これらは、K8s サービスがラベル セレクターとともに使用されている場合に、サブセット アドレスから “unhealthy” ポッドを削除するのに役立つ可能性があります。
-
強化された
GET /replicaおよびGET /asyncREST API ヘルスチェック (Krishna Sarabu、Alexander Kukushkin)チェックはオプションのキーワード
?lag=<max-lag>をサポートし、ラグが指定された値より小さい場合にのみ 200 で応答するようになりました。この機能を利用する場合、リーダー上の WAL 位置に関する情報はloop_wait秒ごとにのみ更新されることに注意してください。 -
REST API 応答にユーザー定義の HTTP ヘッダーのサポートを追加しました (Yogesh Sharma)
この機能は、リクエストがブラウザから行われる場合に役立つ可能性があります。
patronictl の改善
-
patronictl pauseに存在しないリーダーを呼び出そうとしないでください (Alexander Kukushkin)K8s でリーダーのないクラスターを一時停止しているときに、patronictl はメンバー「None」にアクセスできないという警告を表示していました。
-
メンバー
conn_urlが欠落している場合の処理 (Alexander Kukushkin)K8s では、Patroni がまだ実行されていないため、ポッドに必要なアノテーションがない可能性があります。 patronictl が失敗していました。
-
ASCII クラスター トポロジを表示する機能を追加しました (Maxim Fedotov、Alexander Kukushkin)
カスケード レプリケーションを使用してクラスターの概要を把握するのに非常に役立ちます。
-
patronictl flush switchoverの実装 (Alexander Kukushkin)それ以前は、
patronictl flushはスケジュールされた再起動のキャンセルのみをサポートしていました。
バグ修正
-
既存の PGDATA を使用したクラスターのブートストラップ中に Attribute エラーが発生しました (Krishna Sarabu)
/historyキーを作成/更新しようとすると、Patroni は DCS でまだ作成されていないClusterConfigオブジェクトにアクセスしていました。 -
Consul の例外処理を改善しました。 (Alexander Kukushkin)
touch_member()メソッドの未処理の例外により、Patroni プロセス全体がクラッシュしました。 -
post_initスクリプトに対してsynchronous_commit=localを強制します (Alexander Kukushkin)Patroni はユーザー (
replication、rewind) を作成するときにすでにそれを行っていましたが、post_initの場合にそれが欠けていたのは見落としでした。その結果、スクリプトが内部で独自に実行していない場合、synchronous_mode のブートストラップを完了できませんでした。 -
Consul プール マネージャーの
maxsizeを増加しました (ponvenkates)デフォルトの
size=1では、いくつかの警告が生成されました。 -
Patroni は Postgres が実行中であると誤って報告していました (Alexander Kukushkin)
たとえば、ディスク不足エラーにより Postgres がクラッシュした場合、状態は更新されませんでした。
-
欠損値または空の値の代わりに
*をpgpassに挿入します。 (Alexander Kukushkin)たとえば、
standby_cluster.portが指定されていない場合、pgpassファイルが正しく生成されていませんでした。 -
特殊文字を使用したリーダー ノードでの物理レプリケーション スロットの作成をスキップします (Krishna Sarabu)
名前に「-」などの特殊文字が含まれている場合 (“abc-us-1” など)、Patroni はリーダー ノードの休止スロット (
slotsが定義されている場合) を作成しているように見えました。 -
カスタム ブートストラップで存在しない
pg_hba.confを削除しないようにしました。 (Krishna Sarabu)カスタム ブートストラップ後に
pg_hba.confがpgdataディレクトリの外にある場合、Patroni は失敗していました。
バージョン 1.6.5
2020-08-23 リリース
新機能
-
マスター停止タイムアウト (Krishna Sarabu)
Postgres を停止するときに Patroni が待機できる秒数。 synchronous_mode が有効な場合にのみ有効です。 0 より大きい値に設定され、synchronous_mode が有効になっている場合、停止操作が
master_stop_timeoutで設定された値を超えて実行されている場合、Patroni はポストマスターにSIGKILLを送信します。永続性と可用性のトレードオフに応じて値を設定します。パラメーターが設定されていないか、正以外の値に設定されている場合、master_stop_timeoutは効果がありません。 -
プライマリーの名前で永続的な物理スロットを作成しないでください。 (Alexander Kukushkin)
レプリカが停止している間にプライマリーが WAL セグメントをリサイクルするのは一般的な問題です。これで、ノード数が固定され、名前が決して変更されない、静的クラスターに対する優れたソリューションが得られました。
slots内のすべてのノードの名前をリストするだけで、ノードがダウンしている (DCS に登録されていない) ときにプライマリーがスロットを削除しないようにすることができます。 -
構成バリデーターの初版 (Igor Yanchenko)
Patroni 構成を検証するには、
patroni --validate-config patroni.yamlを使用します。 -
タイムライン履歴の最大長を設定できるようになりました (Krishna Sarabu)
Patroni は、フェイルオーバー/スイッチオーバーの履歴を DCS の
/historyキーに書き込みます。時間の経過とともにこのキーのサイズは大きくなりますが、ほとんどの場合、重要なのは最後の数行だけです。max_timelines_historyパラメーターを使用すると、DCS に保持されるタイムライン履歴アイテムの最大数を指定できます。 -
Kazoo 2.7.0 の互換性 (Danyal Prout)
Kazoo の一部の非パブリック メソッドはシグネチャを変更しましたが、Patroni はそれらに依存していました。
patronictl の改善
-
メンバー タグを表示 (Kostiantyn Nemchenko、Alexander Kukushkin)
タグはノードごとに個別に構成されており、タグの概要を簡単に把握する方法はありませんでした。
-
メンバーの出力を改善しました (Alexander Kukushkin)
冗長なクラスター名は各行に表示されなくなり、テーブルのヘッダーにのみ表示されます。
-
設定ファイルが明示的に指定されているが見つからない場合は失敗します (Kaarel Moppel)
以前は、patronictl は
DEBUGメッセージのみを報告していました。 -
初期化されていない K8s ポッドが patronictl を破壊する問題を解決しました。 (Alexander Kukushkin)
Patroni は、K8s 上の特定のポッド アノテーションに依存しています。 Patroni ポッドの 1 つが停止または開始しているときは、有効なアノテーションがまだなく、patronictl が例外で失敗していました。
安定性の向上
-
K8s API サーバーへの LIST 呼び出しが失敗した場合、1 秒のバックオフを適用します (Alexander Kukushkin)
これは主にログの氾濫を避けるために必要ですが、メインスレッドの枯渇を防ぐのにも役立ちます。
-
retry-afterHTTP ヘッダーが K8s API によって返された場合に再試行します (Alexander Kukushkin)K8s API サーバーがリクエストで圧倒されると、再試行を要求されることがあります。
-
postmaster の環境から
KUBERNETES_環境変数を削除する (Feike Steenbergen)KUBERNETES_環境変数は PostgreSQL には必要ありませんが、環境変数をポストマスターに公開すると、バックエンドや通常のデータベース ユーザー (pl/perl などを使用) にも公開されます。 -
再初期化時にテーブルスペースをクリーンアップします (Krishna Sarabu)
再初期化中に、Patroni は
PGDATAのみを削除し、ユーザー定義のテーブルスペース ディレクトリを残していました。これにより、Patroni が再初期化でループする原因となります。この問題に対する以前の回避策は、カスタムブートストラップ スクリプトを実装することでした。 -
プロモートが行われた後に明示的に
CHECKPOINTを実行します。 (Alexander Kukushkin)新しいプライマリーが
pg_rewindで使用可能になるまでの時間を短縮するのに役立ちます。 -
Etcd メンバーのスマート更新 (Alexander Kukushkin)
Patroni が etcd クラスターのすべてのメンバーでリクエストの実行に失敗した場合、Patroni は、次回再試行する前に、IP/ホストの変更について
AまたはSRVレコードを再チェックします。 -
pg_controldataから欠損値をスキップします (Feike Steenbergen)PGDATA と一致しないバージョンのバイナリを使用しようとすると、値が欠落します。 Patroni はとにかく Postgres を起動しようとしますが、Postgres はメジャー バージョンが一致しないと通知し、エラーで中止されます。
バグ修正
-
必要に応じて Consul の SSL 検証を無効にします (Julien Riou)
urllib3の特定のバージョン以降、SSL 検証を効果的に無効にするには、cert_reqsを明示的にssl.CERT_NONEに設定する必要があります。 -
HA ループの各サイクルでレプリケーション接続を開かないようにしました。 (Alexander Kukushkin)
回帰は 1.6.4 で導入されました。
-
失敗したプライマリーで
on_role_changeコールバックを呼び出す (Alexander Kukushkin)場合によっては、仮想 IP が古いプライマリーに接続されたままになる可能性があります。回帰は 1.4.5 で導入されました。
-
pg_rewind が成功した後に postgres が開始された場合、巻き戻し状態をリセットします。 (Alexander Kukushkin)
このバグの結果、Patroni は、手動でシャットダウンされた postgres を一時停止モードで起動していました。
-
recovery.confをチェックするときにrecovery_min_apply_delayをmsに変換します12 よりも古い PostgreSQL 上で
recovery_min_apply_delayが構成されている場合、Patroni はレプリカを無期限に再起動していました。 -
PyInstaller の互換性 (Alexander Kukushkin)
PyInstaller は、Python アプリケーションをスタンドアロンの実行可能ファイルにフリーズ (パッケージ化) します。
multiprocessingのforkではなくspawnメソッドに切り替えたときに互換性が失われていました。
バージョン 1.6.4
2020-01-27 リリース
新機能
-
patronictl reinitの--waitオプションを実装しました (Igor Yanchenko)--waitオプションが使用されている場合、Patronictl はreinitが完了するまで待機します。 -
Windows サポートのさらなる改善 (Igor Yanchenko、Alexander Kukushkin)
- 統合テストに使用されるすべてのシェル スクリプトは Python で書き直されます
pg_ctl killは、非 posix システムで postgres を停止するために使用されます。- unix ドメイン ソケットを使用しないでください
安定性の向上
-
unix_socket_directoriesとstats_temp_directoryが存在することを確認してください (Igor Yanchenko)Patroni および Postgres の開始時に、
unix_socket_directoriesおよびstats_temp_directoryが存在することを確認するか、それらの作成を試行します。 Patroni は、作成に失敗した場合に終了します。 -
Patroni が書き込みアクセスできる場所に
postgresql.pgpassが配置されていることを確認してください。 (Igor Yanchenko)書き込みアクセスがない場合、Patroni は例外で終了します。
-
Consul
serfHealthチェックをデフォルトで無効にします (Kostiantyn Nemchenko)ネットワークに小さな問題が発生した場合でも、
serfHealthが失敗すると、ノードに関連付けられたすべてのセッションが無効になります。したがって、リーダー キーはttlよりもはるかに早く失われ、レプリカが不要に再起動され、場合によってはプライマリーが降格されます。 -
K8s API への接続に tcp キープアライブを構成 (Alexander Kukushkin)
TTL 秒経過してもソケットから何も取得されない場合、ソケットは停止していると見なすことができます。
-
ユーザー作成時のパスワードのログ記録を回避します (Alexander Kukushkin)
パスワードが拒否された場合、またはログ記録が冗長に構成されているか、まったく構成されていない場合、パスワードが postgres ログに書き込まれる可能性があります。これを回避するために、Patroni は、ユーザーの作成/更新を試行する前に、
log_statement、log_min_duration_statement、およびlog_min_error_statementを安全な値に変更します。
バグ修正
-
カスケード レプリカで standby_cluster 構成の
restore_commandを使用します (Alexander Kukushkin)standby_leaderは、この機能が存在した当初からすでに実行していました。レプリカで同じことを行わないと、スタンバイ リーダーに追いつけなくなる可能性があります。 -
スタンバイ クラスターが報告するタイムラインを更新 (Alexander Kukushkin)
タイムライン切り替えの場合、スタンバイ クラスターはプライマリーから正しくレプリケートしていましたが、patronictl は古いタイムラインを報告していました。
-
custom_conf で特定の回復パラメータを定義できるようにしました。 (Alexander Kukushkin)
レプリカでリカバリ パラメータの検証を行うとき、Patroni は、
archive_cleanup_command、promote_trigger_file、recovery_end_command、recovery_min_apply_delay、およびrestore_commandが Patroni 構成ではなく、postgresql.auto.confまたはpostgresql.conf以外のファイルで定義されている場合、それらをスキップします。 -
名前にピリオドが含まれる PostgreSQL パラメータの処理を改善しました。 (Alexander Kukushkin)
このようなパラメーターは、単位が必ずしも文字列であるとは限らない拡張機能によって定義できます。値を変更すると、再起動が必要になる場合があります (
pg_stat_statements.maxなど)。 -
シャットダウン時の例外処理を改善しました (Alexander Kukushkin)
シャットダウン中、Patroni は DCS 内のステータスを更新しようとします。 DCS にアクセスできない場合は、例外が発生する可能性があります。例外処理が不足しているため、ロガー スレッドが停止できませんでした。
バージョン 1.6.3
2019-12-05 リリース
バグ修正
-
pg_rewindの実行時にパスワードを公開しないでください (Alexander Kukushkin)#1301 でバグが導入されました
-
postgresql.authenticationで指定された接続パラメーターをpg_basebackupとカスタム レプリカ作成メソッドに適用 (Alexander Kukushkin)URL のような接続文字列に依存していたため、パラメーターは適用されませんでした。
バージョン 1.6.2
2019-12-05 リリース
新機能
-
patroni --versionを実装 (Igor Yanchenko)Patroni の現在のバージョンを出力して終了します。
-
すべての http リクエストに
user-agenthttp ヘッダーを設定します (Alexander Kukushkin)Patroni は、http プロトコルを介して Consul、etcd、および Kubernetes API と通信しています。特別に作成された
user-agent(例:Patroni/1.6.2 Python/3.6.8 Linux) を使用すると、デバッグや監視に役立つ場合があります。 -
例外トレースバックのログレベルを設定できるようにしました。 (Igor Yanchenko)
log.traceback_level=DEBUGを設定すると、トレースバックはlog.level=DEBUGの場合にのみ表示されます。デフォルトの動作は変わりません。
安定性の向上
-
構成ファイルで必要なモジュールを検索するときに、すべての DCS モジュールをインポートしないようにしました。 (Alexander Kukushkin)
たとえば、Zookeeper だけが必要な場合は、etcd、Consul、および Kubernetes のモジュールをインポートする必要はありません。これはメモリ使用量を削減し、INFO メッセージ
Failed to import smthの問題を解決します。 -
Python
requestsモジュールを明示的な要件から削除しました (Alexander Kukushkin)これは重要な処理には使用されていませんでしたが、
urllib3の新しいバージョンがリリースされると多くの問題を引き起こしていました。 -
YAML 配列ではなくコンマ区切り文字列として記述された
etcd.hostsの処理を改善しました。 (Igor Yanchenko)以前は、
host1:port1, host2:port2(カンマの後のスペース文字) 形式で記述すると失敗していました。
ユーザビリティの向上
-
patronictl の空のリストからメンバーを選択することをユーザーに強制しないでください (Igor Yanchenko)
ユーザーが間違ったクラスター名を指定した場合、空のリストからメンバーを選択するように求めるのではなく、例外が発生します。
-
REST API がバインドできない場合のエラー メッセージをさらにわかりやすくしました。 (Igor Yanchenko)
経験の浅いユーザーにとって、Python スタックトレースから何が問題なのかを特定するのは難しいかもしれません。
バグ修正
-
wal_buffersの計算を修正しました (Alexander Kukushkin)基本単位が 8 kB ブロックから PostgreSQL 11 のバイトに変更されました。
-
PostgreSQL 10+ でのみ
primary_conninfoのpassfileを使用する (Alexander Kukushkin)最新バージョンの
libpqがインストールされていない限り、古いバージョンではpassfileが動作する保証はありません。
バージョン 1.6.1
2019-11-15 リリース
新機能
-
PATRONICTL_CONFIG_FILE環境変数を追加しました (msvechla)これにより、環境から patronictl の
--config-file引数を構成できるようになります。 -
patronictl historyの実装 (Alexander Kukushkin)フェイルオーバー/スイッチオーバーの履歴が表示されます。
-
pg_rewindを実行するときにPGOPTIONSで-c statement_timeout=0を渡します (Alexander Kukushkin)これは、サーバー上の
statement_timeoutが小さな値に設定され、pg_rewind によって実行されたステートメントの 1 つがキャンセルされた場合から保護します。 -
PostgreSQL 構成でより低い値を許可する (Soulou)
Patroni では、一部の PostgreSQL 構成パラメーターをハードコードされた値よりも小さく設定することができませんでした。許容される最小値が小さくなり、デフォルト値は変更されていません。
-
証明書ベースの認証を許可する (Jonathan S. Katz)
この機能により、スーパーユーザー、レプリケーション、リワインド アカウントの証明書ベースの認証が有効になり、ユーザーは接続する
sslmodeを指定できるようになります。 -
パスワードの代わりに
primary_conninfoのpassfileを使用します (Alexander Kukushkin)postgresql.conf に対する
600権限の設定を回避できます。 -
構成の変更に関係なく
pg_ctl reloadを実行します (Alexander Kukushkin)一部の構成ファイルが Patroni によって制御されていない可能性があります。誰かが REST API を介して、または SIGHUP を Patroni プロセスに送信することによってリロードを実行している場合、通常は Postgres もリロードされることが期待されます。以前は、Patroni 構成の
postgresqlセクションに変更がなかった場合、Postgres はリロードされませんでした。 -
primary_conninfoだけでなく、すべての回復パラメーターを比較します (Alexander Kukushkin)以前は、
check_recovery_conf()メソッドはprimary_conninfoが変更されたかどうかのみをチェックしており、他のすべての回復パラメーターは考慮されていませんでした。 -
再起動せずにいくつかの回復パラメーターを適用できるようにしました (Alexander Kukushkin)
PostgreSQL 12 以降、
archive_cleanup_command、promote_trigger_file、recovery_end_command、およびrecovery_min_apply_delayのリカバリ パラメーターは再起動せずに変更できます。将来の Postgres リリースでは、このリストが拡張され、Patroni が自動的にサポートする予定です。 -
use_slotsをオンラインで変更できるようにします (Alexander Kukushkin)以前は、Patroni を再起動し、スロットを手動で削除する必要がありました。
-
Postgres の起動時に、
PATRONI_接頭辞が付いた環境変数のみを削除します (Cody Coons)これにより、さまざまな外部データ ラッパーの実行に関する多くの問題が解決されます。
安定性の向上
-
K8s API を使用する場合は LIST + WATCH を使用する (Alexander Kukushkin)
これにより、オブジェクトの変更 (ポッド、エンドポイント/構成マップ) を効率的に受信できるようになり、K8s マスター ノードのストレスが軽減されます。
-
ブートストラップ中に PGDATA が空でない場合のワークフローを改善しました。 (Alexander Kukushkin)
initdbソース コードによると、lost+foundと.dotfilesのみが存在する場合、PGDATA は空であると見なされる可能性があります。 Patroni も同じことを行います。PGDATAが空ではなく、同時にpg_controldataの観点から無効な場合、Patroni はエラーを出して終了します。 -
すべての HA ループで高価な
os.listdir()を呼び出すのを避けてください。 (Alexander Kukushkin)システムが IO ストレスにさらされている場合、
os.listdir()の実行に数秒 (または数分) かかる可能性があり、Patroni の HA ループに悪影響を及ぼします。これにより、更新がないためにリーダー キーが DCS から消える可能性もあります。 PGDATA が空でないことを確認する、より優れた、より安価な方法があります。ここで、PGDATA にglobal/pg_controlファイルが存在するかどうかを確認します。 -
ロギングインフラストラクチャのいくつかの改善 (Alexander Kukushkin)
以前は、ログ スレッドが
daemonスレッドであったため、シャットダウン時に最後の数行のログが失われる可能性がありました。 -
Python 3.4+ で
spawnマルチプロセッシング開始メソッドを使用する (Maciej Kowalczyk)Python の 問題 では、スレッド化とマルチプロセッシングがうまく組み合わせられないことが知られています。デフォルトのメソッド
forkからspawnに切り替えることが推奨される回避策です。そうしないと、Postgres が実際には稼働しているにもかかわらず、ポストマスターの開始プロセスがハングし、Patroni が無期限にINFO: restarting after failure in progressを報告する可能性があります。
REST API の改善
-
REST API でクライアント証明書を確認できるようにしました (Alexander Kukushkin)
verify_clientがrequiredに設定されている場合、Patroni はすべての REST API 呼び出しのクライアント証明書をチェックします。optionalに設定すると、すべての安全でない REST API エンドポイントに対してクライアント証明書がチェックされます。 -
Postgres が実行されていない場合、
GET /replicaヘルス チェック リクエストの応答コード 503 を返します。 (Alexander Anikin)Postgres は、クライアント接続の受け入れを開始するまでの回復にかなりの時間を費やす可能性があります。
-
/historyおよび/clusterエンドポイントを実装する (Alexander Kukushkin)/historyエンドポイントは、DCS のhistoryキーの内容を表示します。/clusterエンドポイントには、すべてのクラスター メンバーと、保留中およびスケジュールされた再起動やスイッチオーバーなどのサービス情報が表示されます。
etcd サポートの改善
-
Etcd RAFT 内部エラー時に再試行 (Alexander Kukushkin)
etcd ノードがシャットダウンされると、
response code=300, data='etcdserver: server stopped'が送信されます。これにより、Patroni がプライマリーを降格させていました。 -
Etcd リクエストの再試行を早すぎて諦めないでください (Alexander Kukushkin)
ネットワークに問題が発生すると、Patroni はすぐに etcd ノードのリストを使い果たし、
retry_timeout全体を使用せずに諦めてしまい、プライマリーが降格される可能性がありました。
バグ修正
-
pg_rewindユーザーに実行権限を付与するときにsynchronous_commitを無効にする (kremius)ブートストラップが
synchronous_mode_strict: trueで行われる場合、使用可能な同期スタンバイ ノードがないため、GRANT EXECUTEステートメントは無期限に待機していました。 -
Python 3.7 のメモリ リークを修正 (Alexander Kukushkin)
Patroni は
ThreadingMixInを使用して REST API リクエストを処理しており、Python 3.7 では、リクエストごとに生成されるスレッドがデフォルトで非デーモンになりました。 -
非同期アクションの競合状態を修正しました (Alexander Kukushkin)
停止した Postgres を回復しようとすると、
patronictl reinit --forceが上書きされる可能性がありました。これにより、basebackup の実行中に Patroni が Postgres を開始しようとしたという状況が発生しました。 -
postmaster_start_time()メソッドの競合状態を修正しました (Alexander Kukushkin)メソッドが REST API スレッドから実行される場合は、別のカーソル オブジェクトを作成する必要があります。
-
名前に大文字が含まれている同期スタンバイが昇格されない問題を修正しました。 (Alexander Kukushkin)
Postgres が
application_nameとsynchronous_standby_namesの値を比較するときに同じことを行っていたため、名前を小文字に変換しました。 -
新しいプロセスを開始する前に、コールバックプロセスとともにすべての子を強制終了します。 (Alexander Kukushkin)
そうしないと、bash でコールバックを実装することが難しくなり、最終的に 2 つのコールバックが同時に実行される状況が発生する可能性があります。
-
「start failed」問題を修正しました (Alexander Kukushkin)
特定の条件下では、Postgres が稼働しているにもかかわらず、Postgres 状態が「start failed」に設定されることがあります。
バージョン 1.6.0
2019-08-05 リリース
このバージョンでは、PostgreSQL 12 との互換性が追加され、PostgreSQL 11 以降でスーパーユーザーなしで pg_rewind を実行できるようになり、IPv6 サポートが有効になります。
新機能
-
Psycopg2 は要件から削除されたため、個別にインストールする必要があります。 (Alexander Kukushkin)
2.8.0 から、
psycopg2はpsycopg2とpsycopg2-binaryという 2 つの異なるパッケージに分割され、ファイル システム上の同じ場所に同時にインストールできるようになりました。依存関係による地獄の問題を減らすために、ユーザーがインストール方法を選択できるようにしました。利用可能なオプションがいくつかあります。ドキュメント を参照してください。 -
PostgreSQL 12 との互換性 (Alexander Kukushkin)
PostgreSQL 12 以降、
recovery.confはなくなり、以前のすべての回復パラメーターは GUC に変換されます。ALTER SYSTEM SET primary_conninfoなどから保護するために、Patroni はpostgresql.auto.confを解析し、そこからすべてのスタンバイ パラメーターとリカバリ パラメーターを削除します。 Patroni 構成には下位互換性が維持されます。たとえば、restore_commandが GUC であるにもかかわらず、postgresql.recovery_conf.restore_commandセクションで指定することができ、Patroni はそれを PostgreSQL 12 のpostgresql.confに書き込みます。 -
PostgreSQL 11 以降でスーパーユーザーなしで
pg_rewindを使用できるようにします (Alexander Kukushkin)この機能を使用したい場合は、Patroni 構成ファイルの
postgresql.authentication.rewindセクションでusernameおよびpasswordを定義してください。既存のクラスターの場合は、ユーザーを手動で作成し、いくつかの関数に対するGRANT EXECUTE権限を付与する必要があります。詳細については、PostgreSQL ドキュメント を参照してください。 -
レプリカの実際の
primary_conninfoと設定したい値を適切に比較するようにしました(Alexander Kukushkin)。既存のプライマリー/スタンバイ クラスターを Patroni によって管理されるクラスターに変換するときに、レプリカの再起動を回避できる場合があります。
-
IPv6 サポート (Alexander Kukushkin)
大きな問題が 2 つありました。 Patroni REST API サービスは
0.0.0.0でのみリッスンしており、api_urlとconn_urlで使用される IPv6 IP アドレスは正しく角括弧で囲まれていませんでした。 -
Kerberos サポート (Ajith Vilas、Alexander Kukushkin)
Patroni 構成ファイルでパスワードを定義する代わりに、Postgres ノード間で Kerberos 認証を使用できるようになります。
-
pg_ident.confの管理 (Alexander Kukushkin)この機能は
pg_hba.confと同様に機能します。postgresql.pg_identが構成ファイルまたは DCS で定義されている場合、Patroni はその値をpg_ident.confに書き込みますが、postgresql.parameters.ident_fileが定義されている場合、Patroni はpg_identが外部から管理されているものとみなし、ファイルを更新しません。
REST API の改善
-
/healthエンドポイントを追加しました (Wilfried Roset)PostgreSQL が実行されている場合にのみ、HTTP ステータス コード 200 を返します。
-
/read-onlyおよび/read-writeエンドポイントを追加しました (Julien Riou)/read-onlyエンドポイントにより、レプリカとプライマリー間で読み取りのバランスがとれます。/read-writeエンドポイントは、/primary、/leader、および/masterのエイリアスです。 -
SSLContextを使用して、REST API ソケットをラップします。 (Julien Riou)ssl.wrap_socket()の使用は非推奨になりましたが、TLS 1.1 など、間もなく非推奨となるプロトコルもまだ許可されていました。
ロギングの改善
-
2 ステップ ロギング (Alexander Kukushkin)
すべてのログ メッセージは、最初にメモリ内のキューに書き込まれ、その後、別のスレッドから stderr またはファイルに非同期的にフラッシュされます。最大キュー サイズは制限されています (構成可能)。制限に達すると、Patroni はログを失い始めますが、HA ループをブロックするよりはまだマシです。
-
GET/OPTIONS API 呼び出しとレイテンシのデバッグ ログを有効にします (Jan Tomsa)
これは、HAProxy、Consul、またはどのノードがプライマリー/レプリカであるかを決定するその他のツールによって実行されるヘルスチェックのデバッグに役立ちます。
-
Retry でキャッチされた例外をログに記録しました (Daniel Kucera)
試行回数またはタイムアウトに達したときの最後の例外をログに記録します。 DCS への通信が失敗した場合に、いくつかの問題をデバッグするのに役立つことが期待されます。
patronictl の改善
-
スケジュールされたスイッチオーバーと再起動のためのダイアログを強化しました (Rafia Sabih)
以前のダイアログでは、スケジュールされたアクションが考慮されていなかったため、誤解を招く恐れがありました。
-
設定ファイルが存在するかどうかを確認します (Wilfried Roset)
指定されたファイル名が存在しない場合は、黙って無視するのではなく (誤解を招く可能性があります)、構成ファイルについて詳しく説明してください。
-
EDITORのフォールバック値を追加 (Wilfried Roset)EDITOR環境変数が定義されていない場合、patronictl edit-configはPatroniCtlExceptionで失敗していました。新しい戦略は、まずeditorを試し、次にviを試すことです (viはほとんどのシステムで利用できるはずです)。
Consul サポートの改善
-
Consul 整合性モードの指定を許可します (Jan Tomsa)
整合性モードの詳細については、ここ を参照してください。
-
SIGHUP で Consul 設定を再ロード (Cameron Daniel Kucera、Alexander Kukushkin)
これは、誰かが
tokenの値を変更する場合に特に便利です。
バグ修正
-
スイッチオーバー/フェイルオーバーの特殊なケースを修正しました (Sharoon Thomas)
REST API にアクセスできず、フォールバックとして DCS を使用している場合、変数
scheduled_atは未定義である可能性があります。 -
カスタム ブートストラップ中に
pg_hba.confでローカルホストへの信頼をオープンします (Alexander Kukushkin)以前は unix_socket に対してのみ開かれていたため、多くのエラーが発生していました:
FATAL: no pg_hba.conf entry for replication connection from host "127.0.0.1", user "replicator" -
前のリーダーが先行している場合でも、同期ノードは健全であるとみなします (Alexander Kukushkin)
プライマリーが DCS へのアクセスを失った場合、Postgres を読み取り専用で再起動しますが、他のノードが REST API を介して古いプライマリーに依然としてアクセスできる可能性があります。このような状況により、古いプライマリーが同期スタンバイよりも先に進んだ WAL 位置を報告していたため、同期スタンバイが昇格しませんでした。
-
スタンバイ クラスターのバグ修正 (Alexander Kukushkin)
standby_leader にアクセスできない場合にスタンバイ クラスターでレプリカをブートストラップできるようにするほか、いくつかのマイナーな修正を加えました。
バージョン 1.5.6
2019-08-03 リリース
新機能
-
プロキシのセットを介した etcd クラスターとの連携をサポート (Alexander Kukushkin)
etcd クラスターに直接アクセスできず、プロキシのセットを介してのみアクセスできる場合があります。この場合、Patroni は etcd トポロジ検出を実行せず、プロキシ ホストを介したラウンドロビンのみを実行します。動作は
etcd.use_proxiesによって制御されます。 -
ノード上のロールが変更されたときのコールバックの動作が変更されました。 (Alexander Kukushkin)
ロールが
masterまたはstandby_leaderからreplicaに、またはreplicaからstandby_leaderに変更された場合、on_restartコールバックは呼び出されなくなり、on_role_changeコールバックが優先されます。 -
postgres の起動方法を変更する (Alexander Kukushkin)
それ自体を実行する代わりに
multiprocessing.Processを使用し、multiprocessing.Pipeを使用してポストマスター PID を Patroni プロセスに送信します。以前はパイプを使用していたため、ポストマスター プロセスの stdin が閉じられた状態になっていました。
バグ修正
-
スタンバイ リーダーの REST API によって返された役割を修正 (Alexander Kukushkin)
standby_leaderではなく、誤ってreplicaを返していました。 -
コールバックを強制終了できなかった場合は終了を待ちます。 (Julien Tachoires)
Patroni には、
sudoで実行されているコールバック スクリプトを終了するための十分な権限がありません。この終了処理の失敗により、新しいコールバックがキャンセルされていました。実行中のスクリプトを強制終了できなかった場合、Patroni は終了するまで待機し、次のコールバックを実行します。 -
dcs.get_cluster メソッドにかかるロック時間を短縮しました (Alexander Kukushkin)
ロックが保持されているため、DCS の遅延が REST API ヘルス チェックに影響し、誤検知が発生していました。
-
pg_wal/pg_xlogがシンボリックリンクである場合の PGDATA のクリーニングを改善しました。 (Julien Tachoires)この場合、Patroni はターゲット ディレクトリからファイルを明示的に削除します。
-
os.path.relpath の不要な使用を削除します (Ants Aasma)
これは作業ディレクトリを解決できることに依存するため、後にファイルシステムからリンク解除されるディレクトリで Patroni が起動された場合には失敗します。
-
Etcd と通信するときに SSL バージョンを強制しません。 (Alexander Kukushkin)
何らかの理由で、debian および ubuntu の python3-etcd はパッケージの最新バージョンに基づいていないため、etcd v3 でサポートされていない TLSv1 を強制します。この問題は Patroni 側で解決しました。
バージョン 1.5.5
2019-02-15 リリース
このバージョンでは、以前のマスターの自動再初期化の可能性が導入され、patronictl listの出力が改善され、多くのバグが修正されています。
新機能
-
PATRONI_ETCD_PROTOCOL、PATRONI_ETCD_USERNAME、PATRONI_ETCD_PASSWORD環境変数のサポートを追加しました (Étienne M)以前は、構成ファイル内でのみ、または
PATRONI_ETCD_URLの一部としてのみ構成できましたが、必ずしも便利ではありませんでした。 -
以前のマスターを自動的に再初期化できるようにしました (Alexander Kukushkin)
pg_rewind が無効になっているか使用できない場合、タイムラインが分岐するため、元のマスターが新しいレプリカとして起動できない可能性があります。この場合、それを修正する唯一の方法は、データ ディレクトリを消去して再初期化することです。この動作は、
postgresql.remove_data_directory_on_diverged_timelinesを設定することで変更できます。これが設定されると、Patroni はデータ ディレクトリを消去し、元のマスターを自動的に再初期化します。 -
patronictl listのタイムラインに関する情報を表示 (Alexander Kukushkin)
古いレプリカを検出するのに役立ちます。それに加えて、ポート値がデフォルトでない場合、または同じホスト上で複数のメンバーが実行されている場合、
Hostには「:{port}」が含まれます。 -
$SCOPE-config エンドポイントに関連付けられたヘッドレス サービスを作成します (Alexander Kukushkin)
“config” エンドポイントは、クラスター全体の Patroni および Postgres 構成、履歴ファイル、そして最後に最も重要な
initializeキーに関する情報を保持します。 Kubernetes マスター ノードが再起動またはアップグレードされると、サービスのないエンドポイントが削除されます。ヘッドレス サービスにより、削除されなくなります。
バグ修正
-
リーダー監視ブロッキングクエリーの読み取りタイムアウトを調整しました。 (Alexander Kukushkin)
Consul ドキュメントによると、実際の応答タイムアウトは、同時要求のウェイクアップ時間を分散するために、指定された最大待機時間にランダムな少量の追加待機時間を加えることによって増加します。最大
wait / 16時間の追加時間が最大期間に追加されます。この場合、大きい方に応じてwait / 15または 1 秒を追加します。 -
レプリケーション プロトコル経由で postgres に接続する場合は、常に replication=1 を使用します。 (Alexander Kukushkin)
Postgres 10 以降、pg_hba.conf の database=replication を含む行は、パラメーター replication=database を使用した接続を受け入れません。
-
WAL 専用スタンバイ クラスターの場合は、primary_conninfo を recovery.conf に書き込まないでください。 (Alexander Kukushkin)
standby_cluster 構成で
hostもportも定義されていないにもかかわらず、Patroni はprimary_conninfoをrecovery.confに入れていましたが、これは役に立たず、多くのエラーを生成していました。
バージョン 1.5.4
2019-01-15 リリース
このバージョンでは、柔軟なロギングが実装され、多くのバグが修正されています。
新機能
-
ロギング インフラストラクチャの改善 (Alexander Kukushkin、Lucas Capistrant、Alexander Anikin)
ロギング構成は、環境変数からだけでなく、Patroni 構成ファイルからも構成できます。構成を更新してリロードを実行するか、SIGHUP を Patroni プロセスに送信することで、実行時にロギング構成を変更できるようになります。デフォルトでは、Patroni はログを stderr に書き込みますが、ログをファイルに直接書き込み、特定のサイズに達したときにローテーションすることが可能になりました。これに加えて、カスタム日付形式のサポートと、各 Python モジュールのログ レベルを微調整する機能が追加されました。
-
リーダー選挙中に現在のタイムラインを考慮できるようにします (Alexander Kukushkin)
現在、既知の最新のタイムラインに載っていないにもかかわらず、ノードが自身を最も健全なノードであるとみなしている可能性があります。場合によっては、そのようなノードの昇格を避けたいことがあります。これは、
check_timelineパラメーターをtrueに設定することで実現できます (デフォルトの動作は変更されません)。 -
スーパーユーザー資格情報の要件の緩和
Libpq を使用すると、ユーザー名もパスワードも明示的に指定せずに接続を開くことができます。状況に応じて、pgpass ファイルまたは pg_hba.conf のtrust 認証方式のいずれかに依存します。 pg_rewind も libpq を使用しているため、同じように動作します。
-
Consul のサービス登録とチェック間隔を環境変数で設定できる機能を実装しました (Alexander Kukushkin)
Consul でのサービスの登録は 1.5.0 に追加されましたが、これまでは patroni.yaml を介してのみ有効にすることができました。
安定性の向上
-
カスタム ブートストラップ中に archive_mode をオフに設定します (Alexander Kukushkin)
クラスターが完全に機能するまでは、WAL と履歴ファイルのアーカイブは避けたいと考えています。カスタム ブートストラップに pg_upgrade が含まれる場合、これは非常に役立ちます。
-
起動時にグローバル設定をロードするときに 5 秒のバックオフを適用します (Alexander Kukushkin)
Patroni の起動直後に DCS に大量のリクエストを送りつけるのを避けるのに役立ちます。
-
シャットダウン時に生成されるエラー メッセージの量を削減しました (Alexander Kukushkin)
それらは無害ですが、かなり迷惑で、時には恐ろしいものでした。
-
作成時に recovery.conf の rw 権限を明示的に保護します (Lucas Capistrant)
このファイルにはレプリケーション ユーザーとパスワードが含まれているため、patroni/postgres ユーザー以外はこのファイルを読み取れないようにします。
-
HTTPServer 例外をロガーにリダイレクトしました (Julien Riou)
デフォルトでは、このような例外は通常のログを混乱させて標準出力に記録されていました。
バグ修正
-
pg_ctl プロセスの stdout への stderr パイプを削除しました (Cody Coons)
メインの Patroni プロセスから stderr を継承すると、すべての Postgres ログをすべての Patroni ログとともに表示できるようになります。 Patroni および Postgres ログは標準ツール (docker logs、kubectl など) を使用して使用できるため、これはコンテナー環境で非常に役立ちます。それに加えて、この変更により、postgres がいくつかの警告を標準エラー出力に書き込むときに Patroni がポストマスター PID をキャッチできないというバグが修正されます。
-
Consul サービス チェック登録解除タイムアウトを Go 時間形式で設定します (Pavel Kirillov)
時間単位を明示しないと、サービスの登録が失敗していました。
-
standby_cluster クラスター構成のチェックを緩める (Dmitry Dolgov、Alexander Kukushkin)
有効な値として文字列のみを受け入れていたため、ポートを整数として指定したり、create_replica_methods をリストとして指定したりすることはできませんでした。
バージョン 1.5.3
2018-12-03 リリース
互換性とバグ修正のリリース。
-
Python3 で Zookeeper に対して実行するときの安定性を向上 (Alexander Kukushkin)
loop_waitの変更により、Patroni が Zookeeper から切断され、再接続できなくなりました。 -
postgres 9.3 との互換性の破損を修正しました (Alexander Kukushkin)
9.3 は replication=‘database’ を理解できないため、レプリケーション接続を開くときは、replication=1 を指定する必要があります。
-
HA ループごとに少なくとも 1 回は Consul セッションを更新し、Consul セッション例外の処理を改善しました。 (Alexander Kukushkin)
ローカル Consul エージェントを再起動すると、ノードに関連するすべてのセッションが無効になります。セッション更新を時間通りに呼び出さず、セッション エラーを適切に処理しなかったことが、プライマリーの降格を引き起こしていました。
バージョン 1.5.2
2018-11-26 リリース
互換性とバグ修正のリリース。
-
kazoo-2.6.0 との互換性 (Alexander Kukushkin)
リクエストが適切なタイムアウトで実行されることを確認するために、Patroni は python-kazoo モジュールの create_connection メソッドを再定義します。 kazoo の直近のリリースでは、create_connection メソッドの呼び出し方法が少し変更されました。
-
Consul クラスターがリーダーを失った場合の Patroni クラッシュを修正しました。 (Alexander Kukushkin)
クラッシュは touch_member メソッドの不正な実装が原因で発生していました。このメソッドはブール値を返すべきであり、例外を発生させるべきではありません。
バージョン 1.5.1
2018-11-01 リリース
このバージョンでは、永続的なレプリケーション スロットのサポートが実装され、pgBackRest のサポートが追加され、いくつかのバグが修正されています。
新機能
-
永続レプリケーション スロット (Alexander Kukushkin)
永続的なレプリケーション スロットはフェイルオーバー/スイッチオーバーでも保持されます。つまり、新しいプライマリー上の Patroni は、プロモートの実行直後に構成済みのレプリケーション スロットを作成します。スロットは
patronictl edit-configを使用して構成できます。初期設定は bootstrap.dcs で行うこともできます。 -
pgbackrest サポートを追加 (Yogesh Sharma)
pgBackrest は既存の $PGDATA フォルダーに復元できます。これにより、最後のバックアップ以降変更されていないファイルがスキップされるため、迅速な復元が可能になります。この機能をサポートするために、新しいパラメーター
keep_dataが導入されました。追加の例については、レプリカ作成方法 セクションを参照してください。
バグ修正
-
「スタンバイ クラスター」ワークフローのいくつかのバグ修正 (Alexander Kukushkin)
詳細については、https://github.com/patroni/patroni/pull/823 を参照してください。
-
クラスター管理が一時停止され、DCS にアクセスできない場合の REST API ヘルスチェックを修正しました。 (Alexander Kukushkin)
回帰は https://github.com/patroni/patroni/commit/90cf930036a9d5249265af15d2b787ec7517cf57 で導入されました
バージョン 1.5.0
2018-09-20 リリース
このバージョンでは、Patroni HA クラスターがスタンバイ モードで動作できるようにし、Windows での実行に対する実験的なサポートが導入され、Consul に PostgreSQL サービスを登録するための新しい構成パラメーターが提供されます。
新機能
-
スタンバイ クラスター (Dmitry Dolgov)
1 つ以上の Patroni ノードは、プライマリー クラスターと並行して (つまり、別のデータセンター内で) 実行されるスタンバイ クラスターを形成でき、プライマリー クラスターのマスターから複製するスタンバイ ノードで構成されます。スタンバイ クラスター内のすべての PostgreSQL ノードはレプリカです。これらのレプリカの 1 つはリモート マスターから直接レプリケートすることを選択し、他のレプリカは、その選出されたレプリカからカスケード方式でレプリケートします。この機能の詳細な説明といくつかの構成例については、ここで を参照してください。
-
Consul にサービスを登録する (Pavel Kirillov、Alexander Kukushkin)
Consul 構成 の
register_serviceパラメーターが有効な場合、ノードはscopeという名前とmaster、replica、またはstandby-leaderのタグを持つサービスを登録します。 -
実験的 Windows サポート (Pavel Golub)
今後、Patroni を Windows で実行できるようになりますが、Windows のサポートは新しく、対応する Linux ほど実際のテストは受けていません。フィードバックをお待ちしております。
patronictl の改善
-
patronictl -k/–insecure フラグを追加し、restapi cert をサポートしました。 (Wilfried Roset)
以前は、REST API が自己署名証明書によって保護されていた場合、patronictl はそれらを検証できませんでした。その検証を無効にする方法はありませんでした。証明書検証を完全にスキップするように patronictl を構成したり、構成の ctl: セクションで CA とクライアント証明書を提供したりできるようになりました。
-
patronictl switchover/failover出力から nofailover タグを持つメンバーを除外します (Alexander Anikin)
以前は、patronictl を介して対話型スイッチオーバーまたはフェイルオーバーを実行するときに、これらのメンバーが候補として誤って提案されていました。
安定性の向上
-
pg_controldata のキーと値以外の出力行を解析しないようにしました。 (Alexander Anikin)
特定の状況下では、pg_controldata はコロン文字のない行を出力します。これにより、pg_controldata 出力を解析する Patroni コードでエラーが発生し、実際の問題が隠蔽されてしまいます。多くの場合、このような行は、通常の出力の前に、つまりバイナリのメジャー バージョンが PostgreSQL データ ディレクトリのバージョンと一致しない場合に、pg_controldata によって示される警告として出力されます。
-
リーダー選挙中のエラー メッセージにメンバー名を追加しました (Jan Mussler)
リーダーの選出中、Patroni はクラスターのすべての既知のメンバーに接続し、そのステータスを要求します。このようなステータスは Patroni ログに書き込まれ、メンバーの名前も含まれます。以前は、メンバーにアクセスできない場合、エラー メッセージにはその名前が示されず、URL のみが含まれていました。
-
レプリケーション スロットの作成時に WAL 位置をすぐに予約します (Alexander Kukushkin)
9.6 以降、
pg_create_physical_replication_slot関数は追加のブール値パラメーターimmediately_reserveを提供します。これがデフォルトでもあるfalseに設定されている場合、スロットは最初のクライアント接続を受信するまで WAL 位置を予約しないため、スロットの作成と最初のクライアント接続の間の時間枠でクライアントが必要とする一部のセグメントが失われる可能性があります。 -
厳密な同期レプリケーションのバグを修正しました。 (Alexander Kukushkin)
synchronous_mode_strict: trueで実行すると、場合によっては、Patroni が*をsynchronous_standby_namesに置き、ほとんどのレプリケーション接続の同期状態をpotentialに変更します。以前は、Patroni は、async状態の同期候補のみを考慮するため、このような状況では同期候補を選択できませんでした。
バージョン 1.4.6
2018-08-14 リリース
バグ修正と安定性の向上
このリリースでは、非マスター ノードに対して Patroni API /master エンドポイントが 200 を返すという重大な問題が修正されています。これはレポートの問題であり、実際のスプリット ブレインではありませんが、特定の状況下ではクライアントが読み取り専用ノードに誘導される可能性があります。
-
降格時に is_leader ステータスをリセット (Alexander Kukushkin、Oleksii Kliukin)
降格されたクラスター メンバーが、/master API 呼び出しにコード 200 を返さなくなることを確認します。
-
新しい “cluster_unlocked” フィールドを API 出力に追加しました (Dmitry Dolgov)
このフィールドは、クラスターでマスターが実行されているかどうかを示します。これは、レプリカの 1 つ以外の他のノードをクエリーできない場合に使用できます。
バージョン 1.4.5
2018-08-03 リリース
新機能
-
新しい postgres 構成を適用する際のロギングを改善しました (Don Seiler)
Patroni は、変更されたパラメータ名と値をログに記録します。
-
Python 3.7 の互換性 (Christoph Berg)
async は python3.7 の予約キーワードです。
-
メンバーがシャットダウンされたときに、DCS の状態を “stopped” に設定します (Tony Sorrentino)
これにより、メンバーの状態が「patronictl list」コマンドの “stopped” として表示されます。
-
古いpostmaster.pidが実行中のプロセスと一致する場合に記録されるメッセージを改善しました(Ants Aasma)
以前のメッセージは極めてわかりにくいものでした。
-
patronictl reload機能を実装します (Don Seiler)
それまでは、REST API を呼び出すか、SIGHUP シグナルを Patroni プロセスに送信することによってのみ構成をリロードできました。
-
レプリカとして開始するときにcontroldataからいくつかのパラメーターを取得して適用します (Alexander Kukushkin)
グローバル構成で設定される
max_connectionsおよびその他のパラメーターの値は、プライマリーで実際に使用される値よりも低い場合があります。この問題が発生すると、レプリカは起動できないため、手動で修正する必要があります。 Patroni は、pg_controldataから値を読み取って適用し、postgres を起動してpending_restartフラグを設定することで、これを処理します。 -
設定されている場合、postgresの起動時にLD_LIBRARY_PATHを使用します。 (Chris Fraser)
Postgres を起動するとき、Patroni は、PATH、LC_ALL、および LANG 環境変数が設定されている場合はそれらを渡していました。現在は LD_LIBRARY_PATH でも同じことを行っています。誰かが PostgreSQL を標準以外の場所にインストールすると役立つはずです。
-
create_replica_method の名前を create_replica_methods に変更しました。 (Dmitry Dolgov)
それが実際には配列であることを明確にするためです。下位互換性のために古い名前も引き続きサポートされています。
バグ修正と安定性の向上
-
一時停止モードで pg_rewind に関連するレプリカ起動条件を修正しました (Oleksii Kliukin)
以前に pg_rewind を実行したレプリカを起動しないようにしてください。
-
update_lock が成功した場合にのみ、200 をマスター ヘルスチェックに応答します。 (Alexander Kukushkin)
DCS がパーティション化されている場合に、以前の (降格された) マスター上で Patroni が自身をマスターとして報告しないようにします。
-
新しい consul モジュールとの互換性を修正しました (Alexander Kukushkin)
v1.1.0 から、python-consul は内部 API を変更し、クエリー パラメーターを渡すために
dictの代わりにlistを使用し始めました。 -
シャットダウン中に Patroni REST API スレッドからの例外をキャッチします (Alexander Kukushkin)
これらのキャッチされなかった例外により、シャットダウン時に PostgreSQL が実行され続けました。
-
Postgres がマスターとして実行されている場合にのみクラッシュ回復を行うようにしました。 (Alexander Kukushkin)
pg_controldataが ‘in production’、‘shutting down’、または ‘in crash recovery’ を報告することを要求します。それ以外の場合はすべて、クラッシュからの回復は必要ありません。 -
構成エラーの処理を改善しました (Henning Jacobs、Alexander Kukushkin)
Patroni 構成ファイルを更新し、SIGHUP を Patroni プロセスに送信することで、実行時に多くのパラメーター (
restapi.listenを含む) を変更することができます。この修正により、一部のパラメーターが無効な値を受け取った場合に、‘restapi’ スレッドから不明瞭な例外が排除されます。
バージョン 1.4.4
2018-05-22 リリース
安定性の向上
-
poll_failover_result の競合状態を修正しました (Alexander Kukushkin)
これはフェイルオーバーにもスイッチオーバーにも直接影響しませんでしたが、まれに、元のリーダーがロックを解放したときに成功を報告するのが早すぎて、‘Failed over to “desired-node”’ の代わりに ‘Failed over to “None”’ というメッセージが生成されることがありました。
-
Postgres パラメータ名を大文字と小文字を区別しないように扱います。 (Alexander Kukushkin)
Postgres パラメーターのほとんどには snake_case 名が付いていますが、この規則には DateStyle、IntervalStyle、TimeZone の 3 つの例外があります。 Postgres は、これらのパラメーターが異なる大文字・小文字で記述されている場合 (例: timezone = ‘some/tzn’) でも受け入れます。ただし、Patroni は、pg_settings でこれらのパラメーター名の大文字と小文字を区別しない一致を見つけることができず、結果としてそのようなパラメーターを無視しました。
-
実行中のpostgresにアタッチし、クラスターが初期化されていない場合、開始を中止します。 (Alexander Kukushkin)
Patroni は、すでに実行中の Postgres インスタンスにそれ自体をアタッチできます。レプリカ上で Patroni を起動する前に、マスター ノードで Patroni の実行を開始することが不可欠です。
-
patronictl scaffold の動作を修正しました (Alexander Kukushkin)
JSON でエンコードされた文字列の代わりに dict オブジェクトを
touch_memberに渡します。 DCS 実装がエンコードを処理します。 -
一時停止中にリーダーキーの更新に失敗した場合にマスターを降格しません。 (Alexander Kukushkin)
メンテナンス中、DCS は読み取り要求には応答し続けながら、書き込み要求は失敗し始める可能性があります。この場合、Patroni は、DCS のリーダー ロックの更新に失敗した後、Postgres マスター ノードを読み取り専用モードに設定していました。
-
Patroni が新しいポストマスター プロセスを認識したときにレプリケーション スロットを同期するようになりました。 (Alexander Kukushkin)
Postgres が再起動された場合、Patroni はレプリケーション スロットのリストが期待どおりであることを確認する必要があります。
-
一時停止から復帰した後に sysid を確認し、レプリケーション スロットを同期します (Alexander Kukushkin)
maintenanceモード中に、データ ディレクトリが完全に書き換えられる可能性があるため、Database system identifierがまだクラスターに属しており、レプリケーション スロットが Patroni の期待と同期していることを確認する必要があります。 -
停止中の Postgres を、ポストマスター ロック ファイルが残るデータ ディレクトリで起動できない場合がある問題を修正しました。 (Alexander Kukushkin)
ポストマスター ロック ファイルから PID の再利用を検出します。 Docker コンテナーで Patroni および Postgres を実行すると、このような問題が発生する可能性が高くなります。
-
DCS が誤ってワイプされた場合の保護を強化しました (Alexander Kukushkin)
Patroni には、このような場合にフェイルオーバーを防ぐためのロジックが多数組み込まれています。すべてのキーを元に戻すこともできます。ただし、この変更が行われるまでは、/config キーを誤って削除すると、HA ループの 1 サイクルの一時停止モードがオフになっていました。
-
無効なシステム ID に遭遇した場合に終了しない (Oleksii Kliukin)
クラスター システム ID が空の場合、または検証チェックに合格しない場合は終了しないでください。その場合、クラスターの再初期化が必要になる可能性が高くなります。結果メッセージにそれを記載してください。 Patroni を終了しないでください。終了すると再初期化ができなくなります。
Kubernetes 1.10+ との互換性
-
空のサブセットのチェックを追加しました (Cody Coons)
Kubernetes 1.10.0+ は、
[]ではなくNoneに設定されたEndpoints.subsetsを返すようになりました。
Bootstrap の改善
-
recovery.conf の削除をオプションにします (Brad Nicholson)
bootstrap.<custom_bootstrap_method_name>.keep_existing_recovery_confが定義され、Trueに設定されている場合、Patroni は既存のrecovery.confファイルを削除しません。これは、適切なrecovery.confを生成する pgBackRest などのツールを使用してバックアップからブートストラップする場合に便利です。 -
basebackup 組み込みメソッドへのオプションを許可します (Oleksii Kliukin)
カスタム レプリカ作成メソッドの定義方法と同様に、構成内で
basebackupセクションを定義することで、組み込みの Basebackup メソッドにオプションを提供できるようになりました。違いは、basebackupセクションで受け入れられる形式にあります。pg_basebackup は--key=valueオプションと--keyオプションの両方を受け入れるため、セクションの内容は、キーと値のペアの辞書、または 1 要素の辞書や単独のキー (値を受け入れないオプションの場合) から成るリスト のいずれかになります。追加の例については、レプリカ作成方法 セクションを参照してください。
バージョン 1.4.3
2018-03-05 リリース
ロギングの改善
-
ログ レベルを環境変数から設定できるようにしました (Andy Newton、Keyvan Hedayati)
PATRONI_LOGLEVEL- 一般的なログ レベルを設定します。PATRONI_REQUESTS_LOGLEVEL- すべての HTTP リクエスト (例: Kubernetes API 呼び出し) のログ レベルを設定します。可能なログ レベルの名前を取得するには、Python ロギングのドキュメント のドキュメントを参照してください。
安定性の向上とバグ修正
-
監視がタイムアウトしたときに etcd クラスター トポロジを再検出しないようにしました。 (Alexander Kukushkin)
etcd 構成にホストが 1 つだけあり、そのホストにアクセスできない場合、Patroni はクラスター トポロジの検出を開始しましたが、決して成功しませんでした。代わりに、次の利用可能なノードに切り替える必要があります。
-
カスタム ブートストラップの後に bootstrap.pg_hba の内容を pg_hba.conf に書き込みます (Alexander Kukushkin)
initdbを使用した通常のブートストラップと同様に動作するようになりました。 -
シングル ユーザー モードはユーザー入力を待機していて終了しませんでした (Alexander Kukushkin)
回帰は https://github.com/patroni/patroni/pull/576 で導入されました
バージョン 1.4.2
2018-01-30 リリース
patronictl の改善
-
スケジュールされたフェイルオーバーの名前をスケジュールされたスイッチオーバーに変更しました (Alexander Kukushkin)
フェイルオーバー機能とスイッチオーバー機能はバージョン 1.4 で分離されましたが、
patronictl listは依然としてScheduled switchoverではなくScheduled failoverを報告していました。 -
保留中の再起動に関する情報を表示する (Alexander Kukushkin)
一部の構成変更を適用するには、postgres を再起動する必要がある場合があります。 Patroni は、REST API と、ノードのステータスを DCS に書き込むときに、すでにそのヒントを提供していましたが、それを表示する簡単な方法はありませんでした。
-
show-config が設定ファイルの cluster_nameで動作するようにしました。 (Alexander Kukushkin)
patronictl edit-configと同様に機能します。
安定性の向上
-
ブートストラップ中に pg_controldata を呼び出さないようにします。 (Alexander Kukushkin)
initdb またはカスタム ブートストラップ中に、pgdata は空ではないが、pg_control がまだ書き込まれていない時間帯があります。このような場合、pg_controldata 呼び出しはエラー メッセージとともに失敗していました。
-
psutil から発生した例外を処理するようになりました。 (Alexander Kukushkin)
cmdline は、
cmdline()メソッドが呼び出されるたびに読み取られて解析されます。検査対象のプロセスがすでに消滅している場合もあり、その場合はNoSuchProcessが発生します。
Kubernetes サポートの改善
-
k8s API からのエラーを飲み込まない (Alexander Kukushkin)
Kubernetes API の呼び出しは、さまざまな理由で失敗する可能性があります。場合によっては、そのような呼び出しを再試行する必要がありますが、他の場合には、エラー メッセージと例外スタック トレースを記録する必要があります。ここでの変更は、Kubernetes 権限の問題のデバッグに役立ちます。
-
Kubernetes サンプル Dockerfile を更新して、master ブランチから Patroni をインストールします (Maciej Szulik)
それまでは
feature/k8sを使用していましたが、これは時代遅れになりました。 -
k8s で Patroni を実行するために適切な RBAC を追加しました (Maciej Szulik)
クラスターのポッドに割り当てられるサービス アカウント、必要な権限のみを保持するロール、およびサービス アカウントとロールを接続するロールバインディングを追加します。
バージョン 1.4.1
2018-01-17 リリース
patronictl の修正
-
フェイルオーバー先のメンバーの推奨リストに現在のリーダーを表示しません。 (Alexander Kukushkin)
patronictl failoverは、クラスター内にリーダーがある場合でも機能する可能性があるため、フェイルオーバー先のメンバーのリストから除外する必要があります。
-
patronictl switchoverを古い Patroni API と互換性のあるものにします (Alexander Kukushkin)
POST /switchover REST API 呼び出しがステータス コード 501 で失敗した場合、/failover エンドポイントに対して再度実行されます。
バージョン 1.4
2018-01-10 リリース
このバージョンでは、Kubernetes を DCS として使用するためのサポートが追加されており、etcd、Zookeeper、または Consul を追加展開することなく、Kubernetes でクラウドネイティブ エージェントとして Patroni を実行できるようになります。
アップグレードのお知らせ
pip 経由で Patroni をインストールすると、(etcd、Zookeeper、Consul または Kubernetes のライブラリ、または AWS のサポートなど) の依存関係が取り込まれなくなります。それらを有効にするには、pip install 'patroni[etcd,kubernetes]' のように、pip install コマンドで明示的にリストする必要があります。
Kubernetes のサポート
Kubernetes ベースの DCS を実装します。エンドポイントのメタデータは、構成とリーダー キーを保存するために使用されます。ポッド定義内のメタデータ フィールドは、メンバー関連のデータを保存するために使用されます。エンドポイントの使用に加えて、Patroni は ConfigMaps をサポートします。この機能の詳細については、ドキュメントの Kubernetes 章 を参照してください。
安定性の向上
-
ポストマスタープロセスを別のオブジェクトに分解します (Ants Aasma)
このオブジェクトは、pid と開始時刻を介して実行中のポストマスター プロセスを識別し、ポストマスターが Patroni の知らないうちに再起動されたとき、または postgres ディレクトリがファイル システムから消えたときの状況の検出 (および解決) を簡素化します。
-
HA サイクルの各ループで Patroni によって発行される SELECT の量を最小限に抑えます。 (Alexander Kukushkin)
HA ループの反復ごとに、Patroni はリカバリ ステータスと絶対 WAL 位置を知る必要があります。今後、Patroni はこの情報を取得するために、レプリカ上で 2 つ、マスター上で 3 つではなく、単一の SELECT のみを実行します。
-
ロックを保持している場合にのみ、シャットダウン時にリーダー キーを削除します (Ants Aasma)
無条件の削除により、不要で誤解を招く例外が生成されていました。
patronictl の改善
-
patronictl にversion コマンドを追加 (Ants Aasma)
インストールされている Patroni のバージョンと、実行中の Patroni インスタンスのバージョン (クラスター名が指定されている場合) が表示されます。
-
patronictl コマンドの一部で、cluster_name 引数をオプションで指定できるようにしました (Alexander Kukushkin、Ants Aasma)
patronictl が
scopeが定義された通常の Patroni 構成ファイルを使用している場合に機能します。 -
スケジュールされたスイッチオーバーとメンテナンス モードに関する情報を表示します (Alexander Kukushkin)
それ以前は、この情報は Patroni ログから、または DCS から直接のみ取得できました。
-
patronictl reinitを改善 (Alexander Kukushkin)Patroni が他のアクション、つまり postgres を開始しようとしてビジー状態のときに、
patronictl reinitが続行を拒否することがありました。 patronictl には、このような長時間実行アクションをキャンセルするコマンドが提供されておらず、唯一の (危険な) 回避策はデータ ディレクトリを手動で削除することでした。reinitの新しい実装は、再初期化を続行する前に、他の長時間実行アクションを強制的にキャンセルします。 -
patronictl pauseおよびpatronictl resumeに--waitフラグを実装しました (Alexander Kukushkin)要求されたアクションがクラスター内のすべてのノードによって承認されるまで、patronictl は待機します。このような動作は、DCS のすべてのノードに対して pause フラグを公開し、REST API を介して実現されます。
-
patronictl failoverをpatronictl switchoverに名前変更します (Alexander Kukushkin)以前の
failoverは、実際にはスイッチオーバーのみが可能でした。リーダーのいないクラスターでは実行を拒否していました。 -
patronictl failoverの動作を変更しました (Alexander Kukushkin)リーダーがない場合でも機能しますが、その場合は新しいリーダーとなるノードを明示的に指定する必要があります。
タイムラインと履歴に関する情報の公開
-
現在のタイムラインを DCS および API 経由で公開します (Alexander Kukushkin)
クラスターの各メンバーの現在のタイムラインに関する情報を保存します。この情報は API 経由でアクセスでき、DCS に保存されます。
-
プロモーション履歴を DCS の /history キーに保存します (Alexander Kukushkin)
さらに、対応するプロモーションのタイムスタンプで強化されたタイムライン履歴を DCS の /history キーに保存し、プロモートごとに更新します。
同期および非同期レプリカを取得するためのエンドポイントを追加する
- 新しい /sync および /async エンドポイントを追加します (Alexander Kukushkin、Oleksii Kliukin)
これらのエンドポイント (/synchronous および /asynchronous としてもアクセス可能) は、それぞれ同期レプリカと非同期レプリカに対してのみ 200 を返します (
noloadbalanceとしてマークされたものを除く)。
etcd に対して複数のホストを許可する
-
Etcd 設定に新しい
hostsパラメータを追加しました。 (Alexander Kukushkin)このパラメーターには、実行中の etcd クラスター メンバーのリストを検出して設定するために使用されるホストの初期リストが含まれている必要があります。作業中に何らかの理由で、この検出されたホストのリストが使い果たされた場合 (そのリストに使用可能なホストがない場合)、Patroni は
hostsパラメーターから初期リストに戻ります。
バージョン 1.3.6
2017-11-10 リリース
安定性の向上
-
postgres が実行されているかどうかを確認するときに、プロセスの開始時間を確認します。 (Ants Aasma)
postmaster.pid をクリーンアップしないクラッシュの後は、同じ pid を持つ新しいプロセスが存在する可能性があり、その結果 is_running() の誤検出が発生し、あらゆる種類の不正な動作につながります。
-
データ ディレクトリを失った場合、ブートストラップの前に PostgreSQL をシャットダウンします (ainlolcat)
マスター上のデータ ディレクトリが強制的に削除されると、postgres プロセスがしばらくの間生きたままになり、元のマスターの代わりに作成されたレプリカの起動や複製が妨げられることがあります。この修正により、Patroni はポストマスター PID とその開始時刻をキャッシュし、対応するデータ ディレクトリが削除された後も古いポストマスターがまだ実行されている場合に備えて古いポストマスターを終了できるようになります。
-
postgres マスターが停止した場合にシングル ユーザー モードでクラッシュ リカバリを実行します。 (Alexander Kukushkin)
postgres が正常にシャットダウンされていない場合、すぐにスタンバイとして起動するのは安全ではなく、
pg_rewindも実行できません。シングル ユーザー クラッシュ リカバリは、pg_rewindが有効になっている場合、または現時点でマスターが存在しない場合にのみ開始されます。
Consul の改善
-
Consul のデータセンター構成を提供できるようにします (Vilius Okockis、Alexander Kukushkin)
それまでは、Patroni は常に、それが実行されているホストのデータセンターと通信していました。
-
常に X-Consul-Token http ヘッダーでトークンを送信します (Alexander Kukushkin)
consul.tokenが Patroni 構成で定義されている場合、常に「X-Consul-Token」http ヘッダーで送信されます。 python-consul モジュールは、Consul REST API との「一貫性」を保とうとするもので、Consul REST API は セッション API のクエリー パラメーターとしてトークンを受け入れませんが、「X-Consul-Token」ヘッダーでは引き続き機能します。 -
指定された値が可能な最小値より小さい場合、セッション TTL を調整します。 (Stas Fomin、Alexander Kukushkin)
Patroni 構成で提供される TTL が、Consul でサポートされる最小値よりも小さい場合があります。その場合、Consul エージェントは新しいセッションの作成に失敗します。セッションがないと、Patroni は Consul KV ストアにメンバー キーとリーダー キーを作成できず、クラスターが異常な状態になります。
その他の改善点
-
環境変数
PATRONI_LOGFORMATを使用してカスタム ログ形式を定義します (Stas Fomin)システム ロガーによってすでに追加されている場合 (通常は Patroni がサービスとして実行されている場合)、Patroni ログ内のタイムスタンプやその他の同様のフィールドを無効にすることができます。
バージョン 1.3.5
2017-10-12 リリース
バグ修正
-
データ ディレクトリが削除された場合はロールを ‘uninitialized’ に設定します。 (Alexander Kukushkin)
ノードがマスターとして実行されている場合、フェイルオーバーが妨げられていました。
安定性の向上
-
postgres を起動しようとして失敗した場合は、シングルユーザー モードで postmaster を実行してみてください。 (Alexander Kukushkin)
通常、このような問題は、マスターとして実行されているノードが終了し、タイムラインが分岐したときに発生します。
recovery.confにrestore_commandが定義されている場合、postgres が起動を中止し、制御データが変更されないままになる可能性が非常に高くなります。 正常にシャットダウンされていることを前提とするpg_rewindを使用できなくなります。
Consul の改善
-
セッション作成時にヘルスチェックを指定できるようにしました。 (Alexander Kukushkin)
指定しない場合、Consul は「serfHealth」を使用します。これにより、孤立したマスターを迅速に検出できるようになります。一方で、Patroni が短いネットワーク遅延を許容できなくなります。
バグ修正
-
Python 3 のウォッチドッグを修正 (Ants Aasma)
ioctl() 呼び出しインターフェースの誤解。 mutable=False の場合、fcntl.ioctl() は実際に arg バッファを返します。 int と str の比較でエラーが返されなかったため、これは Python2 で誤って機能しました。エラー報告は実際には、Python2 では IOError を、Python3 では OSError を発生させることによって行われます。
バージョン 1.3.4
2017-09-08 リリース
Consul のさまざまな改善
-
Consul トークンをヘッダーとして渡す (Andrew Colin Kissa)
ヘッダーは、トークンを Consul API に渡すための推奨される方法になりました。
-
Consul の高度な構成 (Alexander Kukushkin)
scheme、token、クライアント証明書および CA 証明書を指定できます (詳細 )。 -
python-consul-0.7.1 以降との互換性 (Alexander Kukushkin)
新しい python-consul モジュールはいくつかのメソッドのシグネチャを変更しました
-
「Could not take out TTL lock」メッセージがログに記録されていませんでした。 (Alexander Kukushkin)
重大なバグではありませんが、適切なログが記録されていないと、問題が発生した場合の調査が複雑になります。
quote_ident を使用して synchronous_standby_names を引用する
-
synchronous_standby_namesをpostgresql.confに書き込むときは、その値を引用符で囲む必要があります。 (Alexander Kukushkin)正しく引用符で囲まれていない場合、PostgreSQL は事実上同期レプリケーションを無効にし、動作を継続します。
一時停止状態に関するさまざまなバグ修正。主にウォッチドッグに関連します。 (Alexander Kukushkin)
- ウォッチドッグがアクティブでない場合はキープアライブを送信しない
- 一時停止モードでウォッチドッグをアクティブ化しないでください
- 一時停止モードで正しい postgres 状態を設定する
- postgres が停止している場合は、API からクエリーを実行しないでください
バージョン 1.3.3
2017-08-04 リリース
バグ修正
- 同期レプリケーションは、synchronous_mode_strict がオンになっている場合でも、昇格直後に無効になりました。 (Alexander Kukushkin)
- バックアップからのリストア後に
pg_ident.confが存在しない場合、空のファイルを作成するようにしました(Alexander Kukushkin)。 pg_hba.confで postgres だけでなくすべてのデータベースにアクセスできるようになりました (Franco Bellagamba)
バージョン 1.3.2
2017-07-31 リリース
バグ修正
- patronictl edit-config が ZooKeeper では動作しませんでした。 (Alexander Kukushkin)
バージョン 1.3.1
2017-07-28 リリース
バグ修正
_MemberStatusの変更により、API 経由の フェイルオーバーが機能しませんでした。 (Alexander Kukushkin)
バージョン 1.3
2017-07-27 リリース
バージョン 1.3 では、カスタム ブートストラップの可能性が追加され、pg_rewind のサポートが大幅に改善され、同期モードのサポートが強化され、patronictl に構成編集が追加され、Linux でウォッチドッグ サポートが実装されます。さらに、これは PostgreSQL 10 で正しく動作する最初のバージョンです。
アップグレードのお知らせ
新しいバージョンの Patroni との互換性に関する既知の問題はありません。バージョン 1.2 からの構成は変更せずに機能するはずです。新しいパッケージをインストールして Patroni を再起動する (PostgreSQL が再起動する) か、最初に Patroni を 一時停止モード に入れてからクラスター内のすべてのノードで Patroni を再起動する (一時停止モードの Patroni は PostgreSQL の停止/開始を試行しません) ことによって、最後に一時停止モードから再開することでアップグレードできます。
カスタムブートストラップ
-
クラスターのブートストラップのプロセスを構成可能にしました (Alexander Kukushkin)
クラスター内の最初のノードを初期化するときに、
initdbの代わりにカスタム ブートストラップ スクリプトを許可します。ブートストラップ コマンドは、クラスターの名前とデータ ディレクトリへのパスを受け取ります。結果として得られるクラスターはリカバリを実行するように構成でき、バックアップからブートストラップしてポイントインタイムリカバリを実行できるようになります。この機能の詳細については、ドキュメントページ を参照してください。
よりスマートな pg_rewind サポート
-
現在のマスターとのタイムラインの違いを見て、pg_rewind を実行するかどうかを決定します。 (Alexander Kukushkin)
以前は、Patroni には、pg_rewind をトリガーする一連の固定条件がありました。つまり、元のマスターを起動するとき、指定されたノードへのスイッチオーバー時にクラスター内の他のすべてのノードで pg_rewind を実行するとき、または nofailover タグを持つレプリカが存在するときです。これらすべてのケースに共通するのは、一部のレプリカが新しいマスターよりも (WAL 位置が) 先行している可能性があるということです。場合によっては、pg_rewind が何も行わなかったり、必要なときに実行されなかったりする場合もありました。この限られたルールのリストに依存する代わりに、Patroni でマスターとレプリカの WAL 位置を (ストリーミング レプリケーション プロトコルを使用して) 比較し、レプリカに巻き戻しが必要かどうかを確実に判断します。
同期レプリケーションモード厳密
-
厳密モードを追加して同期レプリケーションのサポートを強化しました (James Sewell、Alexander Kukushkin)
通常、synchronous_mode が有効で、マスターにレプリカが接続されていない場合、Patroni はマスターを書き込みに使用できる状態に保つために同期レプリケーションを無効にします。
synchronous_mode_strictオプションはこれを変更します。このオプションが設定されている場合、Patroni はレプリカが不足していても同期レプリケーションを無効にせず、マスターへのデータ書き込みを行うすべてのクライアントを事実上ブロックします。自動フェイルオーバーによるデータ損失を防止する同期モードの保証に加えて、ストリクト モードでは、各書き込みが 2 つのノードに永続的に保存されるか、クラスター内にノードが 1 つしかない場合には完全に書き込みが行われないことが保証されます。
patronictl を使用した構成編集
-
patronictl に構成編集を追加しました (Ants Aasma、Alexander Kukushkin)
DCS に保存されている動的クラスター構成を編集する機能を patronictl に追加します。コマンドラインからのパラメーター/値の指定、$EDITOR の呼び出し、または yaml ファイルからの構成の適用のいずれかをサポートします。
Linux ウォッチドッグのサポート
-
Linux のウォッチドッグ サポートを実装します (Ants Aasma)
Patroni が実行されていない、または応答していない (高負荷などの理由で) ノードを再起動するために、Linux ソフトウェア ウォッチドッグをサポートします。Linux ソフトウェア ウォッチドッグは、応答しないノードを再起動します。 Patroni 構成のwatchdog セクションから、使用するウォッチドッグ デバイス (デフォルトでは
/dev/watchdog) とモード (on、automatic、off) を構成できます。詳細については、ウォッチドッグのドキュメント から入手できます。
PostgreSQL 10 のサポートを追加
- Patroni は、これまでにリリースされた PostgreSQL 10 のすべてのベータ版と互換性があり、リリースされる予定の PostgreSQL 10 とも互換性があると予想されます。
PostgreSQL 関連の軽微な改善
-
Patroni 構成ファイルまたは DCS の動的構成を介して pg_hba.conf を定義します (Alexander Kukushkin)
構成の
postgresqlセクションのpg_hbaサブセクションでpg_hba.confの内容を定義できるようにします。これにより、複数のノードでのpg_hba.confの管理が簡素化されます。すべてのノードにログインして手動で変更し、構成をリロードする代わりに、DCS で一度だけ定義すればよいためです。定義すると、このセクションの内容は現在の
pg_hba.confを完全に置き換えます。hba_filePostgreSQL パラメータが設定されている場合、Patroni はこれを無視します。 -
UNIX ソケットを介したローカル PostgreSQL クラスターへの接続をサポートしました (Alexander Kukushkin)
Patroni 構成の
postgresqlセクションにuse_unix_socketオプションを追加します。 true に設定され、PostgreSQLunix_socket_directoriesオプションが空でない場合、Patroni はその最初の値を使用してローカル PostgreSQL クラスターに接続できます。unix_socket_directoriesが定義されていない場合、Patroni はそのデフォルト値を想定し、PostgreSQL 接続文字列内のhostパラメーターを完全に省略します。 -
リロード時のスーパーユーザーおよびレプリケーション資格情報の変更をサポートしました (Alexander Kukushkin)
-
PostgreSQL データ ディレクトリ外への構成ファイルの保存をサポート (@jouir)
新しい構成
postgresql構成ディレクティブconfig_dirを追加します。デフォルトはデータ ディレクトリであり、Patroni によって書き込み可能である必要があります。
バグ修正と安定性の向上
-
EtcdEventIndexCleared および EtcdWatcherCleared 例外を処理します (Alexander Kukushkin)
無駄な再試行を回避することで、etcd によって監視操作が終了された場合の回復が高速化されます。
-
Etcd 障害時にスピンするエラーを削除し、ログ スパムを削減します (Ants Aasma)
2 回目以降の etcd 接続失敗時に、すぐに再試行してスタック トレースをログに出力することは避けてください。
-
PostgreSQL プロセスをフォークするときにロケール変数をエクスポートする (Oleksii Kliukin)
NLS で構築された PostgreSQL の英語以外のロケールでの
postmaster became multithreaded during startup致命的エラーを回避します。 -
レプリケーション スロットを削除する際の追加チェック (Alexander Kukushkin)
場合によっては、Patroni は、WAL 送信者によってレプリケーション スロットを削除できなくなります。
-
PostgreSQL 命名規則に準拠するために、レプリケーション スロット名を 63 (NAMEDATALEN - 1) 文字に切り詰めます (Nick Scott)
-
Patroni から PostgreSQL クラスターに対して余分な接続が開かれるという競合状態を修正しました。 (Alexander Kukushkin)
-
ノードが空のデータ ディレクトリで再起動するときにリーダー キーを解放します (Alex Kerney)
-
リーダーなしでブートストラップを実行するときに非同期エグゼキュータをビジーに設定します。 (Alexander Kukushkin)
これを行わないと、Patroni はクラスター内にリーダーが存在する必要のないブートストラップ メソッドによってブートストラップされながら通常の業務を続行したため、ノードが別のクラスターに属していることを示すエラーが発生する可能性がありました。
-
WAL-E レプリカ作成方法を改善しました (Joar Wandborg、Alexander Kukushkin)。
- WAL-E ベース バックアップを解析するときに csv.DictReader を使用し、スペースで区切られた日付と時刻を持つ ISO 日付を受け入れます。
- 復元する WAL の量を見積もるために、レプリカから現在の WAL 位置を取得することをサポートします。以前は、コードはマスター ノードでのみ利用可能なシステム情報関数を呼び出すために使用されていました。
バージョン 1.2
2016-12-13 リリース
このバージョンでは、同期レプリケーションの処理が大幅に改善され、起動プロセスとフェイルオーバーの信頼性が向上し、PostgreSQL 9.6 サポートが追加され、多くのバグが修正されています。さらに、これらのリリース ノートを含むドキュメントは https://patroni.readthedocs.io に移動されました。
同期レプリケーション
-
同期レプリケーションのサポートを追加します。 (Ants Aasma)
新しい構成変数 synchronous_mode を追加します。有効にすると、Patroni は
synchronous_standby_namesを管理し、利用可能な正常なスタンバイがあるときは常に同期レプリケーションを有効にします。同期モードが有効な場合、Patroni はマスター障害時に同期レプリケーションを行っていたスタンバイにのみ自動的にフェイルオーバーします。これは事実上、そのような場合にユーザーに表示されるトランザクションが失われないことを意味します。詳細な説明と実装の詳細については、機能ドキュメント を参照してください。
信頼性の向上
-
PostgreSQL が 100% 正常でない場合は、
leader optimeキーに保存されているリーダーの位置を更新しないでください。リーダーキーの更新に失敗した場合は直ちに降格します。 (Alexander Kukushkin) -
新しいレプリカをクローンするためのソース候補のリストから異常なノードを除外します。 (Alexander Kukushkin)
-
Etcd の場合と同様に、Consul の再試行およびタイムアウト戦略を実装します。 (Alexander Kukushkin)
-
--dcsと--config-fileを patronictl のすべてのオプションに適用します。 (Alexander Kukushkin) -
すべての postgres パラメータを postgresql.conf に書き込みます。 (Alexander Kukushkin)
これにより、Patroni によって構成された PostgreSQL を
pg_ctlだけで起動できます。 -
構成にユーザーが存在しない場合の例外を回避します。 (Kirill Pushkin)
-
異常なクラスターの一時停止を許可します。この修正が行われる前は、一時停止を実行しようとしたノードが異常な場合、patronictl は中断していました。 (Alexander Kukushkin)
-
リーダー監視機能を改善します。 (Alexander Kukushkin)
以前は、レプリカは常にリーダー キーを監視していました (タイムアウトになるかリーダー キーが変更されるまでスリープ状態でした)。この変更により、レプリカの PostgreSQL が
running状態にある場合のみ監視され、PostgreSQL の停止/起動または再起動の場合は監視されません。 -
SIGCHLD を PID 1 として処理するときに競合状態が発生するのを避けてください。 (Alexander Kukushkin)
以前は、Patroni 内の同じプロセスが新しいプロセスを生成し、そこから SIGCHLD を処理していたため、Docker コンテナー内で実行すると競合状態が発生する可能性がありました。この変更では、Patroni に fork/execs を使用し、元の PID 1 プロセスに子からのシグナルの処理を任せます。
-
WAL-E 復元を修正します。 (Oleksii Kliukin)
以前の WAL-E リストアでは、マスターとの協議を完全に回避するために
no_masterフラグが使用されていたため、Patroni は常にpg_basebackupではなく WAL からのリストアを選択していました。この変更により、no_masterの元の意味に戻ります。つまり、マスターが実行されていない場合、レプリケーション方法として Patroni WAL-E リストアが選択される可能性があります。後者は、メソッドに渡された接続文字列を調べることによってチェックされます。さらに、再試行メカニズムがより堅牢になり、他の細かい点も処理されます。 -
非同期 DNS リゾルバー キャッシュを実装します。 (Alexander Kukushkin)
DNS が一時的に利用できない場合 (たとえば、ノードが受信する過剰なトラフィックが原因で) 失敗することを避けてください。
-
開始状態とマスター開始タイムアウトを実装します。 (Ants Aasma、Alexander Kukushkin)
以前は、
pg_ctlはタイムアウトを待ってから、PostgreSQL が実行中であるとみなして処理を続行していました。これにより、PostgreSQL が実際には実行されていないのにリストに実行中として表示され、競合状態が発生して、フェイルオーバー、クラッシュ リカバリ、またはフェイルオーバーによって中断されたクラッシュ リカバリと巻き戻しのミスが発生しました。この変更により、master_start_timeoutパラメーターが追加され、メインの HA ループに新しい状態 (starting) が導入されます。master_start_timeoutが 0 の場合、マスターがクラッシュしたときにフェイルオーバー候補が存在するとすぐにフェイルオーバーします。それ以外の場合、Patroni はマスター上で PostgreSQL を開始しようとした後、タイムアウトの間待機します。有効期限が切れると、可能であればフェイルオーバーされます。手動フェイルオーバー要求は、マスターのクラッシュ中にタイムアウト期限が切れる前であっても受け付けられます。timeoutパラメーターをrestartAPI エンドポイントおよび patronictl に導入します。これが設定され、再起動にタイムアウトよりも長い時間がかかると、PostgreSQL は異常とみなされ、他のノードがリーダー ロックを取得できるようになります。 -
一時停止モードでの
pg_rewindの動作を修正しました。 (Ants Aasma)Patroni が巻き戻しが必要であると考えているが巻き戻しができない場合 (つまり、
pg_rewindが存在しない場合)、一時停止モードでの不必要な再起動を回避します。pg_rewind関連の Patroni 構成セクションにsuperuser認証が欠落している場合、superuser(デフォルトの OS ユーザー) のデフォルトのlibpq値にフォールバックします。 -
コールバックの実行をシリアル化します。新しいコールバックが実行されようとしているときに、同じタイプの前のコールバックを強制終了します。コールバックの実行時にゾンビ プロセスが生成される問題を修正します。 (Alexander Kukushkin)
-
リーダー キーが DCS に設定されているにもかかわらず、このリーダー キーへの更新が失敗する場合は、以前のマスターを昇格させないでください。 (Alexander Kukushkin)
これにより、現在のマスターが etcd および「一貫性のない読み取り」を許可する他の DCS の少数のノードとともにパーティション化されている場合にその役割を維持し続けるという問題が回避されます。
その他
-
ブートストラップに
post_init構成オプションを追加します。 (Alejandro Martínez)Patroni は、
initdbを実行し、新しいクラスターに対して PostgreSQL を起動した直後に、このオプションのスクリプト引数を呼び出します。このスクリプトは、superuserを使用する接続 URL を受け取ります。パスワードが指定されている場合、Patroni はそのパスワードを含む.pgpassファイルを指すようにPGPASSFILEを設定します。スクリプトが失敗すると、Patroni の初期化も失敗します。これは、新しいユーザーを追加したり、新しいクラスターに拡張機能を作成したりする場合に便利です。 -
PostgreSQL 9.6 サポートを実装します。 (Alexander Kukushkin)
wal_level = replicaをhot_standbyの同義語として使用し、これらの wal_level 値を切り替えるときに pending_restart フラグを回避します。 (Alexander Kukushkin)
ドキュメントの改善
-
Patroni メイン ループワークフロー図 を追加します。 (Alejandro Martínez、Alexander Kukushkin)
-
README を改善し、Helm チャートとリリース ノートへのリンクを追加しました。 (Lauri Apple)
-
Patroni ドキュメントを
Read the Docsに移動します。最新のドキュメントは https://patroni.readthedocs.io で入手できます。 (Oleksii Kliukin)さまざまなデバイス (スマートフォンを含む) からドキュメントを簡単に表示し、検索できるようにします。
-
パッケージをセマンティック バージョニングに移動します。 (Oleksii Kliukin)
Patroni は、小規模だが重大なバグ修正に関する新しいマイナー バージョンのリリースを回避するために、major.minor.patch バージョン スキーマに従います。すべてのパッチを含むマイナー バージョンのリリース ノートのみを公開します。
バージョン 1.1
2016-09-07 リリース
このリリースでは、一時停止モードを導入することで Patroni クラスターの管理が改善され、スケジュールされた再起動と条件付き再起動によるメンテナンスが改善され、etcd または Zookeeper との Patroni の対話の回復力が向上し、patronictl が大幅に強化されています。
アップグレードのお知らせ
1.0 より前のリリースからアップグレードする場合は、1.0 リリース ノートで資格情報と構成形式の変更についてお読みください。
一時停止モード
-
一時停止モードを導入して、Patroni を PostgreSQL インスタンスの管理から一時的に切り離します (Murat Kabilov、Alexander Kukushkin、Oleksii Kliukin)。
以前は、PostgreSQL を終了せずに、SIGKILL シグナルを Patroni に送信して停止する必要がありました。新しい一時停止モードは、Patroni を終了せずに、クラスター全体で Patroni を PostgreSQL から切り離します。これは、Pacemaker のメンテナンス モードに似ています。 Patroni は引き続き DCS のメンバー キーとリーダー キーを更新しますが、プロセス内で PostgreSQL サーバーを起動、停止、再起動することはありません。いくつかの例外があります。たとえば、手動フェイルオーバー、再初期化、再起動は引き続き許可されます。 この機能の詳細な説明 を参照できます。
さらに、patronictl は、一時停止モードを切り替えるための新しい pause
および resume コマンドをサポートしています。
スケジュールされた再起動と条件付きの再起動
-
再起動 API コマンドに条件を追加します (Oleksii Kliukin)
この変更により、再起動を行うために検証できるいくつかの条件が追加され、Patroni の再起動が強化されます。条件には、PostgreSQL ロールがマスターまたはレプリカの場合の再起動、PostgreSQL バージョン番号の確認、構成変更を適用するために再起動が必要な場合のみの再起動などがあります。
-
スケジュールされた再起動を追加 (Oleksii Kliukin)
将来の再起動をスケジュールできるようになりました。スケジュールされた再起動はノードごとに 1 つだけサポートされます。スケジュールされた再起動が必要なくなった場合は、クリアすることができます。スケジュールされた再起動と条件付き再起動の組み合わせがサポートされているため、たとえば、夜間にスケジュールされたマイナー PostgreSQL アップグレードが可能になり、管理スクリプトに postgres 固有のロジックを追加することなく、古いマイナー バージョンを実行しているインスタンスのみを再起動できます。
-
patronictl に条件付きおよびスケジュールされた再起動のサポートを追加しました (Murat Kabilov)。
patronictl restart は、いくつかの新しいオプションをサポートします。スケジュールされたアクションを消去するための patronictl flush コマンドもあります。
堅牢な DCS インタラクション
-
loop_wait に応じて Kazoo タイムアウトを設定します (Alexander Kukushkin)
当初、ping_timeout および connect_timeout の値は、ネゴシエートされたセッション タイムアウトから計算されました。 Patroni の loop_waitは考慮されていませんでした。その結果、1 回の再試行にセッション タイムアウトよりも長い時間がかかり、Patroni がロックを解放して降格する必要が生じる可能性があります。
この変更により、ping と接続のタイムアウトがloop_wait の値の半分に設定され、接続の問題の検出が高速化され、ロックが失われる前に接続試行を再試行するのに十分な時間が残されました。
-
元のリクエストが成功した後にのみ etcd トポロジを更新するようになりました。 (Alexander Kukushkin)
クライアントに認識されている etcd トポロジの更新を、元のリクエストが完了するまで延期します。クラスター トポロジを取得するときは、etcd クラスター内の既知のノード数に応じて再試行タイムアウトを実装します。これにより、クライアントは最新のノードのリストを取得するよりも、リクエストの結果を取得することを優先します。
どちらの変更も、ネットワークの問題に直面した場合でも、Patroni から DCS への接続をより堅牢にします。
patronictl、監視および構成
-
API 経由でストリーミング レプリカに関する情報を返します (Feike Steenbergen)
以前は、(接続の問題などにより) 変更のストリーミングに失敗した PostgreSQL インスタンスについて Patroni をクエリーする信頼できる方法はありませんでした。この変更により、pg_stat_replication の内容が /patroni エンドポイント経由で公開されます。
-
patronictl scaffold コマンドを追加 (Oleksii Kliukin)
etcd にクラスター構造を作成するコマンドを追加します。クラスターはユーザー指定の sysid とリーダーを使用して作成され、リーダー キーとメンバー キーの両方が永続化されます。このコマンドは、レプリカのみで構成される Patroni クラスターが Patroni を認識しない外部マスター ノードから複製される、いわゆるマスターレス構成を作成するのに役立ちます。その後、リーダー キーを削除し、Patroni ノードの 1 つをプロモートし、元のマスターを Patroni ベースの HA クラスターに置き換えます。
-
構成オプション
bin_dirを追加して、PostgreSQL バイナリを見つけます (Ants Aasma)Linux ディストリビューションが複数の PostgreSQL バージョンの同時インストールをサポートしている場合、PostgreSQL バイナリの場所を明示的に指定できると便利です。
-
custom_confを使用して構成ファイルのパスを上書きできるようにする (Alejandro Martínez)Patroni によって管理されないカスタム構成ファイルのパスを許可します (詳細 )。
バグ修正とコードの改善
-
Patroni を PostgreSQL 10 以降の新しいバージョンのスキーマと互換性のあるものにします (Feike Steenbergen)
PostgreSQL バージョンに基づいて条件付き再起動を行う場合、Patroni が 2 桁のバージョン番号を理解していることを確認してください。
-
pkgutil を使用して DCS モジュールを検索します (Alexander Kukushkin)
DCS モジュールを見つけるためにディレクトリを手動で走査する代わりに、専用の Python モジュールを使用します。
-
Patroni を開始するときに常に on_start コールバックを呼び出します。 (Alexander Kukushkin)
以前は、Patroni は、正しいロールですでに実行中のノードにアタッチするときにコールバックを呼び出しませんでした。コールバックはクライアント接続のルーティングによく使用されるため、接続ルーティング スキームで実行中のノードを登録できなくなる可能性があります。この修正により、Patroni は、既に実行中のノードに接続している場合でも on_start コールバックを呼び出します。
-
アクティブなレプリケーション スロットを削除しないでください (Murat Kabilov、Oleksii Kliukin)
マスター上のアクティブな物理レプリケーション スロットをドロップしないようにします。いずれにせよ、PostgreSQL はそのようなスロットを削除できません。この変更により、Patroni 以外の管理対象レプリカ/コンシューマーをマスター上で実行できるようになります。
-
PostgreSQL インスタンスの起動中に Patroni 接続を閉じます。 (Alexander Kukushkin)
PostgreSQL ノードの起動時に、Patroni が以前のすべての接続を強制的に閉じます。 postmaster が SIGKILL で強制終了された場合に、以前の接続が再利用されるという罠を回避します。
-
メンバー名からスロット名を構築するときに無効な文字を置換します (Ants Aasma)
スロットの命名規則に準拠していないスタンバイ名によってスロットの作成やスタンバイの起動が失敗しないようにしてください。スロット名のダッシュをアンダースコアに置き換え、スロット名に使用できない他のすべての文字を Unicode コードポイントに置き換えます。
バージョン 1.0
2016-07-05 リリース
このリリースでは、HA クラスター全体の PostgreSQL および Patroni 構成パラメーターを動的に変更できるグローバル動的構成が導入されています。また、多数のバグ修正も提供されます。
アップグレードのお知らせ
v0.90 以下からアップグレードする場合は、必ずマスターより前にすべてのレプリカをアップグレードしてください。レプリケーション資格情報が DCS に保存されなくなったため、古いレプリカは新しいマスターに接続できなくなります。
動的構成
-
動的グローバル構成の実装 (Alexander Kukushkin)
新しい REST API エンドポイント /config を導入して、HA クラスター全体 (マスターとすべてのレプリカ) に対してグローバルに設定する必要がある PostgreSQL および Patroni 構成パラメーターを提供します。これらのパラメーターは DCS で設定され、多くの場合、PostgreSQL または Patroni を中断することなく適用できます。 Patroni は、一部の値で PostgreSQL の再起動が必要な場合に、API を介して表示される “pending restart” と呼ばれる特別なフラグを設定します。その場合、API を介して手動で再起動を発行する必要があります。
Patroni に SIGHUP を送るか /reload に POST リクエストを送ると、構成ファイルが再読み取りされます。
変更できるパラメータと、異なる構成ソースを処理する順序の詳細については、Patroni 構成 を参照してください。
構成ファイルの形式は v0.90 から 変更されました。 Patroni は依然として古い設定ファイルと互換性がありますが、ブートストラップ パラメータを利用するには変更する必要があります。ユーザーは、動的構成ドキュメントページ を参照して更新することをお勧めします。
より柔軟な構成*
-
postgresql 構成と、Patroni が接続するデータベース名を構成可能にする (Misja Hoebe)
databaseおよびconfig_base_name構成パラメーターを導入します。特に、Patroni を PipelineDB および他の PostgreSQL フォークで実行できるようになります。 -
環境経由で一部の Patroni 設定パラメータを設定できるように実装しました (Alexander Kukushkin)
これらには、スコープ、ノード名、名前空間、およびシークレットが含まれており、動的環境 (つまり、Kubernetes) での Patroni の実行が容易になります。詳細については、サポートされている環境変数 を参照してください。
-
組み込みの Patroni Docker コンテナを更新して、環境ベースの構成を活用します (Feike Steenbergen)。
-
Patroni docker イメージに Zookeeper サポートを追加しました (Alexander Kukushkin)
-
Zookeeper と Exhibitor の構成オプションを分割する (Alexander Kukushkin)
-
patronictl が構成を読み取るために Patroni のコードを再利用するようにしました。 (Alexander Kukushkin)
これにより、patronictl は環境ベースの構成を利用できるようになります。
-
primary_conninfo でアプリケーション名をノード名に設定しました (Alexander Kukushkin)
これにより、特定のノードの同期レプリケーションの識別と構成が簡素化されます。
安定性、セキュリティ、使いやすさの向上
-
sysid をリセットし、バックアップの復元の進行中に pg_controldata を呼び出さないようにしました。 (Alexander Kukushkin)
この変更により、バックアップからのこのノードの長時間の初期化中に Patroni API ヘルス チェックによって生成されるノイズの量が減少します。
-
pg_rewind のいくつかのコーナーケースを修正しました (Alexander Kukushkin)
ソースクラスターがマスターではない場合は、pg_rewind を実行しないでください。
さらに、新しいパラメータ remove_data_directory_on_rewind_failure が true に設定されていない限り、巻き戻しが失敗したときにデータ ディレクトリを削除しないでください。デフォルトでは false です。
-
DCS のレプリケーション接続文字列からパスワードを削除します。 (Alexander Kukushkin)
以前は、Patroni は常に、DCS の Postgres URL からのレプリケーション資格情報を使用していました。これは、Patroni 構成から資格情報を取得するように変更されました。シークレット (レプリケーション ユーザー名とパスワード) は DCS で公開されなくなりました。
-
降格呼び出し周りの非同期機構を修正しました。 (Alexander Kukushkin)
Demote は、DCS インタラクションをブロックすることなく、完全に非同期で実行されるようになりました。
-
認証ヘッダーが設定されている場合、patronictl が、常に認証ヘッダーを送信するようにしました。 (Alexander Kukushkin)
これにより、Patroni がそれらに対する承認を必要とするように構成されている場合、patronictl は “protected” リクエストを発行 (つまり、再起動または再初期化) することができます。
-
SystemExit 例外を正しく処理します (Alexander Kukushkin)
SIGTERM を受信したときに Patroni が適切に停止しない問題を回避します。
-
confd 用のサンプル HAProxy テンプレート (Alexander Kukushkin)
confd を使用して、DCS の Patroni 状態から HAProxy 構成を生成し、動的に変更します。
-
ドキュメントを改善および再構成して、新規ユーザーにとってより使いやすいものにします (Lauri Apple)
-
API は、pg_ctl stop の実行中に role=master を報告する必要があります。 (Alexander Kukushkin)
特にクラスター停止の場合、コールバック呼び出しの信頼性が高まります。さらに、
pg_ctl_timeoutオプションを導入して、pg_ctlを介した開始、停止、再起動の呼び出しのタイムアウトを設定します。 -
etcd の再試行ロジックを修正しました。 (Alexander Kukushkin)
再試行をより予測可能かつ堅牢にします。
-
Zookeeper コードの短いネットワーク障害に対する回復力を高めます (Alexander Kukushkin)
接続タイムアウトを減らして、Zookeeper の接続試行の頻度を増やします。
バージョン 0.90
2016-04-27 リリース
このリリースでは、Consul のサポートが追加され、新しい noloadbalance タグが含まれ、clonefrom タグの動作が変更され、pg_rewind 処理が改善され、patronictl 制御プログラムが改善されます。
Consul のサポート
-
Consul サポートの実装 (Alexander Kukushkin)
Patroni は、etcd と Zookeeper に加えて、Consul に対して実行されます。接続パラメータは YAML ファイルで構成できます。
新しいタグと改良されたタグ
-
noloadbalance タグを実装する (Alexander Kukushkin)
このタグにより、Patroni は常にレプリカがロード バランサーで利用できないことを返すようになります。
-
clonefrom タグの実装を変更 (Alexander Kukushkin)
以前は、clonefrom にノード名を指定する必要があり、タグ付きレプリカは特定のノードからクローンを作成するよう強制されていました。新しい実装では、clonefrom はブール型タグになります。これが true に設定されている場合、レプリカは他のレプリカのクローン元の候補になります。複数の候補が存在する場合、レプリカはランダムに 1 つを選択します。
安定性とセキュリティの向上
-
数多くの信頼性の向上 (Alexander Kukushkin)
いくつかの偽のエラー メッセージを削除し、フェイルオーバーの安定性を向上させ、DCS からのデータの読み取り、シャットダウン、以前のリーダーの降格、および再接続に関するいくつかの特殊なケースに対処します。
-
システム スクリプトを改善して、Patroni の子が停止中に殺されないようにする (Jan Keirse、Alexander Kukushkin)
以前は、Patroni を停止すると、systemd も PostgreSQL にシグナルを送信していました。 Patroni も PostgreSQL を単独で停止しようとしたため、別のシャットダウン要求 (スマート シャットダウン、その後の高速シャットダウン) が送信されることになりました。その結果、レプリカの切断が早すぎて、元のマスターが降格後に再参加できなくなりました。 Alexander による事前調査をもとに Jan によって修正されました。
-
元のマスターがレプリカとして再参加する前に pg_rewind を呼び出すことができなかったいくつかのケースを排除しました (Oleksii Kliukin)
以前は、前のマスターがクラッシュした場合にのみ pg_rewind を呼び出していました。 pg_rewind がシステムに存在する限り、元のマスターに対して常に pg_rewind を実行するようにこれを変更します。これにより、レプリカが最新の変更を取得する前にマスターがシャットダウンされた場合 (つまり、“smart” シャットダウン中) が修正されます。
-
単体テストと受け入れテストに対する数多くの改善により、特に Zookeeper と Consul のサポートが可能になりました (Alexander Kukushkin)。
-
Travis CI を高速化し、Zookeeper (Exhibitor) および Consul に対するテスト実行のサポートを実装します (Alexander Kukushkin)
単体テストと受け入れテストはどちらも、各コミットまたはプルリクエストで etcd、Zookeeper、Consul に対して自動的に実行されます。
-
Patroni から PostgreSQL コマンドを呼び出す前に環境変数をクリアします (Feike Steenbergen)
これにより、Patroni によって管理される PostgreSQL クラスターに接続することによってシステム環境変数が読み取られる可能性が回避されます。
構成と制御の変更
-
patronictl と Patroni 構成を統合 (Feike Steenbergen)
patronictl は、Patroni 自体と同じ構成ファイルを使用できます。
-
Patroni が環境変数から構成を読み取れるようにします (Oleksii Kliukin)
これにより、Patroni の構成の自動生成や、異なるソースからの単一の構成のマージが簡素化されます。
-
API によって返される情報にデータベース システム識別子を含めます (Feike Steenbergen)
-
利用可能なすべての DCS に delete_cluster を実装します (Alexander Kukushkin)
patronictl で etcd 以外の DCS のサポートを有効にします。
バージョン 0.80
2016-03-14 リリース
このリリースでは、カスケードレプリケーション のサポートが追加され、スケジュールされたフェイルオーバー を提供することで Patroni 管理が簡素化されます。新しいリリースに移行するために、古いバージョンの Patroni (特に 0.78) をこのバージョンと組み合わせて使用する場合があります。スケジュールされたフェイルオーバーとカスケード レプリケーション関連の機能は、Patroni 0.80 以降でのみ動作することに注意してください。
カスケードレプリケーション
- patroni ノードの replicatefrom タグと clonefrom タグのサポートを追加 (Oleksii Kliukin)。
replicatefrom タグを使用すると、レプリカはマスターに限らず任意のノードをソースとして使用できます。 clonefrom は、最初のバックアップでも同じことを行います。これらを組み合わせることで、Patroni はカスケード レプリケーションを完全にサポートできるようになります。
- 実行中のレプリケーション接続がなくてもレプリカを初期化するためのレプリケーション メソッドの実行サポートを追加しました (Oleksii Kliukin)。
これは、S3 または FTP に保存されているスナップショットからレプリカを作成する場合に便利です。レプリケーション接続の実行を必要としないレプリケーション メソッドでは、yaml 設定で no_master: true を指定する必要があります。レプリケーション接続が存在する場合、これらのスクリプトは引き続き順番に呼び出されます。
Patronictl、API、DCS の改善
-
スケジュールされたフェイルオーバーを実装します (Feike Steenbergen)。
patronictl または API 呼び出しを使用して、将来の特定の時刻にフェイルオーバーが発生するようにスケジュールできます。
-
patronictl に dbuser および password パラメーターのサポートを追加しました (Feike Steenbergen)。
-
PostgreSQL バージョンをヘルス チェック出力に追加します (Feike Steenbergen)。
-
patronictl での Zookeeper のサポートを改善しました (Oleksandr Shulgin)
-
python-etcd 0.4.3 に移行 (Alexander Kukushkin)
構成
- Patroni 用のサンプル システム構成スクリプトを追加します (Jan Keirse)。
- DB 接続の構成ファイルで指定されたスーパーユーザー名が無視される Patroni の問題を修正しました (Alexander Kukushkin)。
- Patroni によって起動されたポストマスター用に別のセッション ID とプロセス グループを作成することで、CTRL-C の処理を修正しました (Alexander Kukushkin)。
テスト
-
Patroni を実行する実際のシナリオをチェックするために、behave による受け入れテストを追加 (Alexander Kukushkin、Oleksii Kliukin)。
テストは、behave コマンドを使用して手動で開始できます。また、プル リクエストやコミット後に自動的に起動されます。
一部の古いバージョンのリリース ノートは、プロジェクトの github ページ にあります。