外部レプリカを構成する

このページでは、logical decodingpglogical 拡張機能を使用して Cloud SQL 外部のレプリカを複製する Cloud SQL インスタンスを構成する方法について説明します。

外部レプリカの構成の詳細については、外部レプリケーションについてをご覧ください。

外部レプリカの構成を行う

始める前に

このタスクを開始する前に、外部レプリカの要件を満たす Cloud SQL インスタンスと外部 PostgreSQL インスタンスを用意しておく必要があります。

プライマリ インスタンスを構成する

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
  2. プライマリ インスタンスで外部レプリカの IP アドレスへのアクセスを有効にします。

    IP アクセスの有効化の詳細については、IP 接続のためのアクセスを構成するをご覧ください。

  3. 後で使用できるように、プライマリ インスタンスのパブリック IP アドレスとパブリック送信 IP アドレスを記録します。これらの値はインスタンスの [概要] ページで確認できます。
  4. 右上隅の Cloud Shell アイコン()をクリックします。
  5. Cloud Shell プロンプトで、組み込み PostgreSQL クライアントを使用してプライマリ インスタンスに接続します。
       
    gcloud sql connect PRIMARY_INSTANCE_NAME \
    --user=postgres
       
       
  6. root パスワードを入力します。postgres プロンプトが表示されます。
  7. REPLICATION 属性を持つ PostgreSQL ユーザーを作成します。
    CREATE USER REPLICATION_USER WITH REPLICATION IN ROLE cloudsqlsuperuser LOGIN PASSWORD 'REPLICATION_USER_PASSWORD';
       
  8. pglogical 拡張機能をインストールして構成します。

    Cloud SQL インスタンスを編集して、以下のフラグを追加して設定します。

    • cloudsql.enable_pglogical
    • cloudsql.logical_decoding
    • max_replication_slots
    • max_worker_processes
    • max_wal_senders
    • これらのフラグの詳細については、PostgreSQL リソースのページをご覧ください。

    データベースを再起動してログインし、plication_user に切り替えて pglogical 拡張機能を作成します。

    CREATE EXTENSION pglogical;
       
  9. pglogical ノードを作成します。

    pglogical ノードは物理的な PostgreSQL インスタンスを表し、そのインスタンスの接続の詳細を保存しています。

    SELECT pglogical.create_node(
      node_name := 'provider',
      dsn := 'host=PRIMARY_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD'
       );
       
  10. 新しいデータベースで開始する場合は、プライマリ インスタンスとレプリカ インスタンスの両方に同じデータベースとテーブルを作成します。次に例を示します。
    CREATE DATABASE test;
    
    \connect test;
    
    CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
    INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
    
    CREATE EXTENSION pglogical;
  11. プライマリ インスタンスにデータベースがすでに存在する場合は、レプリカでもデータベースを作成する必要があります。これを行うには、プライマリ インスタンスから Cloud Storage バケットにデータベースをエクスポートし、レプリカにインポートします。詳しくは、Cloud SQL から Cloud Storage の SQL ダンプファイルにデータをエクスポートするをご覧ください。
  12. 異なるデータセットを異なる宛先に複製できるように、pglogical はレプリケーション セットのコンセプトに対応しています。たとえば、テーブルをデフォルトのレプリケーション セットに追加するには、次のコマンドを実行します。
    SELECT pglogical.replication_set_add_table('default', 'replica_test', true);
       

外部レプリカを構成する

  1. レプリケーション用に特別なユーザーを作成し、レプリケーションの権限を付与します。
    CREATE USER REPLICATION_USER WITH REPLICATION SUPERUSER LOGIN PASSWORD 'REPLICATION_USER_PASSWORD';
       
  2. 新しいデータベースで開始する場合は、REPLICATION_USER を使用して、プライマリ インスタンスとレプリカ インスタンスの両方に同じデータベースとテーブルを作成します。次に例を示します。
    CREATE DATABASE test;
    \connect test;
    CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text);
    INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
      
  3. プライマリ インスタンスからエクスポートしたファイルを外部レプリカ インスタンスにシードするには、エクスポートしたファイルを Cloud Storage からダウンロードします。外部レプリカが Compute Engine インスタンス上にある場合は、gcloud storage コマンドを使用してファイルをダウンロードできます。
    gcloud storage cp gs://BUCKET_NAME/DUMP_FILE_NAME .
        
  4. ファイルをデータベースにインポートします。
    psql --user=postgres --password < DUMP_FILE_NAME.
    
  5. OS に応じて pglogical をインストールします。たとえば、PostgreSQL バージョン 13 を実行する Debian システムの場合は、sudo apt-get install postgresql-13-pglogical です。
  6. replication_user としてデータベースにログインし、次のパラメータを設定します。
    ALTER SYSTEM SET shared_preload_libraries = 'pglogical';
    ALTER SYSTEM SET max_replication_slots = #; (where # is the same as you set on the primary).
    ALTER SYSTEM SET max_worker_processes = #; (where # is the same as you set on the primary).
    # Logout of the database and restart it. For example,
    # sudo /etc/init.d/postgresql restart
    # Log back in the database as the replication_user.
    # Since the pglogical extension is created local to each database, you need to
    # execute CREATE EXTENSION pglogical in each database you create, so if you
    # haven't already done that:
    CREATE EXTENSION pglogical;
       

    For more information about these flags, see the PostgreSQL resources page.

  7. pglogical ノードを作成します。
    SELECT pglogical.create_node(
      node_name := 'subscriber',
      dsn := 'host=REPLICA_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD'
      );
      
  8. pglogical サブスクリプションを作成します。
    SELECT pglogical.create_subscription(
        subscription_name := 'SUBSCRIPTION_NAME',
        provider_dsn := 'host=PRIMARY_PUBLIC_IP_ADDRESS port=5432 dbname=DATABASE_NAME user=REPLICATION_USER password=REPLICATION_USER_PASSWORD'
    );
      
  9. サブスクリプションのステータスを確認します。
    SELECT * FROM pglogical.show_subscription_status('SUBSCRIPTION_NAME');
       
  10. ステータスが「replicating」と表示されている場合、設定は成功です。
  11. 一部のデータをプライマリに挿入し、レプリカにもデータが存在することを確認します。

トラブルシューティング

pglogical のトラブルシューティングをご覧ください。

次のステップ