使用跨数据中心复制

本页面介绍了如何在 Kubernetes 中创建和使用次要数据库集群,以使用跨数据中心复制。

如需从概念上大致了解跨数据中心复制,请参阅跨数据中心复制简介

准备工作

  • 安装 AlloyDB Omni 操作器 1.1.0 版或更高版本,以便在主数据中心的 Kubernetes 集群和次要数据中心的 Kubernetes 集群上部署 AlloyDB Omni。
  • 在主数据中心的 Kubernetes 集群上创建 AlloyDB Omni 数据库集群。启用了高可用性 (HA) 的主数据库集群不支持跨数据中心复制。如需启用跨数据中心复制,请确保在主数据库集群上停用高可用性。

创建次要数据库集群

如需创建 AlloyDB Omni 次要数据库集群并启用从主数据库集群进行复制的功能,请按照以下步骤操作:

Kubernetes

  1. 确保已在 AlloyDB Omni 主数据库集群上启用外部连接。如果未启用外部连接,请将以下内容添加到数据库集群清单的规范部分:

      kind: DBCluster
      spec:
       allowExternalIncomingTraffic: true
    
  2. 如需将跨数据中心复制与启用了高可用性的主数据库集群结合使用,您必须通过设置 AlloyDB Omni 主数据库集群清单的规范部分,在该数据库集群上停用高可用性:

      kind: DBCluster
      spec:
         availability:
           numberOfStandbys: 0
    
  3. 如需在主数据库集群上启用复制,请将类似于以下内容的清单应用于主数据中心中的 Kubernetes 集群:

     apiVersion: v1
     kind: Secret
     metadata:
       name: ha-rep-pw-DB_CLUSTER_NAME
     type: Opaque
     data:
       rep-user-pw: "ENCODED_PASSWORD"
     ---
     apiVersion: alloydbomni.dbadmin.goog/v1
     kind: Replication
     metadata:
       name: REPLICATION_NAME
     spec:
       dbcluster:
         name: DB_CLUSTER_NAME
       upstream:
         password:
           name: ha-rep-pw-DB_CLUSTER_NAME
    

    替换以下内容:

    • DB_CLUSTER_NAME:数据库集群的名称,例如 dbc-1
    • ENCODED_PASSWORD:要用于从次要数据库进行复制的数据库用户的密码(以 base64 字符串编码),例如 Q2hhbmdlTWUxMjM= for ChangeMe123。默认值为 alloydbreplica
    • REPLICATION_NAME:复制的名称,例如 replication-1

    等待复制成为准备就绪状态。

  4. 如需获取用于在次要数据库集群上配置复制的上行连接信息,请运行以下命令:

      kubectl get replication REPLICATION_NAME
      kubectl get replication REPLICATION_NAME -o json | jq .status.upstream

    示例输出类似于以下内容:

      {
       "host": "35.230.32.36",
       "password": {
         "name": "ha-rep-pw-dbc-1"
       },
       "port": 5432,
       "replicationSlotName": "dbc_1_replication_1",
       "username": "alloydbreplica"
      }
    
  5. 记下输出,因为您需要在后续步骤中使用它在次要数据库集群上启用复制。

  6. 在次要数据中心的 Kubernetes 集群上创建 AlloyDB Omni 集群,其配置与主数据库集群的配置相同。

  7. 确保已在 AlloyDB Omni 次要数据库集群上启用外部连接。

  8. 如果未启用外部连接,请将以下内容添加到其清单的规范部分:

     allowExternalIncomingTraffic: true
    
  9. 如需在次要数据库集群上启用复制,请将类似于以下内容的清单应用于次要数据中心的 Kubernetes 集群:

      apiVersion: v1
      kind: Secret
      metadata:
        name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME
      type: Opaque
      data:
        rep-user-pw: "ENCODED_PASSWORD"
      ---
      apiVersion: alloydbomni.dbadmin.goog/v1
      kind: Replication
      metadata:
        name: SECONDARY_REPLICATION_NAME
      spec:
        dbcluster:
          name: SECONDARY_DB_CLUSTER_NAME
        downstream:
          host: PRIMARY_HOST
          port: PRIMARY_PORT
          username: alloydbreplica
          password:
            name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME
          replicationSlotName: PRIMARY_REPLICATION_SLOT
          control: setup
    

    替换以下内容:

    • SECONDARY_DB_CLUSTER_NAME:次要数据库集群的名称,例如 dbc-2
    • ENCODED_PASSWORD:要用于复制主数据库集群的数据库用户的密码(以 base64 字符串编码),例如 Q2hhbmdlTWUxMjM= for ChangeMe123。默认值为 alloydbreplica
    • SECONDARY_REPLICATION_NAME:复制的名称,例如 replication-2
    • PRIMARY_HOST:第 3 步输出中的主数据库集群连接端点,次要数据库可以访问该端点以进行复制。
    • PRIMARY_PORT:第 3 步输出中的主数据库集群连接端口,次要数据库可以访问该端口以进行复制。
    • PRIMARY_REPLICATION_SLOT:第 3 步输出中的主数据库集群上的复制槽名称,次要数据库可以将其用于复制。

查看次要数据库集群上的复制

如需查看有关 AlloyDB Omni 次要数据库集群及其复制状态的详细信息,请运行以下命令:

Kubernetes

kubectl get dbcluster SECONDARY_DB_CLUSTER_NAME
kubectl get replication SECONDARY_REPLICATION_NAME

当次要数据库集群已成功设置且从主数据库集群进行流式复制时,复制状态为准备就绪且健康状况良好。

提升次要数据库集群

在提升次要数据库集群之前,请执行以下步骤,以验证次要数据库集群是否已应用从主数据库集群收到的所有事务:

Kubernetes

  • 检查次要数据库集群的复制状态,确保其处于准备就绪且健康状况良好状态。

    kubectl get replication SECONDARY_REPLICATION_NAME
  • 停止对主数据库集群的所有写入操作。对主数据库集群运行以下查询,以检查次要数据库的复制延迟时间。确认结果显示最短的延迟时间。

    理想的延迟时间值为 0。如果延迟时间超过 0,您仍然可以提升次要数据库集群,但可能会丢失在主数据库集群中已提交的某些近期事务。

     psql -h PRIMARY_HOST -U postgres -d postgres -c 'SELECT application_name, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag FROM pg_stat_replication;'

如需将次要数据库集群提升为主数据库集群,请将次要数据库集群复制清单的控制字段更新为 promote,并将其应用于次要数据中心的 Kubernetes 集群。

Kubernetes

    apiVersion: v1
    kind: Secret
    metadata:
      name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME
    type: Opaque
    data:
      rep-user-pw: "ENCODED_PASSWORD"
    ---
    apiVersion: alloydbomni.dbadmin.goog/v1
    kind: Replication
    metadata:
      name: SECONDARY_REPLICATION_NAME
    spec:
      dbcluster:
        name: SECONDARY_DB_CLUSTER_NAME
      downstream:
        host: PRIMARY_HOST
        port: PRIMARY_PORT
        username: alloydbreplica
        password:
          name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME
        replicationSlotName: PRIMARY_REPLICATION_SLOT
        control: promote

执行切换

在执行切换之前,请验证属于这两个数据中心的主数据库集群和次要数据库集群是否处于在线状态,以及数据库集群是否处于健康状况良好状态。

如需确保主数据库集群和次要数据库集群在切换期间的数据一致性,请执行以下步骤,以验证次要数据库集群是否已应用从主数据库集群收到的所有事务:

Kubernetes

  • 检查次要数据库集群的复制状态,确保其处于准备就绪且健康状况良好状态。

    kubectl get replication SECONDARY_REPLICATION_NAME
  • 停止对主数据库集群的所有写入操作。对主数据库集群运行以下查询,以检查次要数据库的复制延迟时间。确认结果显示的延迟时间值为 0

     psql -h PRIMARY_HOST -U postgres -d postgres -c 'SELECT application_name, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS replay_lag FROM pg_stat_replication;'

如需执行切换,请完成以下步骤:

Kubernetes

  1. 如需将 AlloyDB Omni 次要数据库集群转换为主数据库集群,请在次要数据中心的 Kubernetes 集群上更新其复制清单,如下所示:

       apiVersion: v1
       kind: Secret
       metadata:
        name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME
       type: Opaque
       data:
         rep-user-pw: "ENCODED_PASSWORD"
       ---
       apiVersion: alloydbomni.dbadmin.goog/v1
       kind: Replication
       metadata:
        name: SECONDARY_REPLICATION_NAME
       spec:
        dbcluster:
           name: SECONDARY_DB_CLUSTER_NAME
         upstream:
           password:
             name: ha-rep-pw-SECONDARY_DB_CLUSTER_NAME
    

    等待复制成为准备就绪状态。

  2. 如需获取用于复制的上行连接信息,请运行以下命令:

    kubectl get replication SECONDARY_REPLICATION_NAME
    kubectl get replication SECONDARY_REPLICATION_NAME -o json | jq .status.upstream

    示例输出类似于以下内容:

     {
       "host": "34.23.207.137",
       "password": {
         "name": "ha-rep-pw-dbc-2"
       },
       "port": 5432,
       "replicationSlotName": "dbc_2_replication_2",
       "username": "alloydbreplica"
     }
    
  3. 如需将 AlloyDB Omni 主数据库集群转换为次要数据库集群,请在主数据中心的 Kubernetes 集群上将其复制清单更新为类似于以下内容:

        apiVersion: v1
        kind: Secret
        metadata:
         name: ha-rep-pw-DB_CLUSTER_NAME
        type: Opaque
        data:
          rep-user-pw: "ENCODED_PASSWORD"
        ---
        apiVersion: alloydbomni.dbadmin.goog/v1
        kind: Replication
        metadata:
          name: REPLICATION_NAME
        spec:
          dbcluster:
            name: DB_CLUSTER_NAME
          downstream:
            host: SECONDARY_HOST
            port: SECONDARY_PORT
            username: alloydbreplica
            password:
              name: ha-rep-pw-DB_CLUSTER_NAME
            replicationSlotName: SECONDARY_REPLICATION_SLOT
           control: rewind
    

    等待复制成为准备就绪且健康状况良好状态。

  4. 如需验证复制状态,请使用以下命令:

    kubectl get replication REPLICATION_NAME