Patroni cluster management commands
===================================

Patroniは、次のコマンドオプションを使用して、M1アーキテクチャでシングルマスターフェールオーバーマネージャーとして使用できます。

.. code:: shell

   tpaexec configure cluster_name -a M1 --enable-patroni --postgresql 14

またはconfig.ymlオプションを設定することにより

.. code:: yaml

   cluster_vars:
     failover_manager: patroni

TPAは、 ``patroni`` パッケージPGDGリポジトリからまたは\ ``edb-patroni``
パッケージEDBリポジトリからを使用してPatroniクラスターを展開できます。これは、
config.ymlの\ ``cluster_vars`` の下の\ ``patroni_package_flavour``
オプションを介して構成できます。これは、 ``--patroni-package-flavour``
コマンドライン引数を介して設定することもできます。
``patroni_package_flavour``
が明示的に設定されていない場合、TPAは、構成されたリポジトリに基づいてフレーバーを推論しようとします。EDBリポジトリが構成されている場合、暗黙的に\ ``edb``
フレーバーを選択し、それ以外の場合は暗黙的に\ ``community``
フレーバーを選択します。

TPA ``configure`` は3つのetcdノードを追加し、オプション
``--enable-haproxy``
を指定する場合2つのhaproxyノードを追加する場合があります。
etcdは、分散構成ストアDCSに使用されます。
Patroniは他のDCSバックエンドをサポートしていますが、現在EDBまたはTPAではサポートされていません。

HAProxyの代替として、\ ``--enable-pgbouncer``
オプションを使用して、PostgresノードでPgBouncerを構成できます。
PgBouncerは、プライマリの接続をプールするように構成されます。
Patroniは、クラスター内のフェールオーバーまたはスイッチオーバー時にPgBouncerを再構成するように構成されるため、PgBouncerは新しいプライマリPostgresインスタンスに従います。

TPAは、既存のPostgreSQLクラスターを変換するPatroniの機能を使用します。これにより、TPAは構成を初期化および管理できます。
PostgreSQLクラスターが作成されると、Patroniが管理を引き継ぎます。
TPAは、セットアップ中に使用されたpostgres構成ファイルを削除します。

セットアップが完了すると、クラスターのTPAと\ ``config.yml``
の設定を使用して、Postgresを引き続き管理できます。コマンドライン
``patronictl`` やREST
APIなどのPatroniインターフェイスを使用することもできますが、可能な限りTPAメソッドを使用することをお勧めします。

Patroniパッケージバージョン
---------------------------

デフォルトでは、TPAはPatroniの最新バージョンをインストールします。

インストールされるPatroniパッケージのバージョンは、 ``config.yml``
ファイルの\ ``cluster_vars``
セクションの下の\ ``patroni_package_version: xxx``
を含めることにより指定できます。

.. code:: yaml

   cluster_vars:
       …
       patroni_package_version: 4.0.0-1PGDG.rhel8`
       …

aptまたはyumが受け入れるバージョン指定子を使用できます。

バージョンが一致しない場合は、 ``*``
ワイルドカードを追加してみてください。これは、パッケージバージョンに\ ``2:...``
のようなエポック修飾子がある場合に必要になることがよくあります。

TPAは、Patroni REST
APIを保護するための堅牢なオプションを提供します。これは、主に\ ``patroni_ssl_enabled``
および\ ``patroni_authentication_mode`` 変数によって制御されます。

TLS暗号化
---------

``patroni_ssl_enabled: true`` を設定すると、REST
APIのTLS暗号化が有効になります。 TPAは自動的に次のことを行います。

- 各PatroniノードのTPAクラスターCAとサーバー証明書を生成します。

- HTTPSでトラフィックを処理するようにPatroni REST APIを構成します。

- HTTPSを介して接続し、CAを使用してサーバー証明書を検証するようにクライアント\ ``patronictl``
  やHAProxyなどを構成します。

クライアント認証
----------------

TLS暗号化が有効になる ``patroni_ssl_enabled: true`` すると、
``patroni_authentication_mode`` 変数を使用して認証モードを選択できます。

- **``basic`` デフォルト** クライアントは、設定済みのPatroni REST
  APIのユーザー名とパスワードを提供する必要があります。
  TPAは、これらの資格情報を自動的に生成します。

- **``mtls`` :**
  クライアントは、信頼できるクラスターCAによって署名された有効なTLS証明書を提示する必要があります。
  TPAは自動的に

  - クライアント証明書\ ``verify_client: required``
    を要求および検証するようにPatroni REST APIを構成します。
  - 必要なクライアント証明書とキーを使用してクライアント\ ``patronictl``
    、HAProxyを構成します。

APIアクセス制御許可リスト
-------------------------

セキュリティを強化するために、PatroniのREST APIは\ ``allowlist``
で自動的に構成されます。このリストは、TPAインベントリで定義されたホスト名に基づいて、有害な可能性のあるAPIエンドポイント\ ``POST``
、\ ``PUT`` 、\ ``PATCH`` 、\ ``DELETE``
を使用するエンドポイントへのアクセスをクラスター内の他のPatroniノードにのみ制限します。読み取り専用エンドポイントヘルスチェックなどは、他のソースHAProxyなどからアクセスしたままです。

これらの構成変数は、TPAでのPatroniの展開での特定の動作を制御するために使用できます。

.. csv-table::
  :header: Variable,Default value,Description
  :widths: 12,12,18
  :align: left
  :class: longtable

  `patroni_super_user`,postgres,スーパーユーザーロールのpostgresで作成するユーザー。
  `patroni_replication_user`,replicator,レプリケーションロールのpostgresで作成するユーザー名。
  `patroni_restapi_user`,patroni,patroni REST API用に構成するユーザー名。
  `patroni_rewind_user`,rewind,pg_rewindファンクションのpostgresで作成するユーザー名。
  `patroni_installation_method`,pkg,パッケージまたはソースたとえばgitリポジトリまたはdockerの場合はローカルソースディレクトリなどからpatroniをインストールします。
  `patroni_package_flavour`,"community if no EDB repository is configured, else edb",`edb-patroni`パッケージ `edb`フレーバー、EDBリポジトリが必要 または `patroni`パッケージ `community`フレーバー、PGDGおよびEPEL RedHatベースのみのリポジトリが必要 をインストールするかどうか。
  `patroni_ssl_enabled`,no,REST APIおよびctl接続のSSLを有効にするかどうか。可能な場合は、クラスターSSL証明書とCAを使用します。
  `patroni_authentication_mode`,`basic`,REST APIのクライアント認証モード`basic`または`mtls`を定義します。 `patroni_ssl_enabled: true`が必要です。
  `patroni_rewind_enabled`,yes,postgres rewindを有効にするかどうか、patroni_rewind_userで定義されたユーザーを作成し、configセクションを追加します。
  `patroni_watchdog_enabled`,no,追加のスプリットブレイン防止のためにカーネルウォッチドッグを構成するかどうか。
  `patroni_dcs`,etcd,DCSに使用するバックエンド。現時点ではetcdのみがオプションです。
  `patroni_dcs_namespace`,`/tpa`,Patroniがクラスター状態を保存するDCS内の名前空間。
  `patroni_listen_port`,8008,REST API TCPポート番号
  `patroni_etcd_user`,etcd_patroni,`etcd_authentication_mode`が`basic`の場合にPatroniが使用する専用etcdユーザーのユーザー名。
  `patroni_conf_settings`,{},パトローニ構成のオーバーライドを含む構造化データオブジェクト。部分的なデータを提供でき、生成された構成とマージされます。実行時に既知のインスタンス情報に基づいて生成された値をオーバーライドしないように注意してください。
  `patroni_dynamic_conf_settings`,{},DCS設定専用のオプションの構造化データ。これは`patroni_conf_settings`にマージされます。
  `patroni_repl_max_lag`,None,これは、`haproxy_read_only_load_balancer_enabled`がtrueの場合にのみhaproxyバックエンドヘルスチェックで使用されます。 `/replica?lag`の可能な値については、  :ref:`Configuring lvm-direct for production <Patroni cluster management commands>` を参照してください

..  Note::
   Ansible Towerを介して展開する場合、`patroni_etcd_user` をデフォルト値から変更すると、展開が失敗します。これは、TPAがインベントリ内の動的なシークレット名を処理できないために発生します。この問題を回避するには、プロビジョニング後および展開前に、パスワードをローカルで手動生成し、構成リポジトリにプッシュする必要があります。

.. code:: shell

   tpaexec store-password <your_custom_username> .

.. ::
   ## Patroni構成ファイル設定

patroniの構成は3つのレイヤーから構築され、Patroniデーモンによって設定されたデフォルトから始まり、DCSからロードされた構成、最後にローカル構成から構築されます。最後は、構成ファイルから制御でき、環境を介してオーバーライドできます。
TPAは構成ファイルを制御し、値はこの順序で構築されます。

APIに送信され、構成ファイルのブートストラップセクションに保存されるDCS構成。

- ``postgres`` のTPA変数はDCS設定にロードされます。
  :ref:`postgresql.conf <postgresql.conf>` を参照してください。一部の機能はサポートされていません。以下の注意事項を参照してください。

- DCS設定のPatroniのデフォルト

- ``patroni_dynamic_conf_settings``
  のユーザー指定のデフォルト。DCS設定をオーバーライドする場合は、ここで行うことができます。

YAML構成ファイルに保存されるローカル構成

- 上記の前の手順からロードされた\ ``bootstrap.dcs`` 。

- ``patroni_ssl_enabled``
  などの機能フラグによって有効になる構成。上記の表を参照してください。

- 次に、最後にユーザー指定設定からオーバーロードされます\ ``patroni_conf_settings``
  オプション。機能フラグによって制御されない構成を変更または追加する場合、これはそれに最適な場所です。

構成は、IPアドレス、ポート番号、クラスターロールなどのクラスター情報からTPAによって生成された構成に
*マージ*
されることに注意してください。これは、クラスターの安定したオペレーションに影響を与える可能性があるため、オーバーライドするものに注意してください。

Patroniはすべてのpostgres構成をDCSに保存し、これがpostgresに配布される方法と時期を制御するため、TPAの一部の機能はpatroniと互換性がありません。

- ``postgres_conf_template`` 設定で\ ``postgresql.conf``
  の生成に使用されたテンプレートを変更することはできません。

- 設定\ ``postgres_conf_dir``
  では、Postgres構成ファイルの場所を変更することはできません。

TPAのPatroni構成 ``config.yml``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

単一の値をオーバーライドできます。

.. code:: yaml

   cluster_vars:
     patroni_conf_settings:
       bootstrap:
         dcs:
           ttl: 120

またはフルブロックPatroniドキュメントからの例を使用して

.. code:: yaml

   cluster_vars:
     patroni_conf_settings:
       restapi:
         http_extra_headers:
           X-Frame-Options: SAMEORIGIN
           X-XSS-Protection: 1; mode=block
           X-Content-Type-Options: nosniff
         https_extra_headers:
           Strict-Transport-Security: max-age=31536000; includeSubDomains

デフォルトのTPA構成変数に存在する値またはセクションを無効にする場合は、値を\ ``null``
に設定できます。これにより、パトロニは、構成ファイルをロードするときにこのセクションを無視します。

たとえば、\ ``log`` のデフォルトのTPA構成は次のとおりです。

.. code:: yaml

   log:
     dir: /var/log/patroni

ロギングをオフにするには、これを\ ``config.yml`` に追加します。

.. code:: yaml

   cluster_vars:
     patroni_conf_settings:
       log: null

Eetcd統合
---------

``etcd`` がDCSとして使用される場合、TPAは\ ``etcd``
セキュリティ構成に基づいて、それに接続するようにPatroniを自動的に構成します。

- **プロトコル** ``etcd_ssl_enabled`` に基づいて\ ``http``
  または\ ``https`` を使用します。

- **CA証明書**
  TLSが有効になっている場合に、クラスターCA証明書パスを提供します。

- **認証**

  - ``etcd_authentication_mode`` が\ ``basic``
    の場合、Patroniはユーザー名\ ``patroni_etcd_user``
    とその生成されたパスワードで構成されます。
  - ``etcd_authentication_mode`` が\ ``mtls``
    の場合、Patroniはクライアント証明書とキーへのパスで構成されます。

TPAは、Patroniクラスターを管理するためのこれらの最小限のツールセットを提供します。

ステータス
----------

Patroni実行に従ってTPAクラスターの現在のステータスを確認するには

.. code:: shell

   tpaexec status cluster_name

スイッチオーバー
----------------

レプリカノードへのスイッチオーバーを実行するにはメンテナンスを実行するには、次のコマンドを実行します。

.. code:: shell

   tpaexec switchover cluster_name new_primary

new_primary引数は、現在正常なレプリカとして実行されている既存のクラスターノードの名前である必要があります。スイッチオーバーが実行される前に、これがtrueを確認するためにチェックが実行されます。

スイッチオーバーが実行されたら、 ``deploy`` および\ ``test``
を実行して、正常なクラスターを確認することをお勧めします。

.. code:: shell

   tpaexec deploy cluster_name
   tpaexec test cluster_name

TPAは、config.ymlの内容に関係なく、展開中にノードの現在のロールを検出しますたとえば、別のノードがリーダーである場合。

``tpaexec upgrade`` を使用したパトローニのマイナー更新
------------------------------------------------------

特定のパッケージバージョンにアップグレードしようとする場合は、
``config.yml`` の\ ``patroni_package_version``
が更新されて、目的のバージョンを反映していることを確認します。

目的のバージョンを追加の引数として\ ``tpaexec upgrade``
コマンドに渡すこともできます。

.. code:: shell

   tpaexec upgrade <cluster_dir> -e patroni_package_version="<desired version>" --components=patroni

詳細については、 :ref:`package version selection and upgrade <Upgrading your cluster>` のセクションを参照してください。

アップグレードのためにPatroniを選択するには、 ``tpaexec upgrade``
コマンドに渡される\ ``--components`` フラグに ``patroni``
または\ ``all`` が含まれていることを確認します

:ref:`component selection for upgrade <Upgrading your cluster>` のセクションを参照してください

詳細については、
