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