レプリケーションテーブルは、すべてのデータノードで複製される表のことで、データノード間で共通のデータが複製されます。データノード間で参照する共通なデータをレプリケーションテーブルとして定義することで、共通なデータを扱いたい場合でもシャードに閉じた業務を実現できます。
レプリケーションテーブルは、以下の2種類のテーブルによって構成されます。
originalテーブル:中央管理ノードに実体を持つテーブルです。複製元となるデータを格納します。
replicatedテーブル:データノードに実体を持つテーブルです。論理レプリケーションによってoriginalテーブルと同期します。
レプリケーションテーブルは、全ノードに対するオブジェクトとして登録されます。
レプリケーションテーブルの更新は、originalテーブルに対してのみ可能です。replicatedテーブルを直接更新することはできません。
レプリケーションテーブルを利用するためには、レプリケーションオブジェクトを定義する必要があります。レプリケーションオブジェクトとは、originalテーブルとreplicatedテーブルとの間の論理レプリケーションを実行するためのオブジェクトです。レプリケーションオブジェクトは以下の3種類のオブジェクトによって構成されます。
パブリケーション:originalテーブルをレプリケーション対象として管理するオブジェクト
レプリケーションスロット:データノードへのWALの反映状況を管理するオブジェクト
サブスクリプション:パブリケーションからoriginalテーブルの更新情報を受け取り、replicatedテーブルに反映するオブジェクト
パブリケーションとレプリケーションスロットは中央管理ノードに、サブスクリプションはデータノードに定義されます。それぞれデータベース単位で定義することができます。
パブリケーションとレプリケーションスロットに関しては、データノードの数だけ定義され、それぞれ特定のデータノードと通信することでレプリケーションを実行します。それにより、特定のデータノードに対してのみレプリケーションを停止するなど、シーンに合わせて利用することができます。
レプリケーションテーブルは、同期・非同期レプリケーションの両方に対応しているので、業務に応じてどちらかを選択してください。設定方法は、“5.2.4 レプリケーションテーブルの同期方法”を参照してください。デフォルトでは非同期レプリケーションが設定されます。
以下にレプリケーションテーブルの利用イメージを示します。
オブジェクト | 操作に利用するSQL、関数 |
---|---|
original table, replicated table | CREATE REPLICATION TABLE, ALTER REPLICATION TABLE pgx_add_replication_object(内部的に呼び出される) pgx_attach_replication_table, pgx_detach_replication_table |
レプリケーションオブジェクト | pgx_create_replication_object, pgx_alter_replication_object pgx_drop_replication_object |
以下にレプリケーションテーブルの基本的な利用例を示します。赤枠の操作はスーパーユーザーが実行する必要があります。
また、以下は、各ノードでユーザーマッピングしているすべてのユーザー名が同一である場合の例です。各ノードにマッピングされているユーザー名が異なる場合は、各ノードにマッピングされているユーザーに権限を与える、または権限を取り消す必要があります。
レプリケーションテーブルが存在するデータベースをテンプレートとしてデータベースを作成する場合やレプリケーションテーブルが存在するデータベースを削除したい場合は、事前に対応するレプリケーションオブジェクトやレプリケーションテーブルを削除してください。論理レプリケーションの接続が存在する場合には上記の処理を実行することができないためです。