IBM Cloud Docs
論理レプリケーションの宛先としての Databases for PostgreSQL

論理レプリケーションの宛先としての 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

以下の事項を前提条件として考慮してください

  1. 外部(パブリッシャー)を設定する PostgreSQL wal_level=logical
  2. レプリケーション対象として選択されたテーブルにはすべて 、主キー が含まれているか、設定されている必要があります。 REPLICA IDENTITY 設定されている必要があります。
  3. お客様の外部(パブリッシャー) PostgreSQL は、 PostgreSQL 権限 REPLICATION を持つレプリケーションユーザーを持つ必要があります。また、そのユーザーは、レプリケーション権限に加えて、データベースに対するSELECT権限とUSAGE権限を持つ必要があります。
  4. 複製元の PostgreSQL は、 TLS/SSLを有効にする必要があります
  5. 行レベルセキュリティが有効になっている場合、外部(パブリッシャー) PostgreSQL レプリケーションユーザーに BYPASSRLS 権限を付与します。

PostgreSQL のドキュメントで説明されている論理レプリケーションには、固有の制限事項やいくつかの制約があります。 論理レプリケーションが貴社のユースケースに適切かどうかを判断する前に、これらの事項を確認してください。

サブスクライバーの構成

Databases for PostgreSQLデプロイメントを構成し、データが正しくレプリケートされるようにするには、以下を確認してください。

  1. 複製しようとしているデータベースと同じ名前のデータベースをデプロイメントに作成する必要があります。
  2. 論理レプリケーションは、表レベルで機能するため、公開するために選択したすべての表を、論理レプリケーションのプロセスを開始する前にサブスクライバーに作成する必要があります ( 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 をパブリッシャーとして設定するには、以下の手順を実行します。

  1. ローカルの pg_hba.conf を編集し、以下の内容を追加してください。

    hostssl    replication            replicator         0.0.0.0/0      md5
    hostssl    all                    replicator         0.0.0.0/0      md5
    

    「複製者」フィールドは、 PostgreSQL 権限 REPLICATION で設定したユーザーです。

  2. ローカルの postgresql.conf を、必要な 論理レプリケーション構成で編集します。 wal_level を「logical」に設定し、listen_addresses='*' を設定して、すべてのホストからの接続を受け入れます。

    listen_addresses='*'
    wal_level = logical
    
  3. PostgreSQL サーバーを再始動します。

これで、このデータベースにパブリッシャーを定義し、サブスクライバーに複製する表を追加できるようになりました。

  1. レプリケーション・ユーザーを使用して、公開するデータベースにログインします。

    psql -U replicator -d exampledb
    
  2. 公開チャネルを作成します。

    exampledb=> CREATE PUBLICATION my_publication;
    
  3. パブリッシャーに表を追加します。

    exampledb=> ALTER PUBLICATION my_publication ADD TABLE my_table;
    

    max_logical_replication_workers 設定パラメータで定義される同期をバックアップするワーカーの数は制限されており、変更することはできません。 したがって、出版物の数はできるだけ少なくし、1つの出版物にできるだけ多くの表を追加する。

サブスクライバーでの論理レプリケーションのセットアップ

サブスクライバとしてDatabases for PostgreSQL配置を構成するには、以下の手順を実行します。

  1. admin ユーザーを使用して、レプリケーション用に作成されたデータベースにログインします。

    psql -U admin -d exampledb
    
  2. 以下の照会を実行して、create_subscription 関数を呼び出して、サブスクライバー・チャネルを作成します。

    exampledb=> SELECT create_subscription('subs1','130.215.223.184','5432','admin','password','exampledb','my_publication');
    

複製のモニター

パブリッシャーとサブスクライバーのいずれかで以下の照会を実行することで、その両方から論理レプリケーションの状況をモニターすることができます。

exampledb=> SELECT * FROM pg_stat_replication;