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 の場合に非常に役立ちます。