EDB Postgres Distributed configuration
======================================

TPAは、 EDB Postgres
DistributedPGD、以前はBDR双方向レプリケーションバージョン3.7、4.x、5.xとして知られていたものをインストールおよび構成できます。と6.x

PGDパッケージへのアクセスは、EDBのパッケージリポジトリを介してのみです。パッケージをダウンロードするには、有効なEDBサブスクリプショントークンが必要です。

このドキュメントでは、
PGD構成のいくつかの側面について触れていますが、詳細の信頼できる説明については `PGDdocumentation <https://enterprisedb.com/docs/pgd/latest/>`_ を参照してください。

はじめに
--------

TPAは、
Postgres自分自身とともにPGDと依存関係をすべてのPGDインスタンスにインストールします。

基本的なPostgresのセットアップを完了し、Postgresを起動した後、TPAは\ ``bdr_database``
を作成し、以下で説明するさまざまな手順を介してPGDクラスターのセットアップを続行します。

インストール
------------

TPAは、使用中のPostgresのバージョンとフレーバーPostgres、Postgres
Extended、またはEPASなどに応じて、正しいPGDパッケージをインストールします。

``bdr_version``
を設定して、PGDのどのメジャーバージョン3、4、5、6をインストールするかを決定します。
``bdr_package_version``
を設定して、インストールする正確なパッケージを決定しますたとえば、最新の5.0.xをインストールする場合は
‘5.0\*’ 。

クラスターセットアップの概要
----------------------------

必要なパッケージをインストールし、PGDをロードするようにPostgresを構成し、サーバーを起動した後、TPAはPGDノード、グループ、レプリケーションセット、およびその他のリソースのセットアップを続行します。

次に、TPAが実行する手順の概要を示します。

- 参加するインスタンスごとにPGDノードを作成します bdr.create_node()

- ``bdr_node_groups``
  に応じて、1つ以上のPGDノードグループを作成しますbdr.create_node_group()を使用

- 必要に応じて、レプリケーションセットを作成して、どの変更をレプリケートするかを正確に制御しますノードグループタイプとメンバーシップによって異なります。たとえば、サブスクライバ専用ノードと監視ノードは特別な処理が必要な場合があります。

- 個々のインスタンスで関連するノードグループに参加する

- サブグループRAFTまたはプロキシルーティングを有効にするなど、追加構成を実行します。

このプロセスには、クエリの複雑なシーケンスの実行が含まれます。一部は各インスタンスで順番に、他はパラレルで。手順を簡単に行うために、TPAは任意のPGDプライマリインスタンスをクラスターの「first_bdr_primary」として指定し、これを使用しますインスタンスを使用して、これらのクエリのほとんどを実行します。インスタンスはそれ以外の点では特別ではなく、そのIDはPGD構成自分自身にとって重要ではありません。

インスタンスロール
------------------

``role`` に\ ``bdr``
を含むすべてのインスタンスはPGDインスタンスであり、暗黙的に\ ``postgres``
サーバーインスタンスでもあります。

ロールに\ ``readonly``
が含まれるPGDインスタンスは、ロジカルスタンバイノード
``pause_in_standby``
設定でPGDノードグループに参加します。昇格の対象です。

ロールに\ ``subscriber-only``
を持つPGDインスタンスはサブスクライバー専用ノードであり、レプリケートされた変更を受信しますが、公開しません。

ロールに\ ``witness`` が含まれるPGDインスタンスは、監視ノードです。

上記のすべてのPGDインスタンスは、暗黙的に\ ``primary``
インスタンスでもあります。例外は、ロールに\ ``replica``
を持つインスタンスです。これは、上流のPGDインスタンスの物理的ストリーミングレプリカを示します。このようなインスタンスは、推奨されるPGDアーキテクチャには含まれておらず、現在TPAではサポートされていません。

構成設定
--------

以下で説明する設定は、クラスター内のすべてのPGDインスタンスに均一に設定されるように、通常は\ ``cluster_vars``
で設定する必要があります。一部の場合\ ``bdr_database``
など、さまざまなインスタンスに異なる値を設定できますが、他の場合、結果は未定義ですたとえば、すべてのインスタンスが完全に同じ値の\ ``bdr_node_groups``
を持つ必要があります。

``cluster_vars``
の下でクラスター全体の均一な値を設定することにより、PGD構成を定義することを強くお勧めします。

bdr_database
^^^^^^^^^^^^

``bdr_database`` デフォルトbdrdbはPGDで初期化されます。

bdr_client_dsn_attributes
^^^^^^^^^^^^^^^^^^^^^^^^^

``bdr_client_dsn_attributes`` には、 *追加*
の `parameter keywords supported by libpq <https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS>`_ を含めることができます。

``host`` 、\ ``port`` 、\ ``dbname`` 、および\ ``user``
は含めないでください。これらは既に接続文字列に含まれています。

..  Note When pgd-proxy and pgd-cli are installed::
   pgd-proxyおよびpgd-cliはGoで書かれているため、Postgresへの接続にGoドライバーを使用します。

これらのドライバーは、libpq
Cライブラリが提供するDSN属性の完全なセットをサポートしていません。

pgd-proxyおよび/またはpgd-cliがインストールされ、 :ref:`bdr_client_dsn_attributes <bdr_client_dsn_attributes>` にGoドライバーで
*サポートされていない*
パラメータータイムアウトなどが含まれている場合、2つの新しい変数をクラスター構成に含める必要があります。

- ``pgd_proxy_dsn_attributes`` ``pgd-proxy-conf``
  で接続文字列を作成するために使用されます

- ``pgd_cli_dsn_attributes`` ``pgd-cli-conf``
  で接続文字列を作成するために使用されます

これらの2つの文字列には、Goドライバーと互換性のあるパラメーターキーワードのみが含まれている必要があります。

``bdr_client_dsn_attributes``
がサポートされていないパラメーターを含まない場合、これは無視でき、
``bdr_client_dsn_attributes`` は\ ``pgd-proxy-conf``
および\ ``pgd-cli-conf`` の接続文字列に含まれます。

.. ::
   ### bdr_node_group

``bdr_node_group``
の設定デフォルトクラスター名に基づいて、インスタンスがどのPGDクラスターに参加するかを指定します。外部コンポーネントたとえば、pgd-proxyまたはharp-proxyなどの特定のクラスターを識別するためにも使用されます。

bdr_node_groups
^^^^^^^^^^^^^^^

これは、グループ参加ステージ前に作成する必要があるPGDノードグループのリストですクラスターに追加のサブグループが必要な場合。

通常、\ ``tpaexec configure``
は、選択したアーキテクチャに基づいて適切な値を生成します。

.. code:: yaml

   cluster_vars:
     bdr_node_groups:
     - name: topgroup
     - name: abc_subgroup
       node_group_type: data
       parent_group_name: topgroup
       options:
         location: abc
     …

最初のエントリーは、クラスターの\ ``bdr_node_group``
用である必要があります。

リストの後続の各エントリは\ ``parent_group_name`` を指定する必要があり、
``node_group_type`` オプショナルを指定する場合があります。

各エントリは、グループオプションのオプションのキー/値のマッピングを持つ場合があります。使用可能なオプションはPGDバージョンによって異なります。

bdr_child_group
^^^^^^^^^^^^^^^

インスタンスに\ ``bdr_node_groups``
で記載されているグループの名前に\ ``bdr_child_group``
が設定されている場合、\ ``bdr_node_group``
の代わりにそのグループに参加します。

bdr_commit_scopes
^^^^^^^^^^^^^^^^^

これは `commit scopes <https://www.enterprisedb.com/docs/pgd/latest/commit-scopes/>`_ のオプショナルリストです

PGDデータベースPGD 4.1以降で利用可能に存在する必要があります。

.. code:: yaml

   cluster_vars:
     bdr_commit_scopes:
     - name: somescope
       origin: somegroup
       rule: ALL (somegroup) ON received …`
     - name: otherscope
       origin: othergroup
       rule: …
     …

各エントリは、コミットスコープの\ ``name`` 、\ ``origin``
グループの名前、およびコミットスコープ\ ``rule``
を指定する必要があります。グループは\ ``bdr_node_groups``
のエントリに対応する必要があります。

``bdr_commit_scopes``
を明示的に設定すると、TPAは必要に応じてコミットスコープを作成、変更、またはドロップして、データベースが構成と一致することを確認します。設定しない場合、既存のコミットスコープはそのままになります。

preferred_first_bdr_primary
^^^^^^^^^^^^^^^^^^^^^^^^^^^

これは、TPAが単一のノードでのみ実行されるPGD関連のタスクに使用するインスタンスの名前です。これには、
DDL/DMLの実行が含まれ、レプリケーションによって他のPGDノードに伝播されます。また、新しいPGDノードを初期化するためのデータの読み取りも含まれます。設定されていない場合、または使用できないインスタンスに設定されている場合、TPAは適切な候補が存在する場合にインスタンスを任意に選択します。

TPAによって選択されたインスタンスは、ファクト\ ``first_bdr_primary``
に保存されます。実行可能なインスタンスのリストは、ファクト\ ``first_bdr_primary_candidates``
に保存されます。これらのファクトはいずれも\ ``config.yml``
から設定できません。フックまたはデバッグで使用するためにここにノートされています。

..  Note::
   `preferred_first_bdr_primary` の選択は、展開されたクラスター内の書き込みリーダーとして選択されるノードに影響を与えません。

.. ::
   ####preferred_first_bdr_primaryの高度な使用

単一のオペレーションに\ ``preferred_first_bdr_primary``
を設定する場合は、 ``config.yml`` で指定するのではなく、Ansible ``-e``
オプションを使用してそれを渡すことができます。例

.. code:: shell

   tpaexec deploy . -e preferred_first_bdr_primary=instance_name

これは、PGDノードを追加または再構築しており、たとえば同じデータセンター内のノードからデータを確実にクローンしたい場合に役立ちます。

同様に、各ノードに異なるインスタンスを使用して、
``preferred_first_bdr_primary``
をインスタンス変数として設定できます。たとえば、この構成は、 ``node1``
がリビルドされる場合、 ``tpaexec deploy``
コマンドは、リビルドのデータソースとして\ ``node2``
を優先することを意味します。

.. code:: yaml

   instances:
     - Name: node1
       ...
       instance_vars:
         preferred_first_bdr_primary: node2

この構成を使用する場合、ノードが最初に展開された後に適用する必要があります。最初の展開時に\ ``preferred_first_bdr_primary``
の複数の値を設定することはお勧めできません。

その他のノート
--------------

フック
^^^^^^

TPAは、
PGDクラスターセットアッププロセス中にbdr-node-pre-creation、bdr-post-group-creation、およびbdr-pre-group-join
:ref:`TPA hooks <TPA hooks>` を呼び出します。

データベースの照合順序
^^^^^^^^^^^^^^^^^^^^^^

TPAは、クラスター内のすべてのインスタンスのPGDデータベースが同じ照合順序LC_COLLATE設定があることを確認します。同じPGDクラスター内のデータベースに異なる照合順序があると、データ損失のリスクが発生します。

PGDの古いバージョン
-------------------

TPAは、 BDR v1 Postgres 9.4のパッチ適用バージョンを使用、v2 Postgres
9.6、またはv3.7より前のPGDバージョンの展開を積極的にサポートまたはテストしなくなりました。
