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

TPAは、 EDB Postgres
DistributedPGD、旧名BDR双方向レプリケーションバージョン3.7、4.x、および5.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をインストールするかを決定します。
``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:: pgd-proxyおよびpgd-cliがインストールされている場合
  pgd-proxyおよびpgd-cliはGoで書かれているため、Postgresへの接続にGoドライバーを使用します。
  これらのドライバーは、libpqCライブラリが提供する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/reference/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は必要に応じてコミットスコープを作成、変更、またはドロップして、データベースが構成と一致することを確認します。設定しない場合、既存のコミットスコープはそのままになります。

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

フック
^^^^^^

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バージョンの展開を積極的にサポートまたはテストしなくなりました。
