クラスターの一時停止/再開モード
Patroniクラスター管理における一時停止および再開モードの動作。
目的
ある条件下では、Patroniはクラスターの管理を一時的に停止する必要がありますが、その間もクラスター状態をDCSに保持します。このような状況の例として、メジャーバージョンのアップグレードや破損からの復旧など、稀なクラスター操作が挙げられます。これらの操作中は、Patroniが認識しない理由でノードの起動・停止が頻発し、一部のノードが一時的にプライマリーに昇格する場合もあり、その結果、同時に1つのプライマリーしか実行されていないという前提が破られることがあります。したがって、Patroniは実行中のクラスターから「分離」できる必要があり、これによりPacemakerのメンテナンスモードと同等の動作を実現します。
実装
Patroniが一時停止モードで実行されている場合、PostgreSQLの状態を変更しません。ただし、以下のケースを除きます。
- 各ノードについて、DCSのメンバーキーはクラスターに関する現在の情報をもとに更新されます。これにより、メンバーノードが実行中である場合、Patroniはそのノードで読み取り専用のクエリーを実行します。
- リーダーロックを持つPostgresのプライマリーでは、Patroniがロックを更新します。リーダーロックを持つノードがプライマリーでなくなる(つまり手動で降格された)場合、Patroniはそのノードを再び昇格するのではなく、ロックを解放します。
- 手動での予定外の再起動、手動での予定外のフェイルオーバー/スイッチオーバー、および再初期化は許可されています。スケジュールされた操作は許可されません。手動スイッチオーバーは、切り替え先のノードが指定されている場合にのみ許可されます。
- Patroniが「並列」なプライマリーを検出すると警告を発しますが、リーダーロックを持たないプライマリーを降格させることはありません。
- クラスターにリーダーロックが存在しない場合、実行中のプライマリーがロックを取得します。プライマリーノードが複数存在する場合、ロックを最初に取得したプライマリーが勝者となります。プライマリーがまったく存在しない場合、Patroniはレプリカの昇格を試みません。このルールには例外があります。以前のプライマリーが手動での昇格により自己降格したためにリーダーロックが存在しない場合、昇格リクエストで指定された候補ノードのみがリーダーロックを取得できます。新しいリーダーロックが付与された場合(すなわち手動でレプリカを昇格した後)、Patroniは、以前のリーダーからストリーミングしていたレプリカが新しいリーダーに切り替わるようにします。
- Postgresが停止している場合、Patroniはその起動を試みません。Patroniを停止した場合、管理しているPostgresインスタンスの停止を試みません。
- Patroniは、他のクラスターメンバーを表すスロットでも、永続スロットの構成に記載されたスロットでもないレプリケーションスロットを削除しようとはしません。
ユーザーガイド
patronictl はpause およびresume コマンドをサポートしています。
また、Patroni REST APIに{"pause": true/false/null}を指定してPATCH /configリクエストを送り、DCS内の{namespace}/{cluster}/configキーを更新することもできます。