DCSフェイルセーフモード
問題
Patroniは、リーダー選挙のタスクを解決し、ネットワーク分割を検出するために分散構成ストアDCSに大きく依存しています。つまり、ノードはDCSのリーダーロックを更新できる場合にのみPostgresをプライマリとして実行できます。リーダーロックの更新が失敗した場合、Postgresはすぐに降格され、読み取り専用として起動されます。どのDCSが使用されるかに応じて、/"問題"が発生する可能性が異なります。たとえば、Patroniにのみ使用されるEtcdでは、可能性はゼロに近いですが、K8s API Etcdによってサポートされている場合、より頻繁に観察される可能性があります。
現在の実装の理由
リーダーロックの更新の失敗は、2つの主な理由によって発生する可能性があります。
ネットワークパーティショニング
DCSがダウンしている
一般に、単一のノードからこれら2つを区別することは不可能であるため、Patroniは最悪のケースであるネットワーク分割を想定しています。分割されたネットワークの場合、パトロニクラスターの他のノードがリーダーロックを正常に取得し、Postgresをプライマリに昇格させる場合があります。スプリットブレインを回避するために、リーダーロックの有効期限が切れる前に、古いプライマリは降格されます。
DCSフェイルセーフモード
新しい特別なオプション failsafe_mode を導入します。これは、 DCS /config キーに保存されているグローバル failsafe_mode を介してのみ有効にできます。フェイルセーフモードが有効になっており、バージョン/値/インデックスの不一致とは別の理由でDCSのリーダーロックの更新が失敗した場合、Postgresは、Patroni REST APIを介してクラスターのすべての既知のメンバーにアクセスできる場合、プライマリとして実行し続けます。
低レベル実装の詳細
DCSに
/failsafeという名前の新しい永続キーを導入します。/failsafeキーには、特定の時点での特定のPatroniクラスターの既知のメンバーがすべて含まれています。現在のリーダーは
/failsafeキーを維持します。メンバーは、
/failsafeキーに存在する場合にのみ、リーダーレースに参加し、新しいリーダーになることができます。クラスターが単一のノードで構成されている場合、
/failsafeキーには単一のメンバーが含まれます。DCS /"outage/"の場合、既存のプライマリは
POST /failsafeREST APIを介して/failsafeキーで提示されているすべてのメンバーに接続し、すべてのレプリカが確認した場合はプライマリとして実行し続けます。メンバーの1人が応答しない場合、プライマリは降格されます。
レプリカは、プライマリがまだ生きていることを示す指標として、着信
POST /failsafeREST API要求を使用しています。この情報はttl秒間キャッシュされます。
よくある質問
現在のプライマリが他のすべてのメンバーを参照しなければならないのはなぜですか?ここでクォーラムに頼ることはできないでしょうか?
これは素晴らしい質問です。問題は、クォーラムに関する見方がDCSとパトローニの観点から異なる可能性があることです。 DCSノードはアベイラビリティーゾーンにわたって均等に分散する必要がありますが、Patroniにはそのようなルールはなく、さらに重要なことに、このようなルールを導入および適用するメカニズムがありません。パトローニノードの大部分が分割されたネットワークプライマリを含む負けた部分に収まり、少数派ノードが勝った部分にある場合、プライマリを降格する必要があります。他のすべてのメンバーをチェックすることのみが、このような状況を検出できます。
DCSがダウンしているときにノード/ポッドが終了した場合はどうなりますか?
DCSにアクセスできない場合、チェック「他のクラスターメンバーはすべてアクセス可能ですか?」ハートビートループのサイクルごとに
loop_wait秒ごとに実行されます。ポッド/ノードが終了すると、チェックは失敗し、Postgresは読み取り専用に降格され、DCSが復元されるまで復旧しません。DCSがダウンしているときにPatroniクラスターのすべてのメンバーが失われた場合はどうなりますか?
クラスターにリーダーがない場合でも、バックアップから新しいレプリカを作成するようにPatroniを構成できます。ただし、新しいメンバーが
/failsafeキーに存在しない場合、リーダーロックを取得して昇格することはできません。プライマリがDCSへのアクセスを失った場合、レプリカはそうでなかった場合はどうなりますか?
プライマリはフェイルセーフコードを実行し、すべての既知のレプリカに接続します。これらのレプリカは、プライマリが生きていることを示す指標としてこの情報を使用し、DCSのリーダーロックの有効期限が切れてもリーダーレースを開始しません。
フェールセーフモードを有効にするにはどうすればよいですか?
failsafe_modeを有効にする前に、すべてのメンバーのPatroniバージョンが最新であることを確認してください。その後、PATCH /configfailsafe_modeまたはfailsafe_modeのいずれかを使用できます。