Fencing
=======

EDB
CloudNativePGクラスターのフェンシングは、PostgreSQLクラスターの1つ以上、またはすべてのインスタンスに障害が発生しているように見える場合に、データを保護する究極のプロセスです。インスタンスがフェンスされると、PostgreSQLサーバープロセス\ ``postmaster``
はシャットダウンが保証されますが、ポッドは実行されたままです。これにより、フェンスが解除されるまで、ポッド上のデータがPostgreSQLによって変更されず、デバッグとトラブルシューティングの目的でファイルシステムを調査できることが保証されます。

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

EDB CloudNativePGクラスターでは、次のことをフェンスできます。

- 特定のインスタンス

- インスタンスのリスト

- Postgres全体 ``Cluster``

フェンシングは、\ ``k8s.enterprisedb.io/fencedInstances``
アノテーションの内容を介して制御されます。これは、JSON形式のインスタンス名のリストを想定しています。アノテーションが\ ``'["*"]'``
、ワイルドカードを使用したシングルトンリストに設定されている場合、クラスター全体がフェンスされます。アノテーションが空のJSONリストに設定されている場合、オペレーターは、アノテーションが設定されていないかのように動作します。

例

- ``k8s.enterprisedb.io/fencedInstances: '["cluster-example-1"]'``
  は\ ``cluster-example-1`` インスタンスのみをフェンスします

- ``k8s.enterprisedb.io/fencedInstances: '["cluster-example-1","cluster-example-2"]'``
  は、 ``cluster-example-1`` および\ ``cluster-example-2``
  インスタンスをフェンスします

- ``k8s.enterprisedb.io/fencedInstances: '["*"]'``
  は、クラスター内のすべてのインスタンスをフェンスします。

アノテーションは、\ ``kubectl annotate``
コマンドを介して、または\ ``kubectl cnp fencing on``
サブコマンドを使用して透過的な方法で、Kubernetesオブジェクトに手動で設定できます。

.. code:: shell


   #  to fence only one instance

   kubectl cnp fencing on cluster-example 1

   #  to fence all the instances in a Cluster

   kubectl cnp fencing on cluster-example "*"

次に、以前にフェンスされたインスタンスを使用した\ ``Cluster``
の例を示します。

.. code:: yaml

   apiVersion: postgresql.k8s.enterprisedb.io/v1
   kind: Cluster
   metadata:
       annotations:
         k8s.enterprisedb.io/fencedInstances: ["cluster-example-1"]
   [...]

フェンシングのリフティング方法
------------------------------

フェンシングは、注釈をクリアするか、別の値に設定することにより解除できます。

フェンシングに関しては、これは\ ``kubectl annotate``
を使用して手動で行うか、次のように\ ``kubectl cnp fencing``
サブコマンドを使用して実行できます。

.. code:: shell


   #  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 cnp fencing off cluster-example 1

   #  to lift the fencing for all the instances in a Cluster

   kubectl cnp fencing off cluster-example "*"

フェンシングの仕組み
--------------------

インスタンスがフェンシング用に設定されると、スイッチオーバーの場合と同様に、\ ``postmaster``
プロセスをシャットダウンする手順が開始されます。これは、タイムアウトを\ ``.spec.switchoverDelay``
に設定した最初の高速シャットダウンと、それに続く即時シャットダウンで構成されます。次に

- ポッドは生きたままになります

- ポッドは *準備完了* としてマークされません

- Postgresインスタンスを起動する必要がないすべての変更がリコンサイルされます。

  - 構成ファイル
  - 証明書およびすべての暗号化マテリアル

- 1に設定される\ ``cnp_collector_fencing_on``
  を除き、メトリックは収集されません

..  Warning::
   **プライマリインスタンス**がフェンスされている場合、そのポストマスタープロセスはシャットダウンされますが、フェイルオーバーは実行されず、アプリケーションの操作性が中断されます。フェンスが解除されると、プライマリインスタンスはフェイルオーバーを実行せずに再度起動されます。

そのため、厳密に必要な場合にのみプライマリインスタンスをフェンスすることをお勧めします。

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