使用跨数据中心复制

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

如需了解跨数据中心复制的概念概览,请参阅跨数据中心复制简介

准备工作

  • 安装 AlloyDB Omni 操作器版本 1.1.0 或更高版本,以便在主数据中心的 Kubernetes 集群和次要数据中心的 Kubernetes 集群上部署 AlloyDB Omni。
  • 在主数据中心的 Kubernetes 集群上创建 AlloyDB Omni 数据库集群

创建次要数据库集群

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

Kubernetes

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

      kind: DBCluster
      spec:
       allowExternalIncomingTraffic: true
    
  2. 如需在主数据库集群上启用复制,请将类似于以下内容的清单应用到主数据中心的 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

    等待复制状态变为“就绪”。

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

      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"
      }
    
  4. 记下输出,因为您需要在下一步中在次要数据库集群上启用复制功能。

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

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

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

     allowExternalIncomingTraffic: true
    
  8. 如需在次要数据库集群上启用复制功能,请将类似于以下内容的清单应用到次要数据中心的 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;'

如需将次要数据库集群提升为主要数据库集群,请将次要数据库集群的复制清单的 control 字段更新为 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