pglogical
=========

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

デフォルトでは、TPAは\ ``pglogical``
の利用可能な最新バージョンをインストールします。

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

.. code:: yaml

   cluster_vars:
       …
       pglogical_package_version: 2.2.0*
       …

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

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

pg論理構成
----------

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のパブリケーションは、レプリケーションセットのコレクションに名前を割り当てるだけであり、サブスクリプションはこの名前を使用して、目的のプロバイダーを参照できます。

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

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

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

TPAは、ユーザー、拡張機能、データベースを作成した後、PGD構成の前にpglogicalを構成します。
:ref:`Creating Postgres users <Creating Postgres users>` および :ref:`Creating 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ノードが存在しない場合は作成します。データベースごとにpg論理ノードは1つだけであるため、
``bdr_database``
でpg論理パブリケーションを構成する場合、インスタンスの\ ``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のサポートは現在テストされていません。
