DCSフェールセーフモード

問題

Patroniは、リーダー選出のタスクを解決し、ネットワークの分割を検出するために、分散構成ストア(DCS)に大きく依存しています。つまり、ノードは、DCSのリーダーロックを更新できる場合にのみ、Postgresをプライマリとして実行できます。リーダーロックの更新が失敗した場合、Postgresは直ちに降格され、読み取り専用として開始されます。どのDCSが使用されているかに応じて、「問題」が発生する可能性が異なります。たとえば、Patroniにのみ使用されるEtcdの場合、可能性はゼロに近いですが、K8sAPI(Etcdによってサポートされる)を使用すると、より頻繁に観察される可能性があります。

現在の実装の理由

リーダーロックの更新エラーは、次の2つの主な理由によって発生する可能性があります。

  1. ネットワークのパーティショニング

  2. DCSがダウンしている

一般に、単一ノードからこれら2つを区別することは不可能であるため、Patroniは最悪のケースであるネットワーク分割を想定します。分割されたネットワークの場合、Patroniクラスターの他のノードがリーダーロックを正常に取得し、Postgresをプライマリに昇格させる可能性があります。スプリットブレインを回避するために、リーダーのロックが期限切れになる前に古いプライマリが降格されます。

DCSフェールセーフモード

新しい特別なオプション failsafe_mode を導入します。これは、DCS /config キーに格納されているグローバル failsafe_mode を介してのみ有効にできます。フェールセーフモードが有効になっており、バージョン/値/インデックスの不一致とは異なる理由でDCSのリーダーロックの更新が失敗した場合でも、PatroniRESTAPI経由でクラスターの既知のすべてのメンバーにアクセスできれば、Postgresはプライマリとして実行し続ける可能性があります。

低レベルの実装の詳細

  • DCSに /failsafe という名前の新しい永続キーを導入します。

  • /failsafe キーには、特定の時点での特定のPatroniクラスターの既知のメンバーがすべて含まれています。

  • 現在のリーダーは /failsafe キーを維持します。

  • メンバーは、 /failsafe キーに存在する場合にのみ、リーダーレースに参加し、新しいリーダーになることができます。

  • クラスターが単一のノードで構成されている場合、 /failsafe キーには単一のメンバーが含まれます。

  • DCS「停止」の場合、既存のプライマリは POST /failsafe RESTAPIを介して /failsafe キーに示されているすべてのメンバーに接続し、すべてのレプリカがそれを認識するとプライマリとして実行を継続できます。

  • メンバーの1人が応答しない場合、プライマリは降格されます。

  • レプリカは、受信した POST /failsafe RESTAPIリクエストを、プライマリがまだ生きていることを示す指標として使用します。この情報は ttl 秒間キャッシュされます。

よくある質問。

  • 現在のプライマリが他のすべてのメンバーを参照しなければならないのはなぜですか?ここでは定足数に頼ることはできないのでしょうか?

    これは素晴らしい質問です。問題は、定足数に対する考え方がDCSとパトローニの観点から異なる可能性があることです。DCSノードはアベイラビリティゾーン全体に均等に分散する必要がありますが、Patroniにはそのようなルールはなく、さらに重要なことに、そのようなルールを導入および強制するメカニズムがありません。Patroniノードの大部分が分割されたネットワーク(プライマリを含む)の負けた部分に属し、少数のノードが勝った部分にある場合は、プライマリを降格する必要があります。このような状況を検出できるのは、他のすべてのメンバーをチェックする場合のみです。

  • DCSがダウンしている間にノード/ポッドが終了した場合はどうなりますか?

    DCSにアクセスできない場合は、「他のすべてのクラスターメンバーがアクセス可能か?」がチェックされます。ハートビートループのサイクルごと( loop_wait 秒ごと)に実行されます。ポッド/ノードが終了すると、チェックは失敗し、Postgresは読み取り専用に降格され、DCSが復元されるまで回復しません。

  • DCSがダウンしている間にPatroniクラスターのすべてのメンバーが失われた場合はどうなりますか?

    Patroniは、クラスターにリーダーがない場合でも、バックアップから新しいレプリカを作成するように構成できます。ただし、新しいメンバーが /failsafe キーに存在しない場合、リーダーロックを取得して昇格することはできません。

  • プライマリがDCSへのアクセスを失い、レプリカがアクセスできなかった場合はどうなりますか?

    プライマリはフェールセーフコードを実行し、すべての既知のレプリカに接続します。これらのレプリカは、プライマリが生きていることを示す指標としてこの情報を使用し、DCSのリーダーロックの期限が切れた場合でもリーダーレースを開始しません。

  • フェールセーフモードを有効にするにはどうすればよいですか?

    failsafe_mode を有効にする前に、すべてのメンバーのPatroniバージョンが最新であることを確認してください。その後、 PATCH /config failsafe_mode または failsafe_mode のいずれかを使用できます。