自動フェイルオーバー

プライマリで spec.failoverDelay (デフォルトでは 0 秒) より長く予期しないエラーが発生した場合、クラスターは フェイルオーバーモード になります。これは、たとえば次の場合に発生する可能性があります。

  • プライマリ ポッドにディスク障害があります

  • プライマリ ポッドが削除されます

  • プライマリの postgres コンテナに何らかの持続的な障害がある

フェールオーバー シナリオでは、プライマリが正常に動作しているとは想定できません。

上記のようなケースの後、プライマリ ポッドの準備プローブが失敗し始めます。これは、コントローラーの調整ループで取得されます。コントローラは、次の 2 つの手順でフェイルオーバー プロセスを開始します。

  1. まず、TargetPrimary を pending としてマークします。この状態の変更により、プライマリ ポッドが強制的にシャットダウンされ、レプリカの WAL レシーバーが確実に停止します。クラスタはフェールオーバー フェーズ (「フェールオーバー」) でマークされます。

  2. すべての WAL レシーバーが停止すると、リーダーの選挙が行われ、新しいプライマリが指定されます。選択したインスタンスがプライマリへの昇格を開始し、これが完了すると、クラスターは通常の操作を再開します。一方、以前のプライマリ ポッドは再起動し、プライマリではなくなったことを検出し、レプリカ ノードになります。

重要

2 段階の手順により、WAL レシーバーが正常に停止し、失敗したプライマリが再起動時に WAL のストリーミングを再開しないことが保証されます。これらのセーフガードにより、新しいプライマリとレプリカの間のタイムラインの不一致が防止されます。

障害のあるプライマリがシャットダウンされている間:

  1. 最初に .spec.switchoverDelay 秒のタイムアウトで PostgreSQL の 高速シャットダウン を試みます。この正常なシャットダウンにより、保留中の WAL のアーカイブが試行されます。

  2. 高速シャットダウンが失敗した場合、またはタイムアウトを超えた場合、PostgreSQL の 即時シャットダウン が開始されます。

RTO と RPO への影響

フェールオーバーにより、サービスが影響を受けたり、データが失われたりする可能性があります。

  1. プライマリに障害が発生し始め、コントローラーがフェイルオーバー手順を開始する前に、転送中のクエリ、WAL 書き込み、チェックポイント、および同様の操作が失敗する可能性があります。

  2. 高速シャットダウン コマンドが発行されると、クラスターは接続を受け入れなくなるため、サービスは影響を受けますが、データが失われることはありません。

  3. 高速シャットダウンが失敗した場合、即時シャットダウンにより、保留中のプロセス (WAL 書き込みを含む) が停止されます。データが失われる可能性があります。

  4. プライマリがシャットダウンし、新しいプライマリがまだ開始されていない間、クラスタはプライマリなしで動作するため、障害が発生しますが、データが失われることはありません。

注釈

スイッチオーバーの場合と同様に、高速シャットダウンを制御するタイムアウトは .spec.switchoverDelay によって設定されます。高速シャットダウンの時間を長くすることは、RPO の観点からはより安全ですが、通常の操作への復帰が遅れる可能性があり、RTO に悪影響を及ぼします。

スイッチオーバー プロセスを説明するとき、.spec.switchoverDelay オプションは PostgreSQL データベースの RPO と RTO に影響します。低い値に設定すると、RPO よりも RTO が優先される可能性がありますが、クラスター レベルやバックアップ レベルでデータが失われる可能性があります。反対に、高い値に設定すると、スイッチオーバー中にクラスターがアクティブなプライマリなしで長時間放置されたままになるため、データ損失のリスクがなくなる可能性があります。

フェイルオーバーの遅延

上記で予想したように、spec.failoverDelay オプションを使用すると、プライマリが異常であることが検出された後、フェイルオーバー手順の開始を数秒遅らせることができます。デフォルトでは、この設定は 0 に設定されており、フェイルオーバー手順がすぐにトリガーされます。

新しいプライマリへのフェイルオーバーは、プライマリがオンラインに戻るのを待つよりも混乱を招く場合があります。これは、複数の層 (つまり、ダウンストリームの論理サブスクライバー) が影響を受けるネットワークの中断、またはフェイルオーバーの実行時間が予想される停止よりも長い場合に特に当てはまります。

フェールオーバーを遅らせる新しい構成オプションを有効にすると、短期間のネットワークまたはノードの不安定性による早すぎるフェールオーバーを防ぐメカニズムが提供されます。