Aurora での PostgreSQL 論理的なレプリケーションの使用 - Amazon Aurora

Aurora での PostgreSQL 論理的なレプリケーションの使用

PostgreSQL 論理的なレプリケーションは、データベースの各部分のレプリケーションと同期を詳細に制御します。例えば、論理的なレプリケーションを使用してデータベースの個別のテーブルをレプリケートできます。

PostgreSQL 論理的なレプリケーションと Amazon Aurora を使用する方法について以下に説明します。PostgreSQL 論理的なレプリケーションの実装の詳細については、PostgreSQL ドキュメントの 「論理的なレプリケーション」と「ロジカルデコーディングのコンセプト」を参照してください。

注記

論理的なレプリケーションは、Aurora PostgreSQL バージョン 2.2.0 (PostgreSQL 10.6 と互換) 以降で利用できます。

PostgreSQL 論理的なレプリケーションと Amazon Aurora を使用する方法について以下に説明します。

論理的なレプリケーションの設定

論理的なレプリケーションを使用するには、まず、クラスターパラメータグループの rds.logical_replication パラメータを設定します。次に、パブリッシャーとサブスクライバーを設定します。

論理的なレプリケーションは、発行およびサブスクライブモデルを使用します。パブリッシャーサブスクライバーはノードです。パブリケーションは、1 つ以上のデータベーステーブルから生成される変更のセットです。パブリッシャーのパブリケーションを指定します。サブスクリプションは、別のデータベースへの接続と、サブスクライブする 1 つ以上のパブリケーションを定義します。サブスクライバーのサブスクリプションを指定します。パブリケーションとサブスクリプションは、パブリッシャーとサブスクライバーの間の接続を作成します。

注記

論理的なレプリケーションの要件は次のとおりです。

  • PostgreSQL データベースの論理的なレプリケーションを実行するために、AWS ユーザーアカウントは rds_superuser ロールを必要とします。

  • 出典として使用する PostgreSQL の RDS DB インスタンスでは、自動バックアップを有効にする必要があります。PostgreSQL の RDS DB インスタンスの自動バックアップを有効にする方法については、Amazon RDS ユーザーガイド自動バックアップの有効化を参照してください。

Aurora での PostgreSQL 論理的なレプリケーションを有効にするには

  1. 論理的なレプリケーションで使用する新しい DB クラスターパラメータグループを作成します。詳細については、「DB クラスターのパラメータグループの作成」を参照してください。以下の設定を使用します。

    • パラメータグループファミリ」 には、aurora-postgresql12 のように Aurora PostgreSQL のバージョンを選択します。

    • タイプ」 には、「DB クラスターパラメータグループ」 を選択します。

  2. DB クラスターパラメータグループのパラメータの変更」で述べられているように、クラスターパラメータグループを変更します。rds.logical_replication 静的パラメータを 1 に設定します。

    rds.logical_replication パラメータを有効にすると、DB クラスターのパフォーマンスに影響します。

  3. max_replication_slotsmax_wal_sendersmax_logical_replication_workers、および max_worker_processes DB クラスターパラメータグループのパラメータを想定使用量に基づいて確認します。必要に応じて、DB クラスターパラメータグループを修正し、これらのパラメータの設定を変更します (DB クラスターパラメータグループのパラメータの変更参照)。

    次のガイドラインに従ってパラメータを設定します。

    • max_replication_slotsmax_replication_slots作成する予定の論理的なレプリケーションパブリケーションとサブスクリプションの合計数が少なくとも同数であることを確認してください。AWS DMS を使用している場合は、max_replication_slots が、この DB クラスターからの変更データのキャプチャーに使用する予定の AWS DMS タスクの数に加えて、論理的なレプリケーションのパブリケーションとサブスクリプションの数と少なくとも同じであることを確認してください。

    • max_wal_senders および max_logical_replication_workers - max_wal_senders および max_logical_replication_workers がそれぞれ、アクティブにする予定の論理的なレプリケーションスロットの数、または変更データキャプチャ用のアクティブな AWS DMS タスクの数と少なくとも同じ高さに設定されていることを確認します。論理的なレプリケーションスロットを非アクティブのままにしてくと、バキュームがテーブルから旧型のタプルを削除できないため、非アクティブなレプリケーションスロットを長時間保持することはお勧めしません。

    • max_worker_processesmax_worker_processesが少なくともmax_logical_replication_workersautovacuum_max_workers、 およびmax_parallel_workersの結合値と同じであることを確認してください。バックグラウンドワーカープロセスの数が多いと、小規模な DB インスタンスクラスのアプリケーションのワークロードに影響を与える可能性があるので、max_worker_processesデフォルト値よりも高い値を設定する場合はデータベースのパフォーマンスをモニタリングしてください。

論理的なレプリケーションのパブリッシャーを設定するには

  1. パブリッシャーのクラスターパラメータグループを次のように設定します:

    • パブリッシャーの既存の Aurora PostgreSQL DB クラスターを使用するには、エンジンバージョンが 10.6 以降であることが必要です。以下を実行してください。

      1. クラスターパラメータグループを変更し、これを論理的なレプリケーションを有効にしたときに作成したグループに設定します。Aurora PostgreSQL DB クラスターの変更の詳細については、「Amazon Aurora DB クラスターの変更」を参照してください。

      2. 静的パラメータの変更を反映するために DB クラスターを再起動します。DB クラスターパラメータグループに、静的パラメータ rds.logical_replication への変更が含まれます。

    • パブリッシャーの新しい Aurora PostgreSQL DB クラスターを使用するには、以下の設定を使用して DB クラスターを作成します。Aurora PostgreSQL DB クラスターの作成の詳細については、「DB クラスターの作成」を参照してください。

      1. Amazon Aurora」 エンジンを選択し、「PostgreSQL 互換」 エディションを選択します。

      2. Engine version」 (エンジンバージョン)については、PostgreSQL 10.6 以上との互換性がある Aurora PostgreSQL エンジンを選択します。

      3. DB クラスターのパラメータグループ]」で、論理的なレプリケーションを有効にしたときに作成したグループを選択します。

  2. パブリッシャーのセキュリティグループの着信ルールを変更し、サブスクライバーが接続することを許可します。通常、これを行うには、サブスクライバーの IP アドレスをセキュリティグループに含めます。セキュリティグループの変更の詳細については、Amazon Virtual Private Cloud ユーザーガイドの「VPC のセキュリティグループ」を参照してください。

データベーステーブルの論理的なレプリケーションの例

論理的なレプリケーションを実装するには、PostgreSQL の CREATE PUBLICATION コマンドと CREATE SUBSCRIPTION コマンドを使用します。

次の例では、テーブルデータが Aurora PostgreSQL データベース (パブリッシャー) から PostgreSQL データベース (サブスクライバー) にレプリケートされます。サブスクライバーデータベースとして、RDS PostgreSQL データベースまたは Aurora PostgreSQL データベースを指定できます。PostgreSQL 論理的なレプリケーションを使用するアプリケーションをサブスクライバーとして指定することもできます。論理的なレプリケーション機構を設定すると、パブリッシャーで発生した変更は継続的にサブスクライバーに送信されます。

この例の論理的なレプリケーションを設定するには、以下の操作を行います。

  1. Aurora PostgreSQL DB クラスターをパブリッシャーとして設定します。これを行うには、「論理的なレプリケーションの設定」でパブリッシャーの設定時に説明した方法に従って、新しい Aurora PostgreSQL DB クラスターを作成します。

  2. パブリッシャーデータベースを設定します。

    例えば、パブリッシャーデータベースで次の SQL ステートメントを使用してテーブルを作成します。

    CREATE TABLE LogicalReplicationTest (a int PRIMARY KEY);
  3. 次の SQL ステートメントを使用して、パブリッシャーデータベース内にデータを挿入します。

    INSERT INTO LogicalReplicationTest VALUES (generate_series(1,10000));
  4. 次の SQL ステートメントを使用して、パブリッシャーでパブリケーションを作成します。

    CREATE PUBLICATION testpub FOR TABLE LogicalReplicationTest;
  5. サブスクライバーを作成します。サブスクライバーデータベースは、次のいずれかになります。

    • Aurora PostgreSQL データベースバージョン 2.2.0 (PostgreSQL 10.6 と互換) 以降。

    • Amazon RDS for PostgreSQL データベース (PostgreSQL DB エンジンバージョン 10.4 以降を搭載)。

    この例では、サブスクライバーとして Amazon RDS for PostgreSQL データベースを作成します。DB インスタンスの作成の詳細については、Amazon RDS ユーザーガイドの「DB インスタンスの作成」を参照してください。

  6. サブスクライバーデータベースを設定します。

    この例では、次の SQL ステートメントを使用してパブリッシャーで作成したものと似たようなテーブルを作成します。

    CREATE TABLE LogicalReplicationTest (a int PRIMARY KEY);
  7. パブリッシャーのテーブルにはデータがあり、サブスクライバーにはまだデータがないことを、次の SQL ステートメントを両方のデータベースで使用して確認します。

    SELECT count(*) FROM LogicalReplicationTest;
  8. サブスクライバーでサブスクリプションを作成します。

    次の SQL ステートメントをサブスクライバーデータベースで使用します。また、パブリッシャークラスターの以下の設定を使用します。

    • ホスト - パブリッシャークラスターの書き込み DB インスタンス。

    • ポート - 書き込み DB インスタンスがリッスンするポート。PostgreSQL のデフォルト値は 5432 です。

    • dbname - パブリッシャークラスターの DB 名。

    CREATE SUBSCRIPTION testsub CONNECTION 'host=publisher-cluster-writer-endpoint port=5432 dbname=db-name user=user password=password' PUBLICATION testpub;

    サブスクリプションを作成すると、論理的なレプリケーションスロットがパブリッシャーで作成されます。

  9. この例で、初期のデータがサブスクライバーにレプリケートされていることを確認するには、サブスクライバーデータベースで次の SQL ステートメントを使用します。

    SELECT count(*) FROM LogicalReplicationTest;

パブリッシャーの以降のすべての変更がサブスクライバーにレプリケートされます。

AWS Database Migration Service を使用した論理的なレプリケーション

AWS Database Migration Service 「AWS DMS」 を使用してデータベースまたはその一部をレプリケートできます。AWS DMS を使用して、Aurora PostgreSQL データベースから、別のオープンソースデータベースまたは商用データベースにデータを移行させます。AWS DMS の詳細については、『AWS Database Migration Service ユーザーガイド』を参照してください。

次の例では、Aurora PostgreSQL データベースからの (パブリッシャーとしての) 論理的なレプリケーションを設定し、次に移行のために AWS DMS を使用する方法を示します。この例では、「データベーステーブルの論理的なレプリケーションの例」で作成したのと同じパブリッシャーおよびサブスクライバーを使用しています。

AWS DMS で論理的なレプリケーションを設定するには、Amazon RDS のパブリッシャーとサブスクライバーに関する詳細が必要です。特に、パブリッシャーの書き込み DB インスタンスとサブスクライバーの DB インスタンスに関する詳細が必要です。

パブリッシャーの書き込み DB インスタンスについては以下の情報を取得します。

  • 仮想プライベートクラウド (VPC) の識別子

  • サブネットグループ

  • アベイラビリティーゾーン (AZ)

  • VPC セキュリティグループ

  • DB インスタンス ID

サブスクライバーの DB インスタンスについては以下の情報を取得します。

  • DB インスタンス ID

  • 出典エンジン

Aurora PostgreSQL での論理的なレプリケーションに AWS DMS を使用するには

  1. AWS DMS を使用するようにパブリッシャーデータベースを準備します。

    これを行うには、PostgreSQL 10.x 以降のデータベースで、AWS DMS ラッパー関数をパブリッシャーデータベースに適用する必要があります。このステップと以降のステップの詳細については、AWS Database Migration Service ユーザーガイドの「AWS DMS の出典として PostgreSQL バージョン 10.x 以降を使用する」を参照してください。

  2. AWS Management Console にサインインして、AWS DMS で https://console.aws.amazon.com/dms/v2 コンソールを開きます。右上で、パブリッシャーとサブスクライバーがある同じ AWS リージョンを選択します。

  3. AWS DMS レプリケーションインスタンスを作成します。

    パブリッシャーの書き込み DB インスタンスと同じ値を選択します。これらには、以下の設定が含まれます。

    • VPC」 で、書き込み DB インスタンスと同じ VPC を選択します。

    • Replication Subnet Group (レプリケーションのサブネットグループ)」 で、書き込み DB インスタンスと同じ値のサブネットグループを選択します。必要に応じて新規に作成してください。

    • アベイラビリティーゾーン」 で、書き込み DB インスタンスと同じゾーンを選択します。

    • VPC セキュリティグループ」 で、書き込み DB インスタンスと同じグループを選択します。

  4. 出典の AWS DMS エンドポイントを作成します。

    次の設定を使用して、パブリッシャーを出典エンドポイントとして指定します。

    • Endpoint type (エンドポイントタイプ)」 で 「Source endpoint (出典エンドポイント)」を選択します。

    • Select RDS DB Instance (RDS DB インスタンスの選択)」 を選択します。

    • RDS Instance (RDS インスタンス)」で、パブリッシャーの書き込み DB インスタンスの DB 識別子を選択します。

    • Source engine (出典エンジン)」 で 「postgres」 を選択します。

  5. ターゲットの AWS DMS エンドポイントを作成します。

    次の設定を使用して、サブスクライバーをターゲットエンドポイントとして指定します。

    • Endpoint type (エンドポイントタイプ)」 で 「Target endpoint (ターゲットエンドポイント)」 を選択します。

    • [Select RDS DB Instance (RDS DB インスタンスの選択)] を選択します。

    • [RDS Instance (RDS インスタンス)] で、サブスクライバーの DB インスタンスの DB 識別子を選択します。

    • [Source engine (出典エンジン)] の値を選択します。例えば、サブスクライバーが RDS PostgreSQL データベースの場合は、[postgres] を選択します。サブスクライバーが Aurora PostgreSQL データベースである場合は、[aurora-postgresql] を選択します。

  6. AWS DMS データベース移行タスクを作成します。

    データベース移行タスクを使用して、移行するデータベーステーブルを指定し、ターゲットスキーマを使用してデータをマッピングして、ターゲットデータベースで新しいテーブルを作成します。少なくとも、[Task configuration (タスクの設定)] で以下の設定を使用します。

    • [Replication instance (レプリケーションインスタンス)] で、前のステップで作成したレプリケーションインスタンスを選択します。

    • [Source database endpoint (出典データベースエンドポイント)] で、前のステップで作成したパブリッシャー出典を選択します。

    • [Target database endpoint (ターゲットデータベースエンドポイント)] で、前のステップで作成したサブスクライバーターゲットを選択します。

    タスクの残りの詳細は、移行プロジェクトに応じて異なります。DMS タスクのすべての詳細を指定する方法については、AWS Database Migration Service ユーザーガイドの「AWS DMS タスクの使用」を参照してください。

AWS DMS は、タスクを作成した後で、パブリッシャーからサブスクライバーへのデータの移行をスタートします。

論理的なレプリケーションの使用停止

論理的なレプリケーションの使用を停止することができます。

論理的なレプリケーションの使用を停止するには

  1. すべてのレプリケーションスロットを削除します。

    すべてのレプリケーションスロットを削除するには、パブリッシャに接続して以下の SQL コマンドを実行します。

    SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name IN (SELECT slot_name FROM pg_replication_slots);

    そのコマンドを実行する際、レプリケーションスロットをアクティブにすることはできません。

  2. DB クラスターパラメータグループのパラメータの変更に従い、パブリッシャに関連する DB クラスタのパラメータグループを変更します。rds.logical_replication 静的パラメータを 0 に設定します。

  3. 静的パラメータ rds.logical_replication の変更を有効にするには、パブリッシャの DB クラスタを再起動します。