Amazon RDS for PostgreSQL の論理レプリケーションの実行
バージョン 10.4 以降、RDS for PostgreSQL は、PostgreSQL 10 で導入されたパブリケーションおよびサブスクリプション SQL 構文をサポートしています。詳細については、「PostgreSQL のドキュメント」の「論理レプリケーション
注記
PostgreSQL 10 で導入されたネイティブの PostgreSQL 論理レプリケーション機能に加えて、PostgreSQL 用 RDS は pglogical
拡張機能もサポートしています。詳細については、「pglogical を使用してインスタンス間でデータを同期する」を参照してください。
RDS for PostgreSQL DB インスタンスに対する論理レプリケーションの設定については、次で説明します。
論理レプリケーションと論理デコードについて
RDS for PostgreSQL は、PostgreSQL の論理レプリケーションスロットを使用した、ログ先行書き込み (WAL) 変更のストリーミングをサポートしています。また、ロジカルデコーディングの使用もサポートしています。インスタンスで論理的なレプリケーションスロットをセットアップし、それらのスロットを通じてデータベースの変更を pg_recvlogical
などのクライアントにストリーミングできます。データベースレベルで論理レプリケーションスロットを作成すると、1 つのデータベースへのレプリケーション接続がサポートされます。
PostgreSQL 論理レプリケーション用の最も一般的なクライアントは、AWS Database Migration Service、または Amazon EC2 インスタンスのカスタム管理ホストです。論理レプリケーションスロットには、ストリームの受信者に関する情報が含まれていません。また、ターゲットをレプリカデータベースとする必要はありません。論理的なレプリケーションスロットをセットアップし、スロットから読み取りを行わない場合、データが書き込まれて、DB インスタンスのストレージがすぐにいっぱいになる可能性があります。
パラメータ、レプリケーション接続タイプ、およびセキュリティロールを使用して、Amazon RDS の PostgreSQL 論理レプリケーションおよび論理デコードをオンにします。論理デコード用のクライアントは、PostgreSQL DB インスタンスのデータベースにレプリケーション接続を確立できる任意のクライアントとすることができます。
RDS for PostgreSQL DB インスタンスに対して論理デコードをオンにするには
-
使用しているユーザーアカウントに次のロールがあることを確認します。
-
論理レプリケーションをオンにできるようにする
rds_superuser
ロール -
論理スロットを管理し、論理スロットを使用してデータをストリーミングするためのアクセス許可を付与する
rds_replication
ロール
-
-
rds.logical_replication
静的パラメータを 1 に設定します。このパラメータを適用する一環として、wal_level
、max_wal_senders
、max_replication_slots
、max_connections
の各パラメータも設定します。これらのパラメータの変更により、生成される WAL が増えることがあるため、論理スロットを使用する場合にのみ、rds.logical_replication
パラメータを設定してください。 -
静的
rds.logical_replication
パラメータの DB インスタンスを再起動して有効にします。 -
次のセクションの説明に従って論理的なレプリケーションスロットを作成します。このプロセスでは、デコードプラグインを指定する必要があります。現在、RDS for PostgreSQL は、PostgreSQL に付属する出力プラグイン test_decoding および wal2json をサポートしています。
PostgreSQL 論理的なデコードの使用の詳細については、PostgreSQL のドキュメント
論理的なレプリケーションスロットの使用
SQL コマンドを使用して、論理的なスロットを操作できます。例えば、次のコマンドは、デフォルトの PostgreSQL 出力プラグイン test_slot
を使用して、test_decoding
という論理的なスロットを作成します。
SELECT * FROM pg_create_logical_replication_slot('test_slot', 'test_decoding');
slot_name | xlog_position -----------------+--------------- regression_slot | 0/16B1970 (1 row)
論理的なスロットを一覧表示するには、次のコマンドを使用します。
SELECT * FROM pg_replication_slots;
論理的なスロットを削除するには、次のコマンドを使用します。
SELECT pg_drop_replication_slot('test_slot');
pg_drop_replication_slot ----------------------- (1 row)
論理的なレプリケーションスロットのその他の使用例については、PostgreSQL ドキュメントの「Logical Decoding Examples
論理的なレプリケーションスロットを作成すると、ストリーミングをスタートできます。次の例は、ストリーミングレプリケーションプロトコルで論理的なデコードがどのように制御されるかを示しています。この例では、PostgreSQL ディストリビューションに含まれているプログラム pg_recvlogical を使用しています。これを行うには、レプリケーション接続を許可するようにクライアント認証が設定されている必要があります。
pg_recvlogical -d postgres --slot test_slot -U postgres --host -
instance-name.111122223333
.aws-region
.rds.amazonaws.com -f - --start
pg_replication_origin_status
ビューの内容を表示するには、pg_show_replication_origin_status
関数を照会します。
SELECT * FROM pg_show_replication_origin_status();
local_id | external_id | remote_lsn | local_lsn ----------+-------------+------------+----------- (0 rows)