DCSフェイルセーフモード¶
問題¶
Patroniは、リーダー選挙のタスクを解決し、ネットワークパーティショニングを検出するために、分散構成ストア(DCS)に大きく依存しています。つまり、ノードは、DCSのリーダーロックを更新できる場合にのみ、プライマリとしてPostgresを実行できます。リーダーロックの更新が失敗した場合、Postgresはすぐに降格され、読み取り専用として起動されます。どのDCSを使用するかによって、「問題」が発生する可能性は異なります。たとえば、Patroniにのみ使用されるEtcdを使用すると、チャンスはゼロに近くなりますが、K8sAPI(Etcdが支援)を使用すると、より頻繁に観察される可能性があります。
今回の実施の理由¶
リーダーロックの更新の失敗は、主に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 /failsafeRESTAPIを介して/failsafeキーで提示されるすべてのメンバーに接続し、すべてのレプリカが確認した場合、プライマリとして実行を継続できます。メンバーの1人が応答しない場合、プライマリは降格されます。
レプリカは、プライマリがまだ生きていることを示すインジケーターとして、着信
POST /failsafeRESTAPI要求を使用しています。この情報はttl秒間キャッシュされます。
よくある質問¶
なぜ現在のプライマリは他のすべてのメンバーを見なければならないのですか?ここでクォーラムに頼ることはできませんか?
これは素晴らしい質問です!問題は、クォーラムの見方がDCSとPatroniの観点と異なる可能性があることです。DCSノードはアベイラビリティーゾーン全体に均等に分散する必要がありますが、Patroniにはそのようなルールがなく、さらに重要なことに、そのようなルールを導入および適用するメカニズムがありません。マイノリティノードが勝利部分にある間に、Patroniノードの大多数がパーティションネットワークの敗北部分(プライマリを含む)に終わった場合、プライマリを降格する必要があります。他のすべてのメンバーをチェックするだけで、そのような状況を検出できます。
DCSがダウンしているときにノード/ポッドが終了するとどうなりますか?
DCSにアクセスできない場合、「他のすべてのクラスターメンバーにアクセスできますか?」チェックハートビートループの周期ごと(
loop_wait秒ごと)に実行されます。ポッド/ノードが終了すると、チェックは失敗し、Postgresは読み取り専用に降格され、DCSが復元されるまで回復しません。DCSがダウンしているときにPatroniクラスターのすべてのメンバーが失われた場合はどうなりますか?
Patroniは、クラスターにリーダーがない場合でも、バックアップから新しいレプリカを作成するように構成できます。ただし、新しいメンバーが
/failsafeキーに存在しない場合、リーダーロックを取得してプロモートすることはできません。プライマリがDCSへのアクセスを失ったのに対し、レプリカはアクセスできなかった場合はどうなりますか?
プライマリはフェイルセーフコードを実行し、既知のすべてのレプリカに連絡します。これらのレプリカはこの情報を、プライマリが生きていることを示すインジケーターとして使用し、DCSのリーダーロックが期限切れになってもリーダーレースを開始しません。
フェイルセーフモードを有効にするには?
failsafe_modeを有効にする前に、すべてのメンバーのPatroniバージョンが最新であることを確認してください。その後、PATCH /configfailsafe_modeまたはpatronictl edit-config -s failsafe_mode=trueのいずれかを使用できます