pglogical configuration
=======================

TPAは、 pglogical v2およびpglogical
v3でpglogicalレプリケーションセット（パブリケーション）とサブスクリプションを構成できます。

.. code:: yaml

   instances:

   - node: 1
     Name: kazoo
     …
     vars:
       publications:
       - type: pglogical
         database: example
         name: some_publication_name
         replication_sets:
         - name: custom_replication_set
           …


   - node: 2
     Name: keeper
     vars:
       subscriptions:
       - type: pglogical
         database: example
         name: some_subscription_name
         publication:
           name: some_publication_name
         replication_sets:
           - default
           - default_insert_only
           - custom_replication_set
         …

``type: pglogical``
でパブリケーションまたはサブスクリプションを定義すると、デフォルトでpglogical拡張機能が作成されますが、どのバージョンをインストールするかを決定するのはあなた次第です（たとえば、
pglogical3の\ ``products/pglogical3/release``
リポジトリにサブスクライブします）。

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

TPAは、
pglogicalを使用してインスタンス間で変更をレプリケートするために必要なすべてを構成でき、
config.ymlの変更に基づいてレプリケーションセットアップを変更することもできます。

変更を公開するには、 ``publications`` に\ ``type: pglogical``
を使用してエントリーを定義します。これらの変更をサブスクライブするには、上記のように、\ ``subscriptions``
に\ ``type: pglogical`` を使用してエントリを定義します。

pglogicalには名前付き公開エンティティがありません（組み込み論理レプリケーションに\ ``CREATE PUBLICATION``
があるという意味で）。
config.ymlのパブリケーションは、レプリケーションセットのコレクションに名前を割り当てるだけで、サブスクリプションはこの名前を使用して、目的のプロバイダーを参照できます。

pglogicalレプリケーションを使用するには、パブリッシャーとサブスクライバーの両方に名前付きローカルpglogicalノードが必要です。
TPAは、存在しない場合、\ ``pglogical.create_node()``
でこのノードを作成します。パブリケーションの場合、パブリケーション名はpglogicalノード名として使用されます。特定のデータベースには1つのpglogicalノードしか存在できないため、データベースごとに\ ``publications``
に1つのエントリのみを持つことができます。

ただし、 pglogicalサブスクリプション *do* には独自の名前があります。
TPAは、指定された\ ``name``
でサブスクリプションを作成し、インスタンスの名前と、サブスクリプションが作成されるデータベースの名前に基づいて、
pglogicalノード名のデフォルト値を使用します。必要に応じて、別の\ ``node_name``
を指定できます。たとえば、同じデータベースでパブリケーションを構成し、そのデータベース内のすべてのサブスクリプションが同じpglogicalノードを共有する必要がある場合。

TPAは、構成の基本的な検証を行います。 ``replication_sets``
を\ ``replciation_sets``
と綴った場合、または定義されていないパブリケーションをサブスクライブしようとした場合、エラーを指摘しますが、パブリケーションとサブスクリプションの意味のあるセットを指定するのはあなたの責任です。

TPAは、ユーザー、拡張機能、およびデータベースを作成した後、PGD構成の前にpglogicalを構成します。
 :ref:`postgres_users <The postgres Unix user>` および :ref:`postgres_databases <Creating Postgres databases>` を設定してレプリケーション用のデータベースを作成し、 :ref:`postgres-config-final <postgres-config-final>` を使用できます

pglogicalが構成される前にデータベースにデータを投入するためのフック。

出版物
------

``publications`` のエントリーは\ ``name`` および\ ``database``
を指定する必要があり、オプションの属性を持つ名前付き\ ``replication_sets``
のリスト、およびテーブルまたはシーケンス名のリストを指定できます。

.. code:: yaml

   publications:

   - type: pglogical
     database: example
     name: some_publication_name
     replication_sets:
     - name: default
       replicate_insert: true
       replicate_update: true
       replicate_delete: true
       replicate_truncate: true
       autoadd_tables: false
       autoadd_sequences: false
       autoadd_existing: true
     - name: custom_replication_set
       tables:
       - name: sometable
       - name: "some-schema".othertable
         columns: [a, b, c]
         row_filter: a > 42
         synchronize_data: true
       sequences:
       - name: someseq
         synchronize_data: true
       - name: "some-schema".otherseq

各レプリケーションセットは、 ``replicate_insert``
や\ ``autoadd_existing``
などのオプションの属性を指定できます。指定された場合、それらは\ ``pglogical.create_replication_set()``
への呼び出しに名前付きパラメーターとして含まれます。それ以外の場合、それらは除外され、代わりにpglogicalのデフォルトでレプリケーションセットが作成されます。

pglogical3の\ ``autoadd_*``
パラメーターを使用して、レプリケーションセットに属するリレーションのリストを操作する以外に、テーブルまたはシーケンスのリストを明示的に指定することもできます。各リレーションの名前はスキーマ修飾でき（非修飾名は\ ``public``
にあると想定されます）、上記のように、エントリには\ ``row_filter``
（テーブルのみ）または\ ``synchronize_data``
などのオプションの属性を含めることができます。

サブスクリプション
------------------

``subscriptions`` のエントリーは、 ``name`` および\ ``database``
を指定し、サブスクライブするパブリケーションを定義する必要があり、サブスクリプションの他のオプションの属性を指定する場合があります。

.. code:: yaml

   subscriptions:

   - type: pglogical
     database: example
     name: some_subscription_name
     node_name: optional_pglogical_node_name
     publication:
       name: some_publication_name
     # Optional attributes:
     synchronize_structure: true
     synchronize_data: true
     forward_origins: [all]
     strip_origins: false
     apply_delay: 1 second
     writer: heap
     writer_options:
       - magic
       - key=value
       - just-a-string
     # Optional attributes that can be changed for an existing
     # subscription:
     replication_sets:
       - default
       - default_insert_only
       - custom_replication_set
     enabled: true

サブスクリプションは ``publication.name``
（上記のように）を設定して、サブスクライブするパブリケーションを定義できます。その名前のパブリケーションが（クラスター全体にわたって）複数ある場合は、明確にするインスタンスの名前を指定できます。パブリケーションを名前で参照する場合は、同じインスタンスに同じ名前の複数のパブリケーションを作成しないでください。

.. code:: yaml


   - type: pglogical
     …
     publication:
       name: some_publication_name
       instance: kazoo

     # OR

     provider_dsn: "host=… dbname=…"

出版物を名前で参照する代わりに、代わりに\ ``provider_dsn``
を明示的に指定できます。この場合、指定されたDSNは\ ``pglogical.create_subscription()``
に直接渡されます（そして ``publication``
は無視されます）。このメカニズムを使用して、TPAクラスター外部のインスタンスにサブスクライブできます。

上記の例の他の属性はオプションです。定義されている場合、それらは\ ``pglogical.create_subscription()``
への呼び出しに名前付きパラメーターとして含まれます。それ以外の場合、それらは除外されます。
（表示されているいくつかの属性はpglogical3に固有です。）

構成の変更
----------

パブリケーションの場合、レプリケーションセットの追加または削除、レプリケーションセットの属性の変更、またはメンバーシップ（それに含まれるテーブルとシーケンス）の変更を行うことができます。

``replicate_ *``\ または\ ``autoadd_*``
を変更すると、TPAはそれに応じて\ ``pglogical.alter_replication_set()``
を呼び出します（ただし、既存のレプリケーションセットの\ ``autoadd_existing``
を変更することはできず、 ``autoadd_*``
パラメーターはすべてpglogical3固有です）。

レプリケーションセットの\ ``tables`` または\ ``sequences``
のリストを変更すると、TPAは必要に応じて\ ``pglogical.alter_replication_set_{add,remove}_{table,sequence}()``
を呼び出すことにより、これらの変更を調整します。

ただし、 ``synchronize_data``
またはすでにレプリケーションセットのメンバーであるリレーション（テーブルまたはシーケンス）の他の属性を変更した場合、TPAは変更を伝播しません（たとえば、テーブルを削除して、別の構成で再追加します）
。

サブスクリプションの場合、\ ``replication_sets``
のリストを変更し、サブスクリプション（\ ``enabled: false``
）を有効または無効にすることのみできます。

どちらの場合も、存在するが構成に記載されていない複製セットは削除されます（サブスクライバーに\ ``pglogical.alter_subscription_remove_replication_set()``
、またはパブリッシャーに\ ``pglogical.drop_replication_set()``
を使用します。ただし、\ ``default`` 、\ ``default_insert_only``
、および\ ``ddl_sql``
という名前のデフォルトの複製セットは削除されません。）

config.ymlを編集する場合は、 ``tpaexec deploy``
を実行する前に\ ``tpaexec provision``
を実行することを忘れないでください。

PGDとの相互作用
---------------

注意を払えば、同じデータベースでPGDとpglogicalを一緒に使用することができます。

PGD v3はpglogical3を内部で使用し、
pglogicalノードが存在しない場合は作成します。データベースごとに1つのpglogicalノードしか存在できないため、
``bdr_database``
でpglogicalパブリケーションを構成する場合、インスタンスの\ ``bdr_node_name``
はパブリケーションの\ ``name``
と同じである必要があります。そうしないと、最初にパブリケーション用にノードが作成され、
``bdr.create_node()`` は後でノード名の競合に関するエラーで失敗します。
``bdr_database`` の\ ``subscriptions`` も同じ\ ``node_name``
を使用する必要があります。

制限事項
--------

-  現在、\ ``pglogical.replication_set_{add,remove}_ddl()``
   のサポートはありません

-  現在、\ ``pglogical.replication_set_add_all_{tables,sequences}()``
   のサポートはありません

-  現在、\ ``pglogical.alter_subscription_{interface,writer_options}()``
   または\ ``pglogical.alter_subscription_{add,remove}_log()``
   のサポートはありません

-  pglogical v1のサポートは現在テストされていません。
