pglogical#
pglogicalパッケージバージョン#
デフォルトでは、TPAはpglogical
の利用可能な最新バージョンをインストールします。
config.yml ファイルのcluster_vars
セクションの下にpglogical_package_version: xxx
を含めることにより、インストールされるpglogical
パッケージのバージョンを指定できます。
cluster_vars:
…
pglogical_package_version: 2.2.0*
…
aptまたはyumが受け入れるバージョン指定子を使用できます。
バージョンが一致しない場合は、 *
ワイルドカードを追加してみてください。これは、パッケージバージョンに2:...
のようなエポック修飾子がある場合に必要になることがよくあります。
pg論理構成#
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のパブリケーションは、レプリケーションセットのコレクションに名前を割り当てるだけであり、サブスクリプションはこの名前を使用して、目的のプロバイダーを参照できます。
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を構成します。 Creating Postgres users および Creating 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ノードが存在しない場合は作成します。データベースごとに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のサポートは現在テストされていません。