pglogical configuration

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

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を構成します。

postgres_users および postgres_databases を設定してレプリケーション用のデータベースを作成し、 postgres-config-final を使用できます

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

出版物

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

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 を指定し、サブスクライブするパブリケーションを定義する必要があり、サブスクリプションの他のオプションの属性を指定する場合があります。

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 (上記のように)を設定して、サブスクライブするパブリケーションを定義できます。その名前のパブリケーションが(クラスター全体にわたって)複数ある場合は、明確にするインスタンスの名前を指定できます。パブリケーションを名前で参照する場合は、同じインスタンスに同じ名前の複数のパブリケーションを作成しないでください。

- 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のサポートは現在テストされていません。