自動フェイルオーバー

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

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

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

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

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

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

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

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

重要

2フェーズプロシージャは、WALレシーバーを正常に停止できること、および障害が発生したプライマリが再起動時にWALのストリーミングを再開しないことを保証するのに役立ちます。これらの安全対策により、新しいプライマリとレプリカ間のタイムラインの不一致が防止されます。

障害が発生したプライマリがシャットダウンされている間:

1.最初に、タイムアウトとして.spec.switchoverDelay 秒でPostgreSQLの 高速シャットダウン を試みます。このグレースフルシャットダウンは、保留中のWALをアーカイブしようとします。

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

注釈

「高速」モードは、PostgreSQLクライアントが切断するのを待たず、進行中のオンラインバックアップを終了します。アクティブなすべてのトランザクションがロールバックされ、クライアントが強制的に切断され、サーバーがシャットダウンされます。 「即時」モードは、クリーンシャットダウンせずに、すべてのPostgreSQLサーバープロセスをすぐに中止します。

RTOとRPOへの影響

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

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

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

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

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

注釈

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

スイッチオーバープロセスを説明すると、 .spec.switchoverDelay オプションはPostgreSQLデータベースのRPOとRTOに影響します。低い値に設定すると、RPOよりもRTOが優先される場合がありますが、クラスターレベルおよび/またはバックアップレベルでデータが失われます。逆に、これを高い値に設定すると、データ損失のリスクが排除され、スイッチオーバー中にアクティブなプライマリなしでクラスターが長時間離れなくなります。

遅延フェールオーバー

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

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

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