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