pglogical 拡張機能を使用して AlloyDB Omni と他のデータベースの間でデータを複製する手順について説明します。
詳細については、pglogical 拡張機能についてと pglogical の用語と基本コンポーネントをご覧ください。
サポートされている認証方法
pglogical 拡張機能で使用される主な認証方法は、パスワード認証と信頼認証の 2 つです。
推奨される認証方法は信頼認証です。詳細については、サポートされている認証方法をご覧ください。
始める前に
pglogical は、特定のデータベース内に拡張機能としてインストールできます。
AlloyDB Omni に pglogical 拡張機能を実装する前に、以下のシステム要件を満たしていることを確認してください。
- AlloyDB 以外の PostgreSQL クラスタに superuserとしてのアクセスできる。
- pglogical拡張機能が非 AlloyDB PostgreSQL クラスタにインストールされている。リリースとディストリビューション固有のインストール手順については、pglogical をご覧ください。
- AlloyDB Omni サーバーがインストールされ、構成されている。AlloyDB Omni のインストール手順については、AlloyDB Omni をインストールするをご覧ください。
- AlloyDB 以外の PostgreSQL クラスタと AlloyDB Omni ホストサーバーの両方の IP アドレス。
- AlloyDB 以外の PostgreSQL クラスタと AlloyDB Omni ホストサーバーとの間に安全なネットワークが確立されている。標準の PostgreSQL ポート 5432 での TCP 接続が必要です。
AlloyDB 以外のプロバイダのパラメータを調整する
- wal_levelパラメータを- logicalに設定し、- postgresql.confファイル内の- shared_preload_librariesパラメータに- pglogicalを追加します。- pglogical拡張機能を使用するには、非 AlloyDB プロバイダ クラスタで最小限のパラメータ調整を行う必要があります。- cp postgresql.conf postgresql.bak- sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf- sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf- sed -r -i "s|',|'|" postgresql.conf
- パラメータが正しく設定されていることを確認します。 - grep -iE 'wal_level|shared_preload_libraries' postgresql.conf
- パラメータの変更を有効にするため、AlloyDB 以外のクラスタを再起動します。 - 上記以外のパラメータは、すでに十分な値に設定されている場合もありますが、AlloyDB 以外のディストリビューションとバージョンによっては調整が必要になることもあります。 - 以下のパラメータを確認します。 - max_worker_processes: プロバイダ データベースごとに 1 つ、およびサブスクライバー ノードごとに少なくとも 1 つ。このパラメータの標準は少なくとも 10 です。
- max_replication_slots: プロバイダ ノードごとに 1 つ。
- max_wal_senders: プロバイダ ノードごとに 1 つ。
- track_commit_timestamp: 最後の更新と最初の更新の競合解決が必要な場合は- onに設定します。
- listen_addresses: AlloyDB Omni の IP アドレスを含めるか、対象範囲を CIDR ブロックの形式で指定する必要があります。
 
- (省略可)非 AlloyDB プロバイダが Amazon RDS または Aurora の場合は、pglogical 拡張機能を有効にし、 - cluster parameter groupを使用して必要なパラメータを調整する必要があります。- 既存または新しいクラスタのパラメータ グループ内で、以下のパラメータを設定します。 - rds.logical_replicationを- 1に設定
- max_replication_slotsを- 50に設定
- max_wal_sendersを- 50に設定
- max_worker_processesを- 64に設定
- shared_preload_librariesを- pg_stat_statements, pglogicalに設定
 
- クラスタ パラメータ グループの調整を有効にするため、Amazon RDS または Aurora クラスタを再起動します。 
 
- すべてのパラメータ値が適切であることを確認します。 - SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name;
AlloyDB Omni 以外のプロバイダ クラスタに対するホストベースの認証の調整
pglogical は、ローカル TCP 接続を使用してプロバイダ データベースに接続します。そのため、ホストサーバーの IP アドレスを AlloyDB Omni の DATA_DIR/pg_hba.conf ファイルに追加する必要があります。ここで、DATA_DIR はデータ ディレクトリへのファイル システムのパスです(例: /home/$USER/alloydb-data)。
- ローカル サーバーにおける新しい - pglogical_replicationユーザーに固有の信頼認証エントリを- DATA_DIR/pg_hba.confファイルに追加します。- また、サブスクライバー ノードをプロバイダ ノードに対して認証できる必要があります。各サブスクライバー ノードの IP アドレスまたは適切な CIDR ブロック IP 範囲を - DATA_DIR/pg_hba.confファイルに追加します。- echo -e "# pglogical entries: host all pglogical_replication samehost trust host all pglogical_replication SERVER_IP_ADDRESS/32 trust " | column -t | sudo tee -a DATA_DIR/pg_hba.conf- SERVER_IP_ADDRESSは、複製元のプライマリ AlloyDB Omni インスタンスの IP アドレスに置き換えます。
- エントリが正しいことを確認します。 - tail -3 DATA_DIR/pg_hba.conf
- パラメータの変更を有効にするため、AlloyDB 以外のクラスタを再起動します。 
AlloyDB Omni サブスクライバー クラスタのパラメータを調整する
pglogical を使用するには、AlloyDB Omni サブスクライバー クラスタでも最小限のパラメータ調整を行う必要があります。DATA_DIR/postgresql.conf ファイル内の shared_preload_libraries パラメータに pglogical を追加する必要があります。クラスタ内のいずれかのデータベースがプロバイダ データベースとなる場合は、プロバイダ データベースに必要なパラメータの変更を行います。
- パラメータを調整します。 - sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
- パラメータが適切に設定されていることを確認します。 - grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
- パラメータの変更を有効にするため、AlloyDB Omni を再起動します。 - Docker- docker container restart CONTAINER_NAME- CONTAINER_NAMEは、起動時に AlloyDB Omni コンテナに割り当てた名前に置き換えます。- Podman- podman container restart CONTAINER_NAME- CONTAINER_NAMEは、起動時に AlloyDB Omni コンテナに割り当てた名前に置き換えます。
- 他のプロバイダ データベース パラメータに AlloyDB Omni のデフォルト値を設定します。 - max_worker_processes: プロバイダ データベースごとに 1 つ、およびサブスクライバー ノードごとに 1 つ。
- track_commit_timestamp: 最後の更新と最初の更新の競合解決が必要な場合は- onに設定します。
 
- すべてのパラメータ値が適切であることを確認します。 - Docker- docker exec CONTAINER_NAME psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name; "- Podman- podman exec CONTAINER_NAME psql -h localhost -U postgres -c " SELECT name, setting FROM pg_catalog.pg_settings WHERE name IN ('listen_addresses', 'wal_level', 'shared_preload_libraries', 'max_worker_processes', 'max_replication_slots', 'max_wal_senders', 'track_commit_timestamp') ORDER BY name; "
AlloyDB Omni サブスクライバー クラスタに対するホストベースの認証の調整
pglogical は、ローカル TCP 接続を使用して AlloyDB Omni サブスクライバー データベースに接続します。そのため、サブスクライバーのホストサーバーの IP アドレスを AlloyDB Omni の DATA_DIR/pg_hba.conf ファイルに追加する必要があります。
- ローカル サーバーにおける新しい - pglogical_replicationユーザーに固有の信頼認証エントリを- DATA_DIR/pg_hba.confファイルに追加します。- echo -e "# pglogical entries: host all pglogical_replication samehost trust " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
- エントリが正しいことを確認します。 - tail -2 DATA_DIR/pg_hba.conf
- 認証の変更を有効にするため、AlloyDB Omni を再起動します。 - docker container restart CONTAINER_NAME
プロバイダ クラスタとサブスクライバー クラスタの両方に pglogical ユーザーを作成する
プロバイダ クラスタとサブスクライバー クラスタの両方で新しいユーザーを作成する必要があります。pglogical ユーザーには superuser と replication の両方の属性が必要です。
- AlloyDB for PostgreSQL プロバイダ クラスタで、ユーザーロールを作成します。 - CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; ALTER USER pglogical_replication WITH superuser;
- (省略可)非 AlloyDB プロバイダが Amazon RDS または Aurora の場合は、次のロールを付与する必要があります。 - GRANT rds_superuser TO replication_user;
AlloyDB 以外のプロバイダ データベースに pglogical とノードを追加する
- 必要な権限を付与します。 - 各データベースに - pglogical拡張機能をインストールし、pglogical データベース ユーザーに- usage権限を付与する必要があります。- たとえば、データベースが - my_test_dbの場合は、次のコマンドを実行します。- CREATE EXTENSION IF NOT EXISTS pglogical; GRANT usage ON SCHEMA pglogical TO pglogical_replication;
- プロバイダ データベースの - pglogicalノードを作成します。- node_nameの指定は任意で、- dsn文字列には同じデータベースへの有効な TCP 接続を指定する必要があります。- たとえば、 - my_test_dbデータベースの場合は、次のコマンドを実行します。- SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
テーブルを作成してデフォルト レプリケーション セットに追加する
テーブルを作成し、AlloyDB 以外のプロバイダ データベースのデフォルト レプリケーション セットに追加します。
- プロバイダ データベースに - test_table_1という名前のテストテーブルを作成します。- CREATE TABLE test_table_1 (col1 INT PRIMARY KEY); INSERT INTO test_table_1 VALUES (1),(2),(3);
- このテストテーブルを手動でデフォルト レプリケーション セットに追加します。カスタムの pglogical レプリケーション セットを作成することも、デフォルトのレプリケーション セットを使用することもできます。拡張機能の作成時に、 - default、- default_insert_only、- ddl_sqlなどのデフォルト レプリケーション セットが作成されています。テーブルとシーケンスをレプリケーション セットに個別に追加することも、指定したスキーマに対応するものをすべて一度に追加することもできます。- -- Add the specified table to the default replication set: SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table;
- (省略可)指定したスキーマ( - publicなど)内のすべてのテーブルを追加します。- -- Add all "public" schema tables to the default replication set: SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); -- Check which tables have been added to all replication sets: SELECT * FROM pglogical.replication_set_table; -- Add all "public" schema sequences to the default replication: SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']); -- Check which sequences have been added to all replication sets: SELECT * FROM pglogical.replication_set_seq;
- defaultレプリケーション セットからテーブルを削除します。主キーまたはレプリカ ID を持たないテーブルがスキーマ内にある場合、複製できるのは- INSERTステートメントのみです。このようなテーブルを- replication_set_add_all_tables関数によって- defaultレプリケーション セットに自動的に追加した場合は、それらのテーブルをそのレプリケーション セットから手動で削除し、- default_insert_onlyセットに追加する必要があります。- -- Remove the table from the **default** replication set: SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2'); -- Manually add to the **default_insert_only** replication set: SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');- (省略可)新しく作成したテーブルをレプリケーション セットに自動的に追加したい場合は、 - pglogicalのソースに示されている- pglogical_assign_repsetトリガーを追加します。
データベースを AlloyDB Omni サブスクライバー クラスタにコピーする
- pg_dumpユーティリティを使用して、ソース データベースのスキーマのみのバックアップを作成します。
- AlloyDB Omni サブスクライバー サーバーから、AlloyDB 以外のサーバーの IP アドレスまたはエンドポイントを使用して - pg_dumpコマンドを実行します。- pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
- 作成したバックアップを、サブスクライバー AlloyDB Omni サーバーのサブスクライバー データベースにインポートします。 - Docker- docker exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql- Podman- podman exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql
これにより、行データのないデータベースとスキーマが作成されます。行データは pglogical 拡張機能によって複製されます。他に必要なユーザーまたはロールがあれば、手動でコピーするか再作成します。
AlloyDB Omni サブスクライバー データベースにノードとサブスクリプションを作成する
- AlloyDB Omni サブスクライバー データベースにノードを作成します。パスワード認証を使用する場合は、パスワードを - dsnに追加します。- Docker- docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "- SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication'); "- Podman- podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "- SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication'); "
- AlloyDB Omni プロバイダ サーバーのプロバイダ データベースを指すサブスクリプションをサブスクライバー データベースに作成します。 - Docker- docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "- SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret'); "- Podman- podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "- SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret'); "
- 数秒または数分以内に、初期データがプロバイダからサブスクライバーに複製されます。 - Docker- docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "- SELECT * FROM test_table_1 ORDER BY 1; "- Podman- podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "- SELECT * FROM test_table_1 ORDER BY 1; "- プロバイダ データベースに新しく追加された行も、リアルタイムで(数秒以内に)複製されます。 
pglogical デプロイに関するその他の考慮事項
pglogical 拡張機能には、このドキュメントでは取り上げていない高度な機能が多数あります。これらの機能の多くをご使用の環境に実装できます。たとえば、次のような高度な機能があります。
- 競合の解決
- マルチマスター レプリケーションと双方向レプリケーション
- シーケンスの包含
- スイッチオーバーとフェイルオーバーの手順