フェンシング¶
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.stopDelay
に設定された最初のスマートシャットダウンと、続いて必要に応じて高速シャットダウンで構成されます。次に:
Podは生き続けます
Podは 準備完了 としてマークされません
Postgresインスタンスの起動を必要としないすべての変更が調整されます。これには以下が含まれます。 - 構成ファイル - 証明書およびすべての暗号化マテリアル
1に設定される
cnpg_collector_fencing_onを除き、メトリックは収集されません
警告
**プライマリインスタンス**がフェンスされている場合、そのpostmasterプロセスはシャットダウンされますが、フェイルオーバーは実行されず、アプリケーションの操作が中断されます。フェンスが解除されると、フェイルオーバーを実行せずにプライマリインスタンスが再起動されます。
そのため、厳密に必要な場合にのみプライマリインスタンスをフェンスすることをお勧めします。
fenced インスタンスが削除されると、Pod
は正常に再作成されますが、postmaster
は起動されません。これは、インスタンスがCrashlooping
である場合に非常に役立ちます。