Fencing

CloudNativePGのフェンシングは、誤動作していると思われる場合に、 PostgreSQLクラスターの1つ、複数、またはすべてのインスタンスのデータを保護する究極のプロセスです。インスタンスがフェンスされると、ポッドが実行され続ける間、 PostgreSQLサーバープロセス( postmaster )が確実にシャットダウンされます。これにより、フェンスが解除されるまで、ポッド上のデータはPostgreSQLによって変更されず、ファイルシステムデバッグおよびトラブルシューティングの目的で調査できます。

インスタンスをフェンスする方法

CloudNativePGでは、以下をフェンスできます。

  • 特定のインスタンス

  • インスタンスのリスト Postgres Cluster 全体

ワイルドカードは、 リストのコンテンツを介して制御されリスト。これは、 JSON形式のインスタンス名のリストを必要としJSON。 、演算子は注釈が設定されていないかのように動作します。

例:

  • cnpg.io/fencedInstances: '["*"]' は、すべてのインスタンスを クラスター。

注釈は、例 kubectl annotate コマンドを使用してKubernetesオブジェクトに手動で設定するか、 kubectl cnpg fencing on サブコマンドを使用して透過的に設定できます。

#  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 に設定した最初のスマートシャットダウンと、必要に応じて高速シャットダウンで構成されます。次に:

  • ポッドは生き続けます

  • ポッドは* Ready *としてマークされません

Postgresインスタンスを起動する必要のないすべての変更は 以下を含む調整済み - 構成ファイル - 証明書とすべての暗号化資料

警告

Cluster の少なくとも1つのインスタンスがフェンスされると、 Cluster のステータスを安定(stable)と見なすことができないため、その Cluster のフェイルオーバー/スイッチオーバーはフェンスが解除されるまでブロックされます。

特に、 プライマリインスタンス がフェンスされる場合、ポストマスタープロセスはシャットダウンされますが、フェイルオーバーは発生せず、アプリケーションの操作性が中断されます。フェンスが解除されると、フェイルオーバーが発生することなく、プライマリインスタンスが再び起動されます。

そのため、可能な場合はレプリカインスタンスのみをフェンスすることをお勧めしユーザ。

警告

プライマリが Cluster 内の唯一のフェンスされたインスタンスであり、ポッドが削除された場合、フェイルオーバーが実行されます。古いプライマリのフェンスが解除されると、そのインスタンスはスタンバイ(新しいプライマリのフォロワー)として再起動されます。

フェンスされたインスタンスが削除された場合、ポッドは通常どおり再作成されますが、ポストマスターは起動しません。これは、instancesが Crashlooping の場合に非常に役立ちます。