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