このページでは、pglogical
拡張機能を使用して AlloyDB for PostgreSQL と AlloyDB Omni の間でデータを複製する手順について説明します。
AlloyDB Omni の pglogical
の概要、メリット、制限事項については、pglogical 拡張機能についてをご覧ください。
pglogical
の主なコンポーネント
pglogical
拡張機能の主なコンポーネントは次のとおりです。
- ノード: PostgreSQL クラスタ内のデータベースに指定された参照。
pglogical
拡張機能は、クラスタ内の任意の数のデータベースにインストールされ、それらに対して動作します。各拡張機能は個別の pglogical ノードとして機能します。各ノードには、プロバイダ(レプリケーション ソース)またはサブスクライバー(レプリケーション ターゲット)のいずれか、または両方を同時に指定できます。データベースごとに指定できるノードは 1 つのみです。 - レプリケーション セット: 移行するテーブルとシーケンスの論理グループと、複製する必要がある SQL ステートメント(
INSERT, UPDATE, DELETE, TRUNCATE
など)としてプロバイダ データベースで定義されます。テーブルは複数のレプリケーション セットに割り当てることができます。デフォルトでは、default
、default_insert_only
、ddl_sql
などの 3 つの事前構成済みレプリケーション セットが用意されています。必要に応じて、任意の数のレプリケーション セットを追加できます。 - サブスクリプション: プロバイダ データベースから複製された変更と、サブスクライバー データベースでプロバイダ データベースから複製された変更の詳細を提供します。サブスクリプションでは、接続文字列を使用してプロバイダ データベースを指定し、必要に応じて、そのプロバイダからコピーするレプリケーション セットを指定します。また、サブスクリプションの作成時に
apply delay
を使用するかどうかを指定することもできます。
このデプロイでは、AlloyDB for PostgreSQL サービスがプロバイダで、オンプレミスの AlloyDB Omni がサブスクライバーです。逆の構成も可能です。
サポート対象の認証方法
AlloyDB Omni に pglogical
拡張機能を実装する前に、レプリケーション ノード間のネットワーキングとセキュリティを検討する必要があります。pglogical
拡張機能で使用される主な認証方法は、パスワード認証と信頼認証の 2 つです。
推奨される認証方法は信頼認証です。パスワード認証方法では、pglogical
が所有するデータベース テーブルにパスワードが書式なしテキスト形式で保存されるからです。このようなパスワードは、これらのテーブルをクエリするデータベース権限を持つすべてのユーザーが、ノンバイナリーのバックアップと PostgreSQL ログファイルで書式なしテキスト形式で確認できます。
信頼認証方法を使用している場合は、セキュリティを最大限に高めるために、ホストベースの認証ファイル pg_hba.conf
に特定のエントリを作成する必要があります。ターゲット データベースを指定して、レプリケーション オプションまたは特定のデータベース、レプリケーション ユーザーのみを許可し、サブスクライバーの特定の IP アドレスからのみアクセスを許可することで、アクセスを制限できます。
始める前に
pglogical
は、特定のデータベース内に拡張機能としてインストールできます。
AlloyDB Omni に pglogical
拡張機能を実装する前に、以下のシステム要件を満たしていることを確認してください。
- AlloyDB for PostgreSQL クラスタと、AlloyDB for PostgreSQL 管理者としてプライマリ インスタンスに読み取り / 書き込みを行うアクセス権。AlloyDB for PostgreSQL クラスタをプロビジョニングする方法については、AlloyDB for PostgreSQL データベースの作成と接続に関する説明をご覧ください。
- インストールして構成した AlloyDB Omni サーバー。AlloyDB Omni をインストールする方法については、AlloyDB Omni をインストールするをご覧ください。
- AlloyDB for PostgreSQL プライマリ インスタンスと AlloyDB Omni ホストサーバーの両方の IP アドレス。
- AlloyDB for PostgreSQL と AlloyDB Omni ホストサーバーの間に安全なネットワークが確立されている。標準の PostgreSQL ポート 5432 での TCP 接続が必要です。
AlloyDB for PostgreSQL プロバイダのパラメータを調整する
pglogical
拡張機能を使用するには、AlloyDB for PostgreSQL プロバイダ クラスタで最小限のパラメータ調整を行う必要があります。wal_level
パラメータを logical
に設定し、postgresql.conf
ファイル内の shared_preload_libraries
パラメータに pglogical
を追加する必要があります。
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
AlloyDB for PostgreSQL サービスでは、適切なクラスタフラグを設定することでパラメータを調整できます。
次の AlloyDB for PostgreSQL フラグのパラメータを調整する必要があります。
alloydb.enable_pglogical = on
alloydb.logical_decoding = on
AlloyDB for PostgreSQL でデータベース フラグを設定する方法については、インスタンスのデータベース フラグを構成するをご覧ください。
その他の必要なプロバイダノード データベース パラメータについては、AlloyDB for PostgreSQL のデフォルト値を次のように設定する必要があります。
max_worker_processes
: プロバイダ データベースごとに 1 つ、およびサブスクライバー ノードごとに少なくとも 1 つ。このパラメータの標準は少なくとも 10 です。max_replication_slots
: プロバイダ ノードごとに 1 つ。max_wal_senders
: プロバイダ ノードごとに 1 つ。track_commit_timestamp
: 最後の更新と最初の更新の競合解決が必要な場合はon
に設定します。listen_addresses
: AlloyDB Omni の IP アドレスを含めるか、対象範囲を CIDR ブロックの形式で指定する必要があります。
これらのパラメータは、psql
などのクエリツールを使用して確認できます。
AlloyDB Omni サブスクライバー クラスタのパラメータを調整する
pglogical
を使用するには、AlloyDB Omni サブスクライバーでも最小限のパラメータ調整を行う必要があります。DATA_DIR/postgresql.conf
ファイル内の shared_preload_libraries
パラメータに pglogical
を追加する必要があります。クラスタ内のいずれかのデータベースがプロバイダ データベースとなる場合は、プロバイダ データベースに必要なパラメータの変更を行います。
DATA_DIR は、データ ディレクトリのファイル システムのパスに置き換えます(例: /home/$USER/alloydb-data
)。
パラメータを調整します。
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
docker container restart CONTAINER_NAME
Podman
podman container restart CONTAINER_NAME
プロバイダ クラスタとサブスクライバー クラスタで pglogical
ユーザーを作成する
プロバイダ クラスタとサブスクライバー クラスタの両方で新しいユーザーを作成する必要があります。pglogical
を使用するには、ユーザーに superuser
権限と replication
権限の両方が必要です。
AlloyDB for PostgreSQL プロバイダ クラスタでユーザーを作成し、
alloydbsuperuser
ロールを付与します。CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; GRANT alloydbsuperuser TO pglogical_replication;
AlloyDB Omni サブスクライバー クラスタでユーザーを作成し、
replication
属性とsuperuser
属性を付与します。CREATE USER pglogical_replication LOGIN PASSWORD 'secret'; ALTER USER pglogical_replication WITH replication; ALTER USER pglogical_replication WITH superuser;
AlloyDB for PostgreSQL プロバイダ データベースに pglogical
とノードを追加する
必要な権限を付与します。
各データベースに
pglogical
拡張機能をインストールし、pglogical データベース ユーザーにusage
権限を付与する必要があります。AlloyDB for PostgreSQL では、pglogical
スキーマに対する権限を付与する必要があります。たとえば、データベースが
my_test_db
の場合は、AlloyDB for PostgreSQL プロバイダ データベースに対して次のコマンドを実行します。\c my_test_db; CREATE EXTENSION IF NOT EXISTS pglogical; GRANT usage ON SCHEMA pglogical TO pglogical_replication; -- For Google Cloud AlloyDB we also need to manually grant privileges: GRANT ALL PRIVILEGES ON ALL tables IN SCHEMA pglogical TO pglogical_replication;
プロバイダ データベースで
pglogical
ノードを作成します。node_name
の指定は任意で、dsn
文字列には同じデータベースへの有効な TCP 接続を指定する必要があります。AlloyDB for PostgreSQL の場合、dsn
のホスト部分はプライマリ インスタンスに指定された IP アドレスです。AlloyDB for PostgreSQL では、信頼認証は使用できません。
dsn
パラメータにパスワード引数を含める必要があります。たとえば、
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 for PostgreSQL プロバイダ データベースのデフォルト レプリケーション セットに追加します。
プロバイダ データベースに
test_table_1
という名前のテストテーブルを作成します。CREATE TABLE test_table_1 (col1 INT PRIMARY KEY); INSERT INTO test_table_1 VALUES (1),(2),(3);
個々のテーブルに
SELECT
を付与するか、GRANT SELECT ON ALL TABLES
コマンドを実行します。レプリケーション セットの一部となるテーブルには、レプリケーション ユーザーpglogical_replication
にクエリ権限が付与されている必要があります。GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
このテストテーブルを手動でデフォルトのレプリケーション セットに追加します。カスタムの 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
レプリケーション セットからテーブルを削除します。スキーマに主キーがないテーブルがある場合は、INSERT のみのレプリケーション用に設定するか、ALTER TABLE
コマンドで使用されるREPLICA IDENTITY
機能を使用して、行を一意に識別する列を設定します。このようなテーブルを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 for PostgreSQL プライマリ インスタンスの 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
alloydbsuperuser not existing
などのエラーは無視します。このロールは AlloyDB for PostgreSQL に固有のものです。
これにより、行データのないデータベースとスキーマが作成されます。行データは pglogical
拡張機能によって複製されます。他に必要なユーザーまたはロールがあれば、手動でコピーするか再作成します。
AlloyDB Omni サブスクライバー データベースにノードとサブスクリプションを作成する
AlloyDB Omni サブスクライバー データベースにノードを作成します。
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 for PostgreSQL プロバイダ サーバーのプロバイダ データベースのプライマリ インスタンスを参照するサブスクリプションをサブスクライバー データベースに作成します。
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
拡張機能には、このドキュメントでは取り上げていない高度な機能が多数あります。これらの機能の多くは実際の環境に実装できます。高度な機能には、次のようなものがあります。
- 競合の解決
- マルチマスター レプリケーションと双方向レプリケーション
- シーケンスの包含
- スイッチオーバーとフェイルオーバーの手順