Replication Sets

レプリケーションセットは、 BDRノードがサブスクライブできるテーブルのグループです。レプリケーションセットを使用して、各ノードが他のノードの正確なコピーである通常の対称マルチマスターよりも複雑なレプリケーショントポロジを作成できます。

すべてのBDRグループは、自分自身と同じ名前のレプリケーションセットを自動的に作成します。このレプリケーションセットはデフォルトのレプリケーションセットであり、すべてのユーザテーブルとDDLレプリケーションに使用され、すべてのノードがサブスクライブします。つまり、デフォルトでは、すべてのユーザテーブルがすべてのノード間で複製されます。

レプリケーションセットの使用

create_replication_set() を使用して、挿入、更新、削除、または切り捨てのアクションを含めるかどうかを指定して、追加のレプリケーションセットを作成できます。既存のテーブルをセットに自動的に追加するオプションがあり、2番目のオプションはテーブルの作成時に自動的に追加するかどうかを定義します。

レプリケーションセットに追加または削除するテーブルを手動で定義することもできます。

レプリケーションセットに含まれるテーブルは、ノードがクラスターに参加したとき、およびその後に維持されます。

ノードが参加したら、レプリケーションセットからテーブルを削除できますが、新しいテーブルの追加は再同期オペレーションで行う必要があります。

デフォルトでは、新しく定義されたレプリケーションセットはDDLまたはBDR管理ファンクションコールをレプリケートしません。 replication_set_add_ddl_filter を使用して、複製するコマンドを定義します。

BDRは、すべてのノードにレプリケーションセット定義を作成します。次に、 alter_node_replication_sets を使用して、各レプリケーションセットをパブリッシュおよび/またはサブスクライブするように各ノードを定義できます。

これらの定義を後で変更したり、レプリケーションセットを削除したりするためのFunctionsが存在します。

注釈

選択的レプリケーションにデフォルトのレプリケーションセットを使用しません。デフォルトではDDLレプリケーションおよび管理ファンクション呼び出しにも使用されるため、クラスター内のBDRノードでデフォルトのレプリケーションセットを削除または変更しないでください。

パーティションテーブルの動作

BDRはテーブルパーティションを透過的にサポートしています。つまり、パーティションテーブルをレプリケーションセットに追加すると、パーティションを含む変更がダウンストリームに複製されます。

注釈

パーティションがパーティションテーブルを介して複製される場合、パーティションで直接実行されるステートメントは親テーブルで実行されたときに複製されます。例外は、影響を受けるテーブルまたはパーティションのリストを常に複製する`TRUNCATE` コマンドです。

個々のパーティションをレプリケーションセットに追加することができます。その場合、それらは通常のテーブルのように(ダウンストリームのパーティションと同じ名前のテーブルに)複製されます。プロバイダーとサブスクライバーの両方でパーティショニング定義が同じである場合、パーティショニングロジックを実行する必要がないため、これにはパフォーマンス上の利点があります。

注釈

ルートパーティションテーブルがレプリケーションセットのパートである場合、個々のパーティションのメンバーシップは無視され、上記のルートテーブルのメンバーシップのみがアカウントされます。

外部キーの動作

外部キー制約は、参照元のテーブルの行が参照被参照のテーブルの行と一致するようにします。したがって、参照するテーブルがレプリケーションセットのメンバである場合、被参照されるテーブルも同じレプリケーションセットのメンバである必要があります。

BDRの現在のバージョンは、この条件を自動的にチェックまたは適用しません。したがって、レプリケーションセットにテーブルを追加するときに、外部キーを介して被参照されるすべてのテーブルも追加されるようにmakeのはデータベース管理者の責任です。

次のクエリーを使用して、この要件を満たさない、つまり参照元のテーブルがレプリケーションセットのメンバであり、被参照先のテーブルがそうでないすべての外部キーとレプリケーションセットをリストできます。

SELECT t1.relname,
       t1.nspname,
       fk.conname,
       t1.set_name
  FROM bdr.tables AS t1
  JOIN pg_catalog.pg_constraint AS fk
    ON fk.conrelid = t1.relid
   AND fk.contype = f
 WHERE NOT EXISTS (
  SELECT *
    FROM bdr.tables AS t2
   WHERE t2.relid = fk.confrelid
     AND t2.set_name = t1.set_name
);

このクエリーの出力は次のようになります。

 relname | nspname |  conname  | set_name
- --------+---------+-----------+----------
 t2      | public  | t2_x_fkey | s2
(1 row)

これは、テーブル t2 はレプリケーションセット s2 のメンバですが、外部キーt2_x_fkey によって被参照されるテーブルは異なることを意味します。

注釈

TRUNCATE CASCADE コマンドは、コマンドを複製する前にレプリケーションセットのメンバーシップをアカウントします。

TRUNCATE table1 CASCADE;

これは、レプリケーションセットのパートであるすべてのテーブルでカスケードのないTRUNCATE になります。

TRUNCATE table1, referencing_table1, referencing_table2 ...

レプリケーションセットの管理

レプリケーションセットの管理。

bdr.alter_node_replication_sets を例外、次のファンクションはDDL とみなされるため、 DDLレプリケーションとグローバルロックが現在アクティブな場合、それらに適用されることに注意してください。

DMLおよびDDLレプリケーション を参照してください。

bdr.create_replication_set

このファンクションは、レプリケーションセットを作成します。

このコマンドのレプリケーションは、 DDLフィルタリング設定を含むDDLレプリケーション構成の影響を受けます。

概要

bdr.create_replication_set(set_name name,
                           replicate_insert boolean DEFAULT true,
                           replicate_update boolean DEFAULT true,
                           replicate_delete boolean DEFAULT true,
                           replicate_truncate boolean DEFAULT true,
                           autoadd_tables boolean DEFAULT false,
                           autoadd_existing boolean DEFAULT true)

パラメーター

  • set_name - 新しいレプリケーションセットの名前。 BDRグループ全体で一意である必要があります

  • replicate_insert - このレプリケーションセット内のテーブルへの挿入をレプリケートするかどうかを示します

  • replicate_update -このレプリケーションセット内のテーブルの更新をレプリケートするかどうかを示します

  • replicate_delete - このレプリケーションセット内のテーブルからの削除をレプリケートするかどうかを示します

  • replicate_truncate - このレプリケーションセット内のテーブルの切り捨てをレプリケートするかどうかを示します

  • autoadd_tables -新しく作成された(将来の)テーブルをこのレプリケーションセットに追加するかどうかを示します

  • autoadd_existing -既存のすべてのユーザテーブルをこのレプリケーションセットに追加するかどうかを示します。これは autoadd_tables がtrueに設定されている場合にのみ効果があります

注意事項

デフォルトでは、新しいレプリケーションセットはDDLまたはBDR管理ファンクションコールをレプリケートしません。レプリケーションセットのDDLレプリケーションを設定する方法については、以下の ddl filters を参照してください。デフォルトグループレプリケーションセットには、グループの作成時に作成されるすべてのDDLおよび管理ファンクションコールを複製する既存のDDLフィルタが設定されていますが、 BDRグループのデフォルトレプリケーションセットがDDLまたはBDR管理ファンクションコール。

このファンクションは、 DDL ステートメントと同じレプリケーションメカニズムを使用します。これは、レプリケーションが ddl filters 構成の影響を受けることを意味します。

このファンクションは DDL グローバルロックを取得します。

このファンクションはトランザクションです。効果はトランザクションで可視です。

bdr.alter_replication_set

このファンクションは、既存のレプリケーションセットのオプションを変更します。

このコマンドのレプリケーションは、 DDLフィルタリング設定を含むDDLレプリケーション構成の影響を受けます。

概要

bdr.alter_replication_set(set_name name,
                          replicate_insert boolean DEFAULT NULL,
                          replicate_update boolean DEFAULT NULL,
                          replicate_delete boolean DEFAULT NULL,
                          replicate_truncate boolean DEFAULT NULL,
                          autoadd_tables boolean DEFAULT NULL)

パラメーター

  • set_name - 既存のレプリケーションセットの名前

  • replicate_insert - このレプリケーションセット内のテーブルへの挿入をレプリケートするかどうかを示します

  • replicate_update -このレプリケーションセット内のテーブルの更新をレプリケートするかどうかを示します

  • replicate_delete - このレプリケーションセット内のテーブルからの削除をレプリケートするかどうかを示します

  • replicate_truncate - このレプリケーションセット内のテーブルの切り捨てをレプリケートするかどうかを示します

  • autoadd_tables -新しく作成された(将来の)テーブルをこのレプリケーションセットに追加するかどうかを示します

NULL(デフォルト)に設定されているオプションは以前と同じままです。

注意事項

このファンクションは、 DDL ステートメントと同じレプリケーションメカニズムを使用します。これは、レプリケーションが ddl filters 構成の影響を受けることを意味します。

このファンクションは DDL グローバルロックを取得します。

このファンクションはトランザクションです。効果はトランザクションの ROLLBACK でロールバックでき、変更は現在のトランザクションで可視です。

bdr.drop_replication_set

このファンクションは、既存のレプリケーションセットを削除します。

このコマンドのレプリケーションは、 DDLフィルタリング設定を含むDDLレプリケーション構成の影響を受けます。

概要

bdr.drop_replication_set(set_name name)

パラメーター

  • set_name - 既存のレプリケーションセットの名前

注意事項

このファンクションは、 DDL ステートメントと同じレプリケーションメカニズムを使用します。これは、レプリケーションが ddl filters 構成の影響を受けることを意味します。

このファンクションは DDL グローバルロックを取得します。

このファンクションはトランザクションです。効果はトランザクションの ROLLBACK でロールバックでき、変更は現在のトランザクションで可視です。

警告

少なくとも別のノードで使用されているレプリケーションセットを削除しないでください。そのノードでレプリケーションが停止します。これが発生した場合は、そのレプリケーションセットから影響を受けるノードのサブスクライブを解除してください。同じ理由から、進行中の結合オペレーションがあり、参加するノードがそのレプリケーションセットのメンバである場合は、レプリケーションセットを削除しないでください。レプリケーションセットのメンバーシップは、結合の開始時にのみチェックされます。これは、レプリケーションセットの使用に関する情報が各ノードにローカルであるため、グループに参加する前にノードで構成できるために発生します。

以下で説明するalter_node_replication_sets を使用して、ノードのレプリケーションセットのサブスクリプションを管理できます。

bdr.alter_node_replication_sets

このファンクションは、ノードがパブリッシュおよびサブスクライブするレプリケーションセットを変更します。

概要

bdr.alter_node_replication_sets(node_name name,
                                set_names text[])

パラメーター

  • node_name -変更するノード。現在はローカルノードである必要があります

  • set_names -指定されたノードに複製するレプリケーションセットの配列。空の配列はグループのデフォルトのレプリケーションセットを使用します

注意事項

このファンクションはローカルノードでのみ実行され、いかなる方法でも複製されません。

このファンクションはノードが参加する前に実行されるように設計されているため、リストされているレプリケーションセットは存在がチェックされません。エラーを回避するために、レプリケーションセット名を正しく指定してください。

これにより、 BDRグループに含まれるノードだけでなく、まだグループにパートしていないノードでファンクションを呼び出して、結合中に同期されるデータを制限できます。ただし、スキーマはレプリケーションセットの設定に関係なく*常に完全に同期されていることにノートしてください。つまり、レプリケーションセットで指定されたテーブルだけでなく、すべてのテーブルがコピーされます。 bdr.tables カタログテーブルを参照することで、不要なテーブルを削除できます。これらは、後のバージョンのBDRで自動的に削除される可能性があります。これは、

ddl filters

構成がDDLのレプリケーションを妨げる場合でも現在当てはまります。

この呼び出しの後にノードがサブスクライブするレプリケーションセットは、これらのノードからこのファンクションが実行されるノードに実際に変更をレプリケートするために、他のノード/によってパブリッシュされる必要があります。

レプリケーションセットのメンバーシップ

テーブルは、1つ以上のレプリケーションセットに追加および削除できマルチプル。これは、これらのテーブルの変更のレプリケーション(DML)にのみ影響します。スキーマの変更(DDL)はDDLレプリケーションセットフィルターによって処理されます(

DDLレプリケーションのフィルタリング を参照)。

レプリケーションは、レプリケーションセットのテーブルメンバーシップをノードレプリケーションセット構成と組み合わせて使用して、どのアクションをどのノードにレプリケートするかを決定します。この決定は、すべてのメンバーシップとユニオンセットオプションを使用して行わレプリケーションます。これは、テーブルがINSERTのみをレプリケートレプリケーションセットAと、UPDATEのみをレプリケートレプリケーションセットBのメンバである場合、ターゲットノードがレプリケーションセットAとBの両方にサブスクライブされている場合、INSERTとUPDATEの両方がレプリケートされることを意味します。

bdr.replication_set_add_table

このファンクションは、テーブルをレプリケーションセットに追加します。

これにより、レプリケーションセットにテーブルが追加され、この瞬間から変更のレプリケーションがスタートされます(つまり、トランザクションコミット)。テーブルがノード上に持つ可能性のある既存のデータは同期されません。

このコマンドのレプリケーションは、 DDLフィルタリング設定を含むDDLレプリケーション構成の影響を受けます。

概要

bdr.replication_set_add_table(relation regclass,
                              set_name name DEFAULT NULL,
                              columns text[] DEFAULT NULL,
                              row_filter text DEFAULT NULL)

パラメーター

  • relation -テーブルの名前またはOID

  • set_name -レプリケーションセットの名前。 NULL(デフォルト)の場合、 BDRグループのデフォルトのレプリケーションセットが使用されます

  • columns - 将来の使用のために予約れています(現在は何もしません。NULLである必要があります)

  • row_filter - レプリケートされた行のフィルタリングに使用されるSQL式。この式が定義されていない場合(つまり NULL -デフォルト)、すべての行が送信されます

row_filter は、NULLを使用してブール結果を生成する式を指定します。 True または Unknown に評価される式は行を複製します。 False 値は行を複製しません。式にサブクエリを含めることも、レプリケートされる現在の行の列以外の変数を参照することもできません。システム列は被参照できません。

row_filter は、ターゲットノードではなく、オリジンノードで実行されます。これにより、この特定のテーブルのレプリケーションに追加のCPUオーバーヘッドが発生しますが、フィルタリングされた行のデータの送信が完全に回避されるため、ネットワーク帯域幅が削減され、ターゲットノードにオーバーヘッドが適用されます。

row_filter は、特定のテーブルのTRUNCATE コマンドを削除しません。 TRUNCATE コマンドは、レプリケーションセットレベルで除外できます。以前を参照してください。

テーブルの一部の列のみを複製することができます。 違いのあるノード間の複製 を参照してください。

注意事項

このファンクションは、 DDL ステートメントと同じレプリケーションメカニズムを使用します。これは、レプリケーションが ddl filters 構成の影響を受けることを意味します。

このファンクションは、 row_filter がNULLでない場合、レプリケーションセットに追加されるリレーションで DML グローバルロックを取得します。それ以外の場合は、 DDL グローバルロックのみを取得します。

このファンクションはトランザクションです。効果はトランザクションで可視です。

bdr.replication_set_remove_table

このファンクションは、レプリケーションセットからテーブルを削除します。

このコマンドのレプリケーションは、 DDLフィルタリング設定を含むDDLレプリケーション構成の影響を受けます。

概要

bdr.replication_set_remove_table(relation regclass,
                                 set_name name DEFAULT NULL)

パラメーター

  • relation -テーブルの名前またはOID

  • set_name -レプリケーションセットの名前。 NULL(デフォルト)の場合、 BDRグループのデフォルトのレプリケーションセットが使用されます

注意事項

このファンクションは、 DDL ステートメントと同じレプリケーションメカニズムを使用します。これは、レプリケーションが ddl filters 構成の影響を受けることを意味します。

このファンクションは DDL グローバルロックを取得します。

このファンクションはトランザクションです。効果はトランザクションで可視です。

レプリケーションセットのリスト

次のクエリーで既存のレプリケーションセットをリストできます。

SELECT set_name
FROM bdr.replication_sets;

このクエリーを使用して、特定のレプリケーションセット内のすべてのテーブルをリストできます。

SELECT nspname, relname
FROM bdr.tables
WHERE set_name = myrepset;

セクション 外部キーの動作 では、被参照参照が同じレプリケーションセットに含まれていないすべての外部キーをリストするクエリーをレポートします。

次のSQLを使用して、現在のノードがパブリッシュおよびサブスクライブするレプリケーションセットを表示します。

SELECT node_id,
       node_name,
       COALESCE(
               pub_repsets, pub_repsets
       ) AS pub_repsets,
       COALESCE(
               sub_repsets, sub_repsets
       ) AS sub_repsets
  FROM bdr.local_node_summary;

これにより、次のような出力が生成されます。

  node_id   | node_name |    pub_repsets     |   sub_repsets
- -----------+-----------+----------------------------------------
 1834550102 | s01db01   | {bdrglobal,bdrs01} | {bdrglobal,bdrs01}
(1 row)

クラスター内のすべてのノードに対して同じクエリーを実行し、すべてのノードに関連付けられているレプリケーションセットを同時に取得するには、次のクエリーを使用できます。

WITH node_repsets AS (
  SELECT jsonb_array_elements(
    bdr.run_on_all_nodes($$
        SELECT
          node_id,
          node_name,
          COALESCE(
                pub_repsets, pub_repsets
          ) AS pub_repsets,
          COALESCE(
                sub_repsets, sub_repsets
          ) AS sub_repsets
        FROM bdr.local_node_summary;
    $$)::jsonb
  ) AS j
)
SELECT j->response->command_tuples->0->>node_id AS node_id,
       j->response->command_tuples->0->>node_name AS node_name,
       j->response->command_tuples->0->>pub_repsets AS pub_repsets,
       j->response->command_tuples->0->>sub_repsets AS sub_repsets
FROM node_repsets;

これにより、例次のように表示されます。

  node_id   | node_name |    pub_repsets     |    sub_repsets
- -----------+-----------+----------------------------------------
 933864801  | s02db01   | {bdrglobal,bdrs02} | {bdrglobal,bdrs02}
 1834550102 | s01db01   | {bdrglobal,bdrs01} | {bdrglobal,bdrs01}
 3898940082 | s01db02   | {bdrglobal,bdrs01} | {bdrglobal,bdrs01}
 1102086297 | s02db02   | {bdrglobal,bdrs02} | {bdrglobal,bdrs02}
(4 rows)

DDLレプリケーションのフィルタリング

デフォルトでは、サポートされているすべてのDDLのレプリケーションは、デフォルトのBDRグループレプリケーションセットを介して発生します。これは、 BDRグループと同じ名前のDDLフィルタが存在することによって実現されます。BDRグループは、 BDRグループの作成時にデフォルトのBDRグループレプリケーションセットに追加されます。

上記は、既存のすべてのレプリケーションセットのDDLレプリケーションフィルターを変更することで調整できます。これらのフィルターは、レプリケーションセットのテーブルメンバーシップとは無関係です。データの変更と同様に、各DDLステートメントは、マルチプルのレプリケーションセットのマルチプルのフィルターに一致するかどうかに関係なく、一度だけ複製されます。

次のクエリーを使用して、既存のDDLフィルタをリストできます。フィルタごとに、コマンドタグとロール名前に適用される正規表現を表示します。

SELECT * FROM bdr.ddl_replication;

次の関数を使用して、 DDLフィルターを操作できます。これらはDDL と見なされるため、 DDLレプリケーションとグローバルロックのサブジェクトになることに注意してください。

bdr.replication_set_add_ddl_filter

このファンクションは、 DDLフィルタをレプリケーションセットに追加します。

指定されたフィルターに一致するDDLは、そのセットにサブスクライブされているノードに複製されます。これは、 BDR管理機能のレプリケーションにも影響します。

これは任意のノードでのDDLの実行を妨げるものではないことに注意してくださいDDLが他のノードにレプリケートされるかどうかのみが変更されます。したがって、2つのノード間にすべてのインデックスコマンドを除外するレプリケーションフィルターがある場合でも、各ノードに直接接続し、そのノードで目的のDDLを実行することにより、インデックスコマンドを自由に実行できます。

DDLフィルターは command_tag および role_name を指定して、一部のDDLステートメントのみのレプリケーションを許可できます。 command_tag は、通常のPostgreSQLコマンドの EVENT TRIGGERs で使用されるものと同じです。典型的な例は、ロジカルスタンバイでの追加のインデックスコマンドが他のすべてのノードにレプリケートされないようにするフィルターを作成することです。

使用するBDR管理機能は、修飾ファンクション名前とマッチングするタグ名を使用してフィルタリングできます(例、 bdr.replication_set_add_table は同じ名前のファンクションのコマンドタグになります)。例、これにより、すべてのBDR機能をbdr.* を使用してフィルタリングできます。

role_name は、コマンドを実行している現在のロールとのマッチングに使用されます。 command_tag とrole_name はどちらも大文字と小文字を区別する正規表現として評価されます。

概要

bdr.replication_set_add_ddl_filter(set_name name,
                                   ddl_filter_name text,
                                   command_tag text,
                                   role_name text DEFAULT NULL)

パラメーター

  • set_name -レプリケーションセットの名前。 NULLの場合、 BDRグループのデフォルトのレプリケーションセットが使用されます

  • ddl_filter_name - DDLフィルターの名前。これはBDRグループ全体で一意である必要があります

  • command_tag -コマンドタグをマッチングさせるための正規表現。 NULLはすべてにマッチすることを意味します

  • role_name -ロール名前をマッチングさせるための正規表現。 NULLはすべてのロールにマッチすることを意味します

注意事項

このファンクションは、 DDL ステートメントと同じレプリケーションメカニズムを使用します。これは、レプリケーションが ddl filters 構成の影響を受けることを意味します。ノート-これは、ddlフィルター構成への変更のレプリケーションが既存のddlフィルター構成の影響を受けることを意味します。

このファンクションは DDL グローバルロックを取得します。

このファンクションはトランザクションです。効果はトランザクションの ROLLBACK でロールバックでき、変更は現在のトランザクションで可視です。

定義されているレプリケーションフィルターをビューするには、ビューbdr.ddl_replication を使用します。

例

BDR管理機能のみを含めるには、次のようなフィルタを定義します。

SELECT bdr.replication_set_add_ddl_filter(mygroup, mygroup_admin, $$bdr\..*$$);

インデックスDDL以外をすべて除外するには:

SELECT bdr.replication_set_add_ddl_filter(mygroup, index_filter,
                ^(?!(CREATE INDEX|DROP INDEX|ALTER INDEX)).*);

テーブルとインデックスに対するすべてのオペレーションを含め、他のすべてのオペレーションを除外するには、テーブル用とインデックス用の 2 つのフィルターを追加します。これは、マルチプルのフィルターが許可されたすべてのDDLコマンドのユニオンを提供することを示しています。

SELECT bdr.replication_set_add_ddl_filter(bdrgroup,index_filter, ^((?!INDEX).)*$);
SELECT bdr.replication_set_add_ddl_filter(bdrgroup,table_filter, ^((?!TABLE).)*$);

bdr.replication_set_remove_ddl_filter

このファンクションは、レプリケーションセットからDDLフィルタを削除します。

このコマンドのレプリケーションは、 DDLフィルタリング設定自分自身を含む、 DDLレプリケーション構成の影響を受けます。

概要

bdr.replication_set_remove_ddl_filter(set_name name,
                                      ddl_filter_name text)

パラメーター

  • set_name -レプリケーションセットの名前。 NULLの場合、 BDRグループのデフォルトのレプリケーションセットが使用されます

  • ddl_filter_name - 削除するDDLフィルターの名前

注意事項

このファンクションは、 DDL ステートメントと同じレプリケーションメカニズムを使用します。これは、レプリケーションが ddl filters 構成の影響を受けることを意味します。これは、 DDLフィルター構成への変更のレプリケーションが既存のDDLフィルター構成の影響を受けることを意味することにノートしてください。

このファンクションは DDL グローバルロックを取得します。

このファンクションはトランザクションです。効果はトランザクションの ROLLBACK でロールバックでき、変更は現在のトランザクションで可視です。