AlloyDB と AlloyDB Omni 間でデータを複製する

このページでは、pglogical 拡張機能を使用して、 Google Cloud AlloyDB と AlloyDB Omni の間でデータを複製する手順について説明します。

AlloyDB Omni の pglogical の概要、メリット、制限事項については、pglogical 拡張機能についてをご覧ください。

pglogical の主要コンポーネント

pglogical 拡張機能の主なコンポーネントは次のとおりです。

  • ノード: PostgreSQL クラスタ内のデータベースに指定された参照。pglogical 拡張機能は、クラスタ内の任意の数のデータベースにインストールされ、それらに対して動作します。各拡張機能は個別の pglogical ノードとして機能します。各ノードは、プロバイダ(レプリケーション ソース)またはサブスクライバー(レプリケーション ターゲット)のいずれか、または両方を同時に指定できます。データベースごとに許可されるノードは 1 つのみです。
  • レプリケーション セット: 移行するテーブルとシーケンスの論理的なグループ化と、レプリケートする必要がある SQL ステートメント(INSERT, UPDATE, DELETE, TRUNCATE など)としてプロバイダ データベースで定義されます。テーブルは複数のレプリケーション セットに割り当てることができます。デフォルトでは、defaultdefault_insert_onlyddl_sql などの 3 つの事前構成済みレプリケーション セットが用意されています。必要に応じて、任意の数のレプリケーション セットを追加できます。
  • サブスクリプション: プロバイダ データベースから複製された変更と、サブスクライバー データベースでプロバイダ データベースから複製された変更の詳細を提供します。サブスクリプションでは、接続文字列を使用してプロバイダ データベースを指定し、必要に応じて、そのプロバイダからコピーするレプリケーション セットを指定します。また、サブスクリプションの作成時に apply delay を使用するかどうかを指定することもできます。

このデプロイでは、 Google Cloud AlloyDB サービスがプロバイダであり、オンプレミスの AlloyDB Omni がサブスクライバーです。逆の構成も可能です。

サポート対象の認証方法

AlloyDB Omni に pglogical 拡張機能を実装する前に、レプリケーション ノード間のネットワーキングとセキュリティを検討する必要があります。pglogical 拡張機能で使用される主な 2 つの認証方法は、パスワード認証方法と信頼認証方法です。

推奨される認証方法は信頼認証です。パスワード認証方法では、パスワードが pglogical が所有するデータベース テーブルに平文形式で保存されるためです。これらのパスワードは、これらのテーブルをクエリするデータベース権限を持つすべてのユーザーが、バイナリ以外のバックアップと PostgreSQL ログファイルでプレーンテキストで確認できます。

信頼認証方法を使用している場合は、セキュリティを最大限に高めるために、ホストベースの認証ファイル pg_hba.conf に特定のエントリを作成する必要があります。ターゲット データベースを指定して、レプリケーション オプションまたは特定のデータベース、レプリケーション ユーザーのみを許可し、サブスクライバーの特定の IP アドレスからのみアクセスを許可することで、アクセスを制限できます。

始める前に

pglogical は、特定のデータベース内に拡張機能としてインストールできます。

AlloyDB Omni に pglogical 拡張機能を実装する前に、次のシステム要件を満たしていることを確認してください。

  • Google Cloud AlloyDB クラスタ、および Cloud AlloyDB 管理者としてプライマリ インスタンスへの読み取り/書き込みアクセス権。 Google Cloud AlloyDB クラスタをプロビジョニングする方法については、データベースを作成して接続するをご覧ください。
  • インストールと構成が完了した AlloyDB Omni サーバー。AlloyDB Omni のインストール手順については、AlloyDB Omni をインストールするをご覧ください。
  • Google Cloud AlloyDB のプライマリ インスタンスと AlloyDB Omni ホスト サーバーの両方の IP アドレス。
  • Google Cloud AlloyDB と AlloyDB Omni ホストサーバーの間で確立され、保護されたネットワーク。標準の PostgreSQL ポート 5432 での TCP 接続が必要です。

Google Cloud AlloyDB プロバイダのパラメータを調整する

pglogical 拡張機能では、Google Cloud AlloyDB プロバイダ クラスタで最小限のパラメータ調整が必要です。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

Google Cloud AlloyDB サービスでは、適切なクラスタ フラグを設定することでパラメータを調整できます。

次の Google Cloud AlloyDB フラグのパラメータを調整する必要があります。

  • alloydb.enable_pglogical = on
  • alloydb.logical_decoding = on

Google CloudAlloyDB でデータベース フラグを設定する方法については、インスタンスのデータベース フラグを構成するをご覧ください。

必要なプロバイダノード データベース パラメータについては、Google Cloud 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 ブロックで指定する必要があります。

これらのパラメータは、psql などのクエリツールを使用して確認できます。

AlloyDB Omni サブスクライバー クラスタのパラメータを調整する

pglogical 拡張機能では、AlloyDB Omni サブスクライバーでも最小限のパラメータ調整が必要です。DATA_DIR/postgresql.conf ファイルの shared_preload_libraries パラメータに pglogical を追加する必要があります。クラスタ内のいずれかのデータベースがプロバイダ データベースとして機能する場合は、プロバイダ データベースに必要なパラメータの変更を行います。

DATA_DIR は、データ ディレクトリのファイル システム パスに置き換えます(例: /home/$USER/alloydb-data)。

  1. パラメータを調整します。

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
  2. パラメータが正しく設定されていることを確認します。

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. パラメータの変更を有効にするために AlloyDB Omni を再起動します。

    Docker

     docker container restart CONTAINER_NAME

    CONTAINER_NAME は、AlloyDB Omni コンテナのインストール時に割り当てた名前に置き換えます。

    Podman

     podman container restart CONTAINER_NAME

    CONTAINER_NAME は、AlloyDB Omni コンテナのインストール時に割り当てた名前に置き換えます。

  4. 他のプロバイダ データベース パラメータに AlloyDB Omni のデフォルト値を設定します。

    • max_worker_processes: プロバイダ データベースごとに 1 つ、サブスクライバー ノードごとに 1 つ。
    • track_commit_timestamp: 最後の更新または最初の更新が競合解決に勝つ必要がある場合は、on に設定します。
  5. すべてのパラメータ値が正しく設定されていることを確認します。

    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 ファイルに追加する必要があります。

  1. 新しい 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
  2. エントリが正しいことを確認します。

    tail -2 DATA_DIR/pg_hba.conf
  3. 認証の変更を有効にするには、AlloyDB Omni を再起動します。

    Docker

    docker container restart CONTAINER_NAME

    Podman

    podman container restart CONTAINER_NAME

プロバイダ クラスタとサブスクライバー クラスタに pglogical ユーザーを作成する

プロバイダ クラスタとサブスクライバー クラスタの両方で新しいユーザーを作成する必要があります。pglogical では、ユーザーに superuser 権限と replication 権限の両方が必要です。

  1. Google Cloud AlloyDB プロバイダ クラスタで、ユーザーを作成し、alloydbsuperuser ロールを付与します。

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    GRANT alloydbsuperuser TO pglogical_replication;
    
  2. AlloyDB Omni サブスクライバー クラスタでユーザーを作成し、replication 属性と superuser 属性を付与します。

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    ALTER USER pglogical_replication WITH superuser;
    

Google Cloud AlloyDB プロバイダ データベースに pglogical とノードを追加する

  1. 必要な権限を付与します。

    各データベースに pglogical 拡張機能をインストールし、pglogical データベース ユーザーに usage 権限を付与する必要があります。 Google Cloud AlloyDB では、pglogical スキーマに対する権限を付与する必要があります。

    たとえば、データベースが my_test_db の場合は、 Google Cloud AlloyDB プロバイダ データベースに対して次のコマンドを実行します。

       \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;
    
  2. プロバイダ データベースの pglogical ノードを作成します。node_name は任意で、dsn 文字列は同じデータベースへの有効な TCP 接続である必要があります。 Google Cloud AlloyDB の場合、dsn のホスト部分はプライマリ インスタンスに指定された IP アドレスです。

    Google Cloud AlloyDB では、信頼認証は許可されません。パスワード引数を dsn に含める必要があります。Exploreに結合を定義します

    たとえば、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');
    

テーブルを作成してデフォルトのレプリケーション セットに追加する

テーブルを作成し、 Google CloudAlloyDB プロバイダ データベースのデフォルトのレプリケーション セットに追加します。

  1. プロバイダ データベースに test_table_1 という名前のテストテーブルを作成します。

    CREATE TABLE test_table_1 (col1 INT PRIMARY KEY);
    INSERT INTO test_table_1 VALUES (1),(2),(3);
    
  2. 個々のテーブルに SELECT を付与するか、GRANT SELECT ON ALL TABLES コマンドを実行します。レプリケーション セットの一部となるテーブルには、レプリケーション ユーザー pglogical_replication にクエリ権限が付与されている必要があります。

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
    
  3. テストテーブルを手動でデフォルトのレプリケーション セットに追加します。カスタムの pglogical レプリケーション セットを作成することも、デフォルトのレプリケーション セットを使用することもできます。拡張機能の作成時に、defaultdefault_insert_onlyddl_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;
    
  4. (省略可)指定されたスキーマ(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;
    
  5. 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 サブスクライバー クラスタにコピーする

  1. pg_dump ユーティリティを使用して、ソース データベースのスキーマのみのバックアップを作成します。

  2. Google Cloud 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
  3. バックアップをサブスクライバーの 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 などのエラーは無視します。このロールは、Google Cloud AlloyDB に固有のものです。

これにより、行データなしでデータベースとスキーマが作成されます。行データは pglogical 拡張機能によって複製されます。必要な他のユーザーまたはロールを手動でコピーするか、再作成します。

AlloyDB Omni サブスクライバー データベースにノードとサブスクリプションを作成する

  1. 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');"
  2. サブスクライバー データベースにサブスクリプションを作成し、Google Cloud AlloyDB プロバイダ データベースのプライマリ インスタンスを参照します。

    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');"
  3. テーブルのサイズとレプリケートするデータによっては、レプリケーション時間は数秒から数分まで変動する場合があります。この時間の経過後に、初期データがプロバイダからサブスクライバーにレプリケートされます。

    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 拡張機能には、このドキュメントで説明していない多くの高度な機能があります。これらの機能の多くは、実装に適用できます。次の高度な機能を検討できます。

  • 競合の解決
  • マルチマスターと双方向レプリケーション
  • シーケンスの包含
  • スイッチオーバーとフェイルオーバーの手順

次のステップ