Postgre インスタンス マネージャー¶
CloudNativePG は、フェイルオーバー管理のために外部ツールに依存しません。 Kubernetes API サーバーと、 Postgresインスタンスマネージャー と呼ばれるネイティブ キー コンポーネントに依存するだけです。
インスタンス マネージャーは、PostgreSQL の先行プロセス (postmaster
とも呼ばれます) のライフサイクル全体を処理します。
新しいクラスターを作成すると、オペレーターはインスタンスごとに Pod
を作成します。フィールド .spec.instances
は、作成するインスタンスの数を指定します。
各 Pod は、インスタンス マネージャーをメイン コンテナーの親プロセス (PID 1) として起動し、次に PostgreSQL インスタンスを実行します。 Pod の有効期間中、インスタンス マネージャーは liveness and readiness probes を処理するバックエンドとして機能します。
liveness と readiness プローブ¶
liveness プローブは pg_isready に依存しますが、readiness
プローブは、データベースが稼働しており、スーパーユーザーの資格情報を使用して接続を受け入れることができるかどうかを確認します。
Pod がトラフィックを受け入れる準備ができている場合、readiness
プローブは肯定的です。 liveness
プローブは、コンテナーを再起動するタイミングを制御します。
プローブ コマンドが 10 秒間隔で 3 回失敗すると、2 つのプローブは失敗を報告します。
スタートアップ プローブは Kubernetes 1.17
でのみ導入されたため、現時点では、オペレーターは Pod で startupProbe
を構成しません。
liveness プローブは、PostgreSQL
インスタンスが壊れた状態にあり、再起動する必要があるかどうかを検出するために使用されます。
startDelay
の値は、プローブの実行を遅らせるために使用されます。これは、起動時間が長いインスタンスが再起動されるのを防ぐために使用されます。
Pod が起動してから liveness
プローブが動作を開始するまでの秒数は、.spec.startDelay
パラメータで表されます。デフォルトは 30
秒です。クラスタの正しい値は、PostgreSQL
の起動に必要な時間に関連しています。
.spec.startDelay が低すぎると、PostgreSQL の起動前に liveness
プローブが動作を開始し、Pod が不適切に再起動される可能性があります。
シャットダウン制御¶
Postgres を実行している Pod
が削除されると、ノードのドレイン操作に続いて、手動または Kubernetes
によって削除されます。kubelet はインスタンス
マネージャーに終了信号を送信し、インスタンス マネージャーは適切な方法で
PostgreSQL をシャットダウンします。秒単位で表される .spec.stopDelay
は、PostgreSQL
がシャットダウンするために与えられた時間です。値のデフォルトは 30
秒です。
シャットダウン手順は、次の 2 つの手順で構成されます。
インスタンス マネージャーは スマート シャットダウンを要求し、PostgreSQL への新しい接続を禁止します。このステップは、
.spec.stopDelayで設定された時間の半分の間続きます。PostgreSQL がまだ稼働している場合、インスタンス マネージャーは 高速 シャットダウンを要求し、既存の接続をすべて終了してすぐに終了します。インスタンスが WAL ファイルをアーカイブおよび/またはストリーミングしている場合、プロセスは
.spec.stopDelayで設定された時間の残りの半分まで待機して操作を完了し、強制的にシャットダウンします。
重要
データベースの RPO に影響を与える Postgres クラスターでのデータ損失を回避するために、プライマリ インスタンスが実行されている Pod を削除しないでください。この場合、最初に別のインスタンスへのスイッチオーバーを実行します。
スイッチオーバー中のプライマリのシャットダウン¶
スイッチオーバー中のシャットダウン手順は、一般的な場合とは少し異なります。実際、オペレーターは、すべてのデータが新しいプライマリで利用できるようにするために、選択した新しいプライマリを昇格させる前に、元のプライマリに 高速 シャットダウンを発行するよう要求します。
このため、秒単位で表される .spec.switchoverDelay
は、元のプライマリが正常にシャットダウンしてすべての WAL
ファイルをアーカイブするために与えられる時間を制御します。この時間枠の間、プライマリ
インスタンスは接続を受け入れません。デフォルトの値は 1
年を超える秒数であり、無限の遅延をシミュレートしてデータの耐久性を維持するのに十分な大きさです。
警告
.spec.switchoverDelay オプションは、PostgreSQL データベースの RPO と RTO に影響します。低い値に設定すると、RPO よりも RTO が優先される可能性がありますが、クラスター レベルやバックアップ レベルでデータが失われる可能性があります。反対に、高い値に設定すると、スイッチオーバー中にクラスターがアクティブなプライマリなしで長時間放置されたままになるため、データ損失のリスクがなくなる可能性があります。
フェイルオーバー¶
プライマリ ポッドに障害が発生した場合、クラスターはフェイルオーバー モードになります。詳細は フェイルオーバー を参照してください。