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でのリーダーロックの更新がバージョン/値/インデックスの不一致とは別の理由で失敗した場合、Postgresは、PatroniRESTAPIを介してクラスターのすべての既知のメンバーにアクセスできる場合、プライマリとして実行を継続できます。

低レベル実装の詳細

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

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

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

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

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

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

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

  • レプリカは、プライマリがまだ生きていることを示すインジケーターとして、着信 POST /failsafe RESTAPI要求を使用しています。この情報は ttl 秒間キャッシュされます。

よくある質問

  • なぜ現在のプライマリは他のすべてのメンバーを見なければならないのですか?ここでクォーラムに頼ることはできませんか?

    これは素晴らしい質問です!問題は、クォーラムの見方がDCSとPatroniの観点と異なる可能性があることです。DCSノードはアベイラビリティーゾーン全体に均等に分散する必要がありますが、Patroniにはそのようなルールがなく、さらに重要なことに、そのようなルールを導入および適用するメカニズムがありません。マイノリティノードが勝利部分にある間に、Patroniノードの大多数がパーティションネットワークの敗北部分(プライマリを含む)に終わった場合、プライマリを降格する必要があります。他のすべてのメンバーをチェックするだけで、そのような状況を検出できます。

  • DCSがダウンしているときにノード/ポッドが終了するとどうなりますか?

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

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

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

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

    プライマリはフェイルセーフコードを実行し、既知のすべてのレプリカに連絡します。これらのレプリカはこの情報を、プライマリが生きていることを示すインジケーターとして使用し、DCSのリーダーロックが期限切れになってもリーダーレースを開始しません。

  • フェイルセーフモードを有効にするには?

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