Fencing
CloudNativePGのフェンシングは、PostgreSQLクラスターの1つ以上、またはすべてのインスタンスに障害が発生しているように見える場合に、データを保護する究極のプロセスです。インスタンスがフェンスされると、PostgreSQLサーバープロセスpostmaster
はシャットダウンが保証されますが、ポッドは実行されたままです。これにより、フェンスが解除されるまで、ポッド上のデータがPostgreSQLによって変更されず、デバッグとトラブルシューティングの目的でファイルシステムを調査できることが保証されます。
インスタンスをフェンスする方法
CloudNativePGでは、次のことをフェンスできます。
特定のインスタンス
インスタンスのリスト
Postgres全体
Cluster
フェンシングは、cnpg.io/fencedInstances
アノテーションの内容を介して制御されます。これは、JSON形式のインスタンス名のリストを想定しています。アノテーションが'["*"]'
、ワイルドカードを使用したシングルトンリストに設定されている場合、クラスター全体がフェンスされます。アノテーションが空のJSONリストに設定されている場合、オペレーターは、アノテーションが設定されていないかのように動作します。
例
cnpg.io/fencedInstances: '["cluster-example-1"]'はcluster-example-1インスタンスのみをフェンスしますcnpg.io/fencedInstances: '["cluster-example-1","cluster-example-2"]'は、cluster-example-1およびcluster-example-2インスタンスをフェンスしますcnpg.io/fencedInstances: '["*"]'は、クラスター内のすべてのインスタンスをフェンスします。
アノテーションは、kubectl annotate
コマンドを介して、またはkubectl cnpg fencing on
サブコマンドを使用して透過的な方法で、Kubernetesオブジェクトに手動で設定できます。
## to fence only one instance
kubectl cnpg fencing on cluster-example 1
## to fence all the instances in a Cluster
kubectl cnpg fencing on cluster-example "*"
次に、以前にフェンスされたインスタンスを使用したCluster
の例を示します。
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
annotations:
cnpg.io/fencedInstances: ["cluster-example-1"]
[...]
フェンシングのリフティング方法
フェンシングは、注釈をクリアするか、別の値に設定することにより解除できます。
フェンシングに関しては、これはkubectl annotate
を使用して手動で行うか、次のようにkubectl cnpg fencing
サブコマンドを使用して実行できます。
## to lift the fencing only for one instance
## N.B.: at the moment this wont work if the whole cluster was fenced previously,
## in that case you will have to manually set the annotation as explained above
kubectl cnpg fencing off cluster-example 1
## to lift the fencing for all the instances in a Cluster
kubectl cnpg fencing off cluster-example "*"
フェンシングの仕組み
インスタンスがフェンシング用に設定されると、スイッチオーバーの場合と同様に、postmaster
プロセスをシャットダウンする手順が開始されます。これは、タイムアウトを.spec.switchoverDelay
に設定した最初の高速シャットダウンと、それに続く即時シャットダウンで構成されます。次に
ポッドは生きたままになります
ポッドは 準備完了 としてマークされません
Postgresインスタンスを起動する必要がないすべての変更がリコンサイルされます。
構成ファイル
証明書およびすべての暗号化マテリアル
1に設定される
cnpg_collector_fencing_onを除き、メトリックは収集されません
警告
**プライマリインスタンス**がフェンスされている場合、そのポストマスタープロセスはシャットダウンされますが、フェイルオーバーは実行されず、アプリケーションの操作性が中断されます。フェンスが解除されると、プライマリインスタンスはフェイルオーバーを実行せずに再度起動されます。
そのため、厳密に必要な場合にのみプライマリインスタンスをフェンスすることをお勧めします。
フェンスされたインスタンスが削除されると、ポッドは通常通り再作成されますが、ポストマスターは起動されません。これは、インスタンスがCrashlooping
の場合に非常に役立ちます。