論理レプリケーションの宛先としての Databases for PostgreSQL
IBM Cloud® Databases for PostgreSQL 論理レプリケーションをサポートしており、サブスクライバーまたはパブリッシャーを作成できます。 また、外部の PostgreSQL をパブリッシャーとして、 Databases for PostgreSQL のデプロイをサブスクライバーとして設定し、外部データベースからデプロイにデータを複製することもできます。
論理レプリケーションは、PostgreSQL 10 以上を実行しているデプロイメントでのみ使用可能です。 PostgreSQL のドキュメントへのリンクは、 PostgreSQL の最新バージョンに直接つながっています。 特定のバージョンのドキュメントが必要な場合は、 PostgreSQL のドキュメントページに、異なる PostgreSQL バージョンのリンクが掲載されています。
パブリッシャーの構成
外部 PostgreSQL インスタンスはパブリッシャーであり、Databases for PostgreSQL のデプロイメントが接続して正しくデータをプルできるように構成する必要があります。
出版社機能
create_publisher
各データベースでは、変更を別のサブスクライバーに公開するために、複数のパブリケーションを作成することができます。
Arguments:
publisher_name The Unique name of publisher.
for table To publish single/list of tables
for all table To publish all tables, along with future tables.
for all tables in schema To publish all tables in schema, along wth future tables.
Usage:
exampledb=> create publication my_publication for all tables ;
CREATE PUBLICATION
list_publisher
各データベースで実行中のパブリケーションの数を列挙する。
Usage:
exampledb=# select * from pg_publication;
oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate
-------+----------------+----------+--------------+-----------+-----------+-----------+-------------
16401 | my_publication | 10 | t | t | t | t | t
alter_publisher
出版物の定義を変更する。
Syntax:
ALTER PUBLICATION name ADD publication_object [, ...]
ALTER PUBLICATION name SET publication_object [, ...]
ALTER PUBLICATION name DROP publication_object [, ...]
ALTER PUBLICATION name SET ( publication_parameter [= value] [, ... ] )
ALTER PUBLICATION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER PUBLICATION name RENAME TO new_name
Usage:
exampledb=# ALTER PUBLICATION my_publication RENAME TO my_publication_new;
ALTER PUBLICATION
drop_publisher
使用していないパブリケーションは取り外します。
Usage:
exampledb=# drop publication my_publication_new;
DROP PUBLICATION
以下の事項を前提条件として考慮してください
- 外部(パブリッシャー)を設定する PostgreSQL
wal_level=logical
。 - レプリケーション対象として選択されたテーブルにはすべて 、主キー が含まれているか、設定されている必要があります。
REPLICA IDENTITY
設定されている必要があります。 - お客様の外部(パブリッシャー) PostgreSQL は、 PostgreSQL 権限
REPLICATION
を持つレプリケーションユーザーを持つ必要があります。また、そのユーザーは、レプリケーション権限に加えて、データベースに対するSELECT権限とUSAGE権限を持つ必要があります。 - 複製元の PostgreSQL は、 TLS/SSLを有効にする必要があります。
- 行レベルセキュリティが有効になっている場合、外部(パブリッシャー) PostgreSQL レプリケーションユーザーに BYPASSRLS 権限を付与します。
PostgreSQL のドキュメントで説明されている論理レプリケーションには、固有の制限事項やいくつかの制約があります。 論理レプリケーションが貴社のユースケースに適切かどうかを判断する前に、これらの事項を確認してください。
サブスクライバーの構成
Databases for PostgreSQLデプロイメントを構成し、データが正しくレプリケートされるようにするには、以下を確認してください。
- 複製しようとしているデータベースと同じ名前のデータベースをデプロイメントに作成する必要があります。
- 論理レプリケーションは、表レベルで機能するため、公開するために選択したすべての表を、論理レプリケーションのプロセスを開始する前にサブスクライバーに作成する必要があります (
pg_dump
お手伝いします。) サブスクライバーの表は、そのパブリッシャーの対応する表と同じである必要はありません。 ただし、サブスクライバーの表には、少なくともパブリッシャーの表に存在するすべての列が含まれている必要があります。 サブスクライバーに存在する追加の列は、NOT NULL または他の制約を持つことはできません。 持つ場合、レプリケーションは失敗します。
PostgreSQL のネイティブサブスクリプションコマンドはスーパーユーザー権限を必要としますが、 Databases for PostgreSQL の展開では利用できません。 代わりに、デプロイメントには、サブスクリプションの論理レプリケーションを設定および管理するために使用できる関数のセットが含まれています。
Databases for PostgreSQL によって提供される admin ユーザーのみが、外部 PostgreSQL パブリッシャーからのコンテンツのサブスクライブおよび複製を許可する以下のレプリケーション・コマンドを実行する許可を持っています。
サブスクライバーの関数
create_subscription
Arguments:
subscription_name Unique name to create the subscription channel with
host_ip Publisher hostname or public IP address
port Port number publisher is running on
username `admin` user created on the publisher
password Password of the `admin` user on the publisher
db_name The name of the database to be replicated
publisher_name The name of publisher channel on the publisher
Usage:
exampledb=> SELECT create_subscription('subs1','130.215.223.184','5432','password','admin','exampledb','my_publication');
delete_subscription
Arguments:
subscription_name Name the subscription channel to delete
db_name The name of the replicated database
Usage:
exampledb=> SELECT delete_subscription('subs1', 'exampledb');
list_subscriptions
Arguments:
None
Usage:
exampledb=> SELECT * FROM list_subscriptions();
disable_subscription
Arguments:
subscription_name Name the subscription channel to disable
db_name The name of the replicated database
Usage:
exampledb=> SELECT disable_subscription('subs1','exampledb');
enable_subscription
Arguments:
subscription_name Name the subscription channel to enable
db_name The name of the replicated database
Usage:
exampledb=> SELECT enable_subscription('subs1','exampledb');
subscription_slot_none
この関数は、サブスクリプションのスロット名をNONEに設定するために使用される。 これは、サブスクリプションを削除して、リモートレプリケーションスロットがドロップされないようにするか、存在しないか、存在したことがないようにするために必要である。
Arguments:
subscription_name Name the subscription channel to alter
db_name The name of the replicated database
Usage:
exampledb=> SELECT subscription_slot_none('subs1','exampledb');
refresh_subscription
この関数は、パブリッシャーで表の追加や削除などの変更が行われた後で、サブスクライバーのサブスクリプションをリフレッシュするために使用されます。
Arguments:
subscription_name Name the subscription channel to refresh
db_name The name of the replicated database
Usage:
exampledb=> SELECT refresh_subscription('subs1','exampledb');
パブリッシャーでの論理レプリケーションのセットアップ
外部の PostgreSQL をパブリッシャーとして設定するには、以下の手順を実行します。
-
ローカルの
pg_hba.conf
を編集し、以下の内容を追加してください。hostssl replication replicator 0.0.0.0/0 md5 hostssl all replicator 0.0.0.0/0 md5
「複製者」フィールドは、 PostgreSQL 権限
REPLICATION
で設定したユーザーです。 -
ローカルの
postgresql.conf
を、必要な 論理レプリケーション構成で編集します。wal_level
を「logical」に設定し、listen_addresses='*'
を設定して、すべてのホストからの接続を受け入れます。listen_addresses='*' wal_level = logical
-
PostgreSQL サーバーを再始動します。
これで、このデータベースにパブリッシャーを定義し、サブスクライバーに複製する表を追加できるようになりました。
-
レプリケーション・ユーザーを使用して、公開するデータベースにログインします。
psql -U replicator -d exampledb
-
公開チャネルを作成します。
exampledb=> CREATE PUBLICATION my_publication;
-
パブリッシャーに表を追加します。
exampledb=> ALTER PUBLICATION my_publication ADD TABLE my_table;
max_logical_replication_workers
設定パラメータで定義される同期をバックアップするワーカーの数は制限されており、変更することはできません。 したがって、出版物の数はできるだけ少なくし、1つの出版物にできるだけ多くの表を追加する。
サブスクライバーでの論理レプリケーションのセットアップ
サブスクライバとしてDatabases for PostgreSQL配置を構成するには、以下の手順を実行します。
-
admin
ユーザーを使用して、レプリケーション用に作成されたデータベースにログインします。psql -U admin -d exampledb
-
以下の照会を実行して、
create_subscription
関数を呼び出して、サブスクライバー・チャネルを作成します。exampledb=> SELECT create_subscription('subs1','130.215.223.184','5432','admin','password','exampledb','my_publication');
複製のモニター
パブリッシャーとサブスクライバーのいずれかで以下の照会を実行することで、その両方から論理レプリケーションの状況をモニターすることができます。
exampledb=> SELECT * FROM pg_stat_replication;