このトピックでは、ApsaraDB RDS for PostgreSQL の論理サブスクリプション機能について説明します。この機能は、複数の ApsaraDB RDS for PostgreSQL インスタンス間で、準リアルタイムのテーブルレベルの一方向同期をサポートします。この機能は、データ共有、データ集約、データ分割などのビジネスシナリオに適しています。
機能の説明
複数のリージョンにビジネスを展開している場合、論理サブスクリプションを使用してこれらのリージョン間でデータを共有できます。たとえば、あるリージョンでビジネスを提供するデータセンターから他のリージョンにデータを共有できます。また、他のリージョンからデータセンターにデータを集約することもできます。これにより、すべてのビジネスデータをリアルタイムで分析およびクエリできます。
次の例は、論理サブスクリプションのプロセスを示しています。
パブリッシャーの RDS インスタンス上の testdb01 データベースにパブリケーションを作成し、public.t1 テーブルをパブリッシュします。
サブスクライバーの RDS インスタンス上の testdb02 データベースに sub1_from_pub1 という名前のサブスクリプションを作成し、public.t1 テーブルのデータをサブスクライブします。
詳細については、「論理サブスクリプションの原則とベストプラクティス」をご参照ください。
注意事項
単一の RDS インスタンス上の 2 つのテーブル間、または同じ VPC(Virtual Private Cloud)内にあり、内部エンドポイントを使用して接続できる 2 つの RDS インスタンス間で論理サブスクリプションを作成できます。
前提条件
RDS インスタンスは PostgreSQL 10 以降を実行し、クラウドディスクを使用していること。
RDS インスタンスの wal_level パラメーターが logical に設定されていること。このパラメーターは、ApsaraDB RDS コンソールの [パラメーター] ページで再構成できます。このパラメーターを再構成した後、新しい値を有効にするには RDS インスタンスを再起動する必要があります。RDS インスタンスを再起動すると、アプリケーションは RDS インスタンスから切断されます。業務継続性を確保するために、RDS インスタンスを再起動する前に適切な措置を講じることをお勧めします。
同じ VPC 内にある 2 つの RDS インスタンス間で論理サブスクリプションを作成する場合、VPC の CIDR ブロックが RDS インスタンスの IP アドレスホワイトリストに追加されていること。たとえば、172.16.0.0/16 を IP アドレスホワイトリストに追加できます。詳細については、「IP アドレスホワイトリストの設定」をご参照ください。
使用するアカウントに rds_superuser ロールの権限があること。アカウントは、RDS インスタンスの特権アカウントである可能性があります。また、特権アカウントと
CREATE ROLE xxx WITH SUPERUSER文を使用して作成した標準アカウントである可能性もあります。
手順
パブリッシャーにパブリケーションを作成する
パブリッシャーの RDS インスタンスに接続します。詳細については、「ApsaraDB RDS for PostgreSQL インスタンスへの接続」をご参照ください。
次の文を実行して、パブリッシャーのデータベースにパブリケーションを作成します。
CREATE PUBLICATION <パブリケーション名> FOR TABLE <テーブル名>;例
CREATE PUBLICATION pub1 FOR TABLE public.t1;説明永続ベーステーブルのみをパブリッシュできます。詳細については、「CREATE PUBLICATION」をご参照ください。
SELECT * FROM pg_publication;文を実行して、データベースの既存のパブリケーションを表示できます。
サブスクライバーにサブスクリプションを作成する
サブスクライバーの RDS インスタンスに接続します。詳細については、「ApsaraDB RDS for PostgreSQL インスタンスへの接続」をご参照ください。
サブスクライバーのデータベースにサブスクリプションを作成します。
パブリッシャーとサブスクライバーが同じ RDS インスタンス上の異なるデータベースである場合
パブリッシャーのデータベースに論理レプリケーションスロットを作成します。
SELECT pg_create_logical_replication_slot('<スロット名>', 'pgoutput');サブスクライバーのデータベースにテーブルを作成する必要があります。テーブルは、サブスクライブするパブリッシャーのデータベース内のテーブルと同じスキーマと名前を持つ必要があります。
サブスクライバーのデータベースに論理サブスクリプションを作成します。
RDS インスタンスで PostgreSQL 16 以降を実行している場合は、次の文を実行します。
CREATE SUBSCRIPTION <サブスクリプション名> CONNECTION 'host=127.0.0.1 port=<インターネットポート> user=<パブリケーション権限を持つアカウントのユーザー名> password=<アカウントのパスワード> dbname=<パブリッシャーのデータベース名>' PUBLICATION publication_name WITH (create_slot=false,slot_name=<スロット名>);RDS インスタンスで PostgreSQL 10 から PostgreSQL 15 までのバージョンを実行している場合は、次の文を実行します。
CREATE SUBSCRIPTION <サブスクリプション名> CONNECTION 'dbname=<パブリッシャーのデータベース名>' PUBLICATION publication_name WITH (create_slot=false,slot_name=<スロット名>);
重要パブリッシャーのデータベースとサブスクライバーのデータベースが同じ RDS インスタンス上にある場合、WITH 句を使用して
create_slot=falseサブスクリプション設定を追加する必要があります。パブリッシャーとサブスクライバーが異なる RDS インスタンス上の異なるデータベースである場合
サブスクライバーのデータベースにテーブルを作成する必要があります。テーブルは、サブスクライブするパブリッシャーのデータベース内のテーブルと同じスキーマと名前を持つ必要があります。
サブスクライバーのデータベースに論理サブスクリプションを作成します。
CREATE SUBSCRIPTION <サブスクリプション名> CONNECTION 'host=<パブリッシャーの RDS インスタンスのインターネットエンドポイント> port=<パブリッシャーの RDS インスタンスのインターネットポート> user=<パブリッシャーの RDS インスタンス上のパブリケーション権限を持つアカウントのユーザー名> password=<アカウントのパスワード> dbname=<パブリッシャーの RDS インスタンス上のデータベース名>' PUBLICATION <パブリッシャーのデータベースのパブリケーション名>;
例:
CREATE SUBSCRIPTION sub1_from_pub1 CONNECTION 'host=pgm-2ze7n9zb0n1f****.pg.rds.aliyuncs.comm port=5432 user=testdbuser password=****x dbname=testdb01' PUBLICATION pub1 WITH (enabled, create_slot, slot_name='sub1_from_pub1');説明SELECT * FROM pg_subscription;文を実行して、データベースシステム全体のサブスクリプションを表示できます。WITH句を使用して、パブリッシャーのデータベースのパブリケーション名にサブスクリプションパラメーターを追加できます。詳細については、「CREATE SUBSCRIPTION」をご参照ください。