配置订阅方集群以进行逻辑复制

本文档提供了一些示例,展示了如何手动创建和配置订阅方集群。订阅方集群是接收从发布方集群复制的数据的数据库集群。

本页中的代码段是可用作模型的示例,您可以将值替换为 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: "15.7.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 字符串,例如 ChangeMe123Q2hhbmdlTWUxMjM=

    • CPU_COUNT:此数据库集群中每个数据库实例可用的 CPU 数量。

    • MEMORY_SIZE:此数据库集群中每个数据库实例的内存量。我们建议将此值设置为每个 CPU 8 GB。例如,如果您在此清单中之前将 cpu 设置为 2,则建议将 memory 设置为 16Gi

    • 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)
    

手动创建其他表

pglogical 中的 replicate_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)
    

后续步骤