論理レプリケーション用のサブスクライバー クラスタを構成する

ドキュメントのバージョンを選択してください。

このドキュメントでは、サブスクライバー クラスタを手動で作成して構成する方法の例を示します。サブスクライバー クラスタは、パブリッシャー クラスタから複製されたデータを受信するデータベース クラスタです。

このページのコード スニペットは、モデルとして使用できる例です。値は、AlloyDB Omni リソースの値に置き換えてください。

始める前に

サブスクライバー クラスタを作成して構成する

  1. サブスクライバー クラスタを作成します。

    $ cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-pw-DB_CLUSTER_NAME
    type: Opaque
    data:
      DB_CLUSTER_NAME: "ENCODED_PASSWORD" # Password is odspassword
    ---
    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: DBCluster
    metadata:
      name: subscriber
    spec:
      databaseVersion: "16.3.0"
      primarySpec:
        adminUser:
          passwordRef:
            name: db-pw-DB_CLUSTER_NAME
        resources:
          memory: MEMORY_SIZE
          cpu: CPU_COUNT
          disks:
          - name: DataDisk
            size: DISK_SIZE
    EOF
    

    次のように置き換えます。

    • DB_CLUSTER_NAME: このデータベース クラスタの名前。例: subscriber-cluster
    • ENCODED_PASSWORD: デフォルトの postgres ユーザーロールのデータベース ログイン パスワード。base64 文字列としてエンコードされます。例: ChangeMe123 の場合は Q2hhbmdlTWUxMjM=

    • CPU_COUNT: このデータベース クラスタ内の各データベース インスタンスで使用できる CPU の数。

    • MEMORY_SIZE: このデータベース クラスタのデータベース インスタンスあたりのメモリ量。CPU ごとに 8 GB に設定することをおすすめします。たとえば、このマニフェストの前半で cpu2 に設定した場合は、memory16Gi に設定することをおすすめします。

    • DISK_SIZE: データベース インスタンスあたりのディスクサイズ(例: 10Gi)。

  2. 必要な Pod を見つけます。

    $ kubectl get pod -l "alloydbomni.internal.dbadmin.goog/dbcluster=DB_CLUSTER_NAME, alloydbomni.internal.dbadmin.goog/task-type=database, dbs.internal.dbadmin.goog/ha-role=Primary"
    
  3. サブスクライバー クラスタ データベース Pod にログインします。

    $ kubectl get pod
    NAME                                          READY   STATUS    RESTARTS   AGE
    al-2bce-publisher-0                           3/3     Running   0          20h
    
    $ kubectl exec -ti SUBSCRIBER_POD_NAME  -- /bin/bash
    Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init)
    postgres@al-3513-subscriber-0:/$
    

    SUBSCRIBER_POD_NAME は、サブスクライバー Pod の名前に置き換えます。

  4. パブリッシャー DBCluster のロードバランサの IP アドレスを確認します(例: 10.116.14.190)。

    $ kubectl get service
    NAME                     TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)          AGE
    al-publisher-rw-ilb      ClusterIP      10.116.14.190   <none>         5432/TCP         21h
    
  5. パブリッシャー データベースに公開されたデータの初期コピーとして、パブリッシャーからスキーマ バックアップを取得します。論理レプリケーションは DDL レプリケーションをサポートしていません。論理レプリケーションの開始前に、複製するスキーマまたはテーブルが宛先(サブスクライバー クラスタ)に存在している必要があります。

    postgres@al-3513-subscriber-0:/$ pg_dump -h PUBLISHER_IP_ADDRESS -U postgres --create --schema-only customer > /tmp/customer.schema-only.sql
    

    PUBLISHER_IP_ADDRESS は、パブリッシャー DBCluster のロードバランサの IP アドレスに置き換えます。

  6. サブスクライバー データベースにバックアップを適用します。

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres < /tmp/customer.schema-only.sql
    
  7. 省略可: テーブルにデータがないことを確認します。

    # There is no data in table company
    customer=# select * from company;
    id | name | age | salary
    ----+------+-----+--------
    (0 rows)
    
  8. データベースのサブスクリプションを作成します。パブリッシャー DBCluster にパブリケーションがすでに作成されていることを確認します。

    postgres@al-3513-subscriber-0:/$ CREATE SUBSCRIPTION sub_customer CONNECTION 'host=PUBLISHER_IP_ADDRESS port=5432 user=REPLICATION_USER dbname=DATABASE_NAME password=PUBLISHER_CLUSTER_PASSWORD sslmode=require' PUBLICATION PUBLICATION_NAME WITH (slot_name='REPLICATION_SLOT_NAME');
    

    次のように置き換えます。

    • REPLICATION_USER: レプリケーション スロットに接続するユーザーの名前。
    • DATABASE_NAME: レプリケーション スロットから変更をストリーミングするデータベースの名前に設定します。
    • PUBLISHER_CLUSTER_PASSWORD: パブリッシャー DBCluster の postgres ユーザーのデータベース ログイン パスワード。
    • PUBLICATION_NAME: サブスクライバーが登録しているパブリケーションの名前。
    • REPLICATION_SLOT_NAME: パブリッシャー DBCluster に作成されたレプリケーション スロットの名前。
  9. 省略可: サブスクライバー クラスタでレプリケーションを確認します。

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME
    customer=# select * from public.company;
    id | name  | age | salary
    ----+-------+-----+--------
      1 | Quinn |  25 |  65000
      2 | Kim   |  22 |  72250
      3 | Bola  |  31 |  53000
      4 | Sasha |  33 | 105000
      5 | Yuri  |  27 |  85000
    (5 rows)
    
  10. パブリッシャー クラスタで、テーブルに行を追加します。

    # On the publisher database
    $ kubectl exec -ti al-2bce-publisher-0  -- /bin/bash
    Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init)
    postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres DATABASE_NAME
    customer=# insert into TABLE_NAME (id, name, age, salary) values (6, 'Alex', 39, 100000);
    

    TABLE_NAME は、サブスクライバーが登録しているパブリッシャー DBCluster 内のテーブルの名前に置き換えます。

  11. サブスクライバー クラスタで、パブリッシャー クラスタのテーブルに追加された行が、サブスクライバー クラスタのテーブルに複製されていることを確認します。

    # On the subscriber database, data is synced.
    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres DATABASE_NAME
    customer=# select * from TABLE_NAME;
    id | name  | age | salary
    ----+-------+-----+--------
      1 | Quinn |  25 |  65000
      2 | Kim   |  22 |  72250
      3 | Bola  |  31 |  53000
      4 | Sasha |  33 | 105000
      5 | Yuri  |  27 |  85000
      6 | Alex  |  39 | 100000
    (6 rows)
    

追加のテーブルを手動で作成する

論理レプリケーションでは、pglogicalreplicate_ddl_command とは異なり、DDL の変更は自動的に同期されません。オープンソース ツール pgl_ddl_deploy にはソリューションが用意されていますが、サブスクライバーで DDL コマンドを手動で実行することもできます。

  1. 試しに、パブリッシャー クラスタの customer データベースに finance という新しいテーブルを作成します。

    # On the publisher database
    $ kubectl exec -ti al-2bce-publisher-0  -- /bin/bash
    Defaulted container "database" out of: database, logrotate-agent, memoryagent, dbinit (init)
    postgres@al-2bce-publisher-0:/$ psql -h localhost -U postgres customer
    customer=# create table finance (row text);
    CREATE TABLE
    customer=# insert into finance values ('critical data');
    INSERT 0 1
    customer=# ALTER PUBLICATION pub_customer ADD TABLE finance;
    ALTER PUBLICATION
    
  2. 新しいテーブルがパブリッシャー クラスタに追加されたら、サブスクライバーで DDL(テーブルの作成)を手動で適用し、サブスクライバー クラスタで次のコマンドを実行してレプリケーションを確認します。

    postgres@al-3513-subscriber-0:/$ psql -h localhost -U postgres customer
    customer=# create table finance (row text);
    CREATE TABLE
    customer=# ALTER SUBSCRIPTION sub_customer REFRESH PUBLICATION;
    ALTER SUBSCRIPTION
    customer=# select * from finance;
          row
    ---------------
    critical data
    (1 row)
    

次のステップ