Aurora PostgreSQL DB クラスターに論理レプリケーションを設定する - Amazon Aurora

Aurora PostgreSQL DB クラスターに論理レプリケーションを設定する

以下の手順では、2 つの Aurora PostgreSQL DB クラスター間で論理レプリケーションを開始する方法を示しています。これらのステップでは、ソース (パブリッシャー) とターゲット (サブスクライバー) の両方に、pglogical 拡張のセットアップ で説明されているように pglogical 拡張が設定されていることを前提としています。

パブリッシャーノードを作成し、複製するテーブルを定義するには

これらのステップは、別のノードに複製する 1 つ以上のテーブルがあるデータベースを含むライターインスタンスが Aurora PostgreSQL DB クラスターにあることを前提としています。サブスクライバー上のパブリッシャーからテーブル構造を再作成する必要があるため、まず必要に応じてテーブル構造を取得します。そのためには、psq1 メタコマンド \d tablename を使用してサブスクライバーインスタンスに同じテーブルを作成します。次の手順では、デモンストレーションを目的として、パブリッシャー (ソース) でサンプルテーブルを作成します。

  1. psql を使用して、サブスクライバーのソースとして使用したいテーブルがあるインスタンスに接続します。

    psql --host=source-instance.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb

    複製する既存のテーブルがない場合は、次のようにサンプルテーブルを作成できます。

    1. 次の SQL ステートメントを使用してサンプルテーブルを作成します。

      CREATE TABLE docs_lab_table (a int PRIMARY KEY);
    2. 次の SQL ステートメントを使用して、生成されたデータをテーブルに入力します。

      INSERT INTO docs_lab_table VALUES (generate_series(1,5000)); INSERT 0 5000
    3. 次の SQL ステートメントを使用して、テーブルにデータが存在することを確認します。

      SELECT count(*) FROM docs_lab_table;
  2. 次のように、この Aurora PostgreSQL DB クラスターをパブリッシャーノードとして指定します。

    SELECT pglogical.create_node( node_name := 'docs_lab_provider', dsn := 'host=source-instance.aws-region.rds.amazonaws.com port=5432 dbname=labdb'); create_node ------------- 3410995529 (1 row)
  3. 複製するテーブルをデフォルトのレプリケーションセットに追加します。レプリケーションセットの詳細については、pglogical ドキュメントの「Replication sets」(レプリケーションセット) を参照してください。

    SELECT pglogical.replication_set_add_table('default', 'docs_lab_table', 'true', NULL, NULL); replication_set_add_table --------------------------- t (1 row)

パブリッシャーノードの設定が完了しました。これで、パブリッシャーから更新を受け取るようにサブスクライバーノードを設定できます。

サブスクライバーノードを設定し、更新を受信するサブスクリプションを作成するには

これらのステップは、Aurora PostgreSQL DB クラスターpglogical 拡張機能を使用してセットアップされていることを前提としています。詳細については、「pglogical 拡張のセットアップ」を参照してください。

  1. psql を使用して、パブリッシャーから更新を受け取るインスタンスに接続します。

    psql --host=target-instance.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. サブスクライバーの Aurora PostgreSQL DB クラスターで、パブリッシャーに存在するのと同じテーブルを作成します。この例では、テーブルは docs_lab_table です。次に示すようにテーブルを作成できます。

    CREATE TABLE docs_lab_table (a int PRIMARY KEY);
  3. このテーブルが空であることを確認します。

    SELECT count(*) FROM docs_lab_table; count ------- 0 (1 row)
  4. 次のように、この Aurora PostgreSQL DB クラスターをサブスクライバーノードとして指定します。

    SELECT pglogical.create_node( node_name := 'docs_lab_target', dsn := 'host=target-instance.aws-region.rds.amazonaws.com port=5432 sslmode=require dbname=labdb user=postgres password=********'); create_node ------------- 2182738256 (1 row)
  5. サブスクリプションを作成します。

    SELECT pglogical.create_subscription( subscription_name := 'docs_lab_subscription', provider_dsn := 'host=source-instance.aws-region.rds.amazonaws.com port=5432 sslmode=require dbname=labdb user=postgres password=*******', replication_sets := ARRAY['default'], synchronize_data := true, forward_origins := '{}' ); create_subscription --------------------- 1038357190 (1 row)

    このステップを完了すると、パブリッシャーのテーブルのデータが、サブスクライバーのテーブルに作成されます。このことを確認するには、次の SQL クエリを使用します。

    SELECT count(*) FROM docs_lab_table; count ------- 5000 (1 row)

これ以降、パブリッシャーのテーブルに加えられた変更は、サブスクライバーのテーブルにレプリケートされます。