このページでは、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
は、AlloyDB Omni サブスクライバー データベースへのローカル TCP 接続を行います。したがって、サブスクライバーのホストサーバーの 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
属性の両方が必要です。
Google Cloud AlloyDB プロバイダ クラスタで、ユーザーロールを作成します。
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 以外のサーバーの IP アドレスまたはエンドポイントを使用して、AlloyDB Omni サブスクライバー サーバーから
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
拡張機能には、このドキュメントで説明されていない高度な機能が多数あります。これらの機能の多くは、実装に適用できます。次の高度な機能を検討できます。
- 競合の解決
- マルチマスターと双方向レプリケーション
- シーケンスの包含
- スイッチオーバーとフェイルオーバーの手順