自動フェイルオーバー ==================== プライマリで予期しないエラーが\ ``.spec.failoverDelay`` デフォルトでは\ ``0`` 秒より長く発生した場合、クラスターは **フェールオーバーモード** になります。これは、たとえば次の場合に発生する可能性があります。 - プライマリポッドにディスク障害が発生した - プライマリポッドが削除された - プライマリの\ ``postgres`` コンテナに何らかの持続的な障害がある フェールオーバーシナリオでは、プライマリが正常に動作していると想定できません。 上記のような場合の後、プライマリポッドの準備状況プローブは失敗し始めます。これは、コントローラの調整ループで取得されます。コントローラは、2つの手順でフェールオーバープロセスを開始します。 1. 最初に、\ ``TargetPrimary`` を\ ``pending`` としてマークします。この状態の変更は、プライマリポッドを強制的にシャットダウンし、レプリカのWALレシーバーが停止します。クラスターは、フェールオーバーフェーズ「フェールオーバー」でマークされます。 2. すべてのWALレシーバーが停止すると、リーダー選挙が行われ、新しい予備選挙が名前付けられます。選択されたインスタンスはプライマリへの昇格を開始し、これが完了すると、クラスターは通常のオペレーションを再開します。一方、以前のプライマリポッドは再起動し、プライマリでなくなったことを検出し、レプリカノードになります。 .. Important:: 2フェーズプロシージャは、WALレシーバーが正常に停止でき、障害が発生したプライマリが再起動時にWALのストリーミングを再度開始しないことを保証します。これらの安全対策は、新しいプライマリとレプリカ間のタイムラインの不一致を防ぎます。 障害が発生したプライマリがシャットダウンされている間 1. 最初に\ ``.spec.switchoverDelay`` 秒をタイムアウトとしてPostgreSQLの_fast shutdown_を試行します。この正常なシャットダウンは、保留中のWALをアーカイブしようとします。 2. 高速シャットダウンが失敗するか、そのタイムアウトを超過すると、PostgreSQLの_即時シャットダウン_が開始されます。 .. Note:: 「Fast」モードは、PostgreSQLクライアントが切断されるのを待機せず、進行中のオンラインバックアップを終了します。アクティブなトランザクションはすべてロールバックされ、クライアントは強制的に切断され、サーバーはシャットダウンされます。 「Immediate」モードは、クリーンシャットダウンせずに、すべてのPostgreSQLサーバープロセスをすぐに中止します。 RTOとRPOのインパクト -------------------- フェイルオーバーにより、サービスが影響を受ける :ref:`RTOとRPOのインパクト ` および/またはデータが失われる :ref:`PgBouncerPoolMode {postgresql-cnpg-io-v1-PgBouncerPoolMode} ` が発生する場合があります。 1. プライマリに障害が発生し始め、コントローラがフェールオーバー手順を開始する前に、転送中のクエリ、WAL書き込み、チェックポイントおよび同様の操作が失敗する場合があります。 2. fast shutdownコマンドが発行されると、クラスターは接続を受け入れなくなるため、サービスは影響を受けますが、データは失われません。 3. 高速シャットダウンが失敗した場合、即時シャットダウンはWAL書き込みを含む保留中のプロセスを停止します。データが失われる可能性があります。 4. プライマリがシャットダウンしており、新しいプライマリがまだ起動していない間、クラスターはプライマリなしで動作するため、機能が低下しますが、データの損失はありません。 .. Note:: 高速シャットダウンを制御するタイムアウトは、スイッチオーバーの場合と同様に`.spec.switchoverDelay` によって設定されます。高速シャットダウンの時間を長くすることは、RPOの観点からより安全ですが、通常のオペレーションへの復帰が遅延する可能性があり、RTOに悪影響を与えます。 .. Warning:: :ref:`インスタンスマネージャーのインプレース更新 <インスタンスマネージャーのインプレース更新>` で既に述べたように スイッチオーバープロセスを説明するとき、 ``.spec.switchoverDelay`` オプションはPostgreSQLデータベースのRPOとRTOに影響を与えます。低い値に設定すると、RPOよりもRTOが優先される場合がありますが、クラスターレベルおよび/またはバックアップレベルでデータの損失が発生します。逆に、高い値に設定すると、スイッチオーバー中にアクティブなプライマリのないクラスターを長時間放置する間のデータ損失のリスクを取り除くことができます。 遅延フェイルオーバー -------------------- 上記で予想されたように、 ``.spec.failoverDelay`` オプションを使用すると、プライマリが異常であると検出された後、フェイルオーバープロシージャの開始を秒単位で遅延できます。デフォルトでは、この設定は\ ``0`` に設定され、フェイルオーバー手順がすぐにトリガーされます。 場合によっては、新しいプライマリへのフェイルオーバーの方が、プライマリがオンラインに戻るのを待つよりも混乱を招く可能性があります。これは、複数の層が影響を受けるダウンストリーム論理サブスクライバー、またはフェールオーバーの実行時間が予想される停止よりも長い場合、ネットワークの中断に特に当てはまります。 フェールオーバーを遅延する新しい構成オプションを有効にすることにより、短期間のネットワークまたはノードの不安定性による時期尚早のフェールオーバーを防止するメカニズムを提供します。