管理高可用性

选择文档版本:

管理 AlloyDB Omni 集群的高可用性,以通过自动故障切换和恢复机制来提高应对中断和故障的能力。

配置高可用性规范

如需配置高可用性,请在 DBCluster 规范中填写以下信息:

DBCluster:
  metadata:
    ...
  spec:
    ...
    readOnlyPort: READ_ONLY_PORT
    availability:
      numberOfStandbys: NUMBER_OF_STANDBYS
      enableStandbyAsReadReplica: true
      enableAutoFailover: true
      enableAutoHeal: true
      replayReplicationSlotsOnStandbys: true
      healthcheckPeriodSeconds: HEALTHCHECK_PERIOD
      autoFailoverTriggerThreshold: AUTOFAILOVER_TRIGGER_THRESHOLD
      autoHealTriggerThreshold: AUTOHEAL_TRIGGER_THRESHOLD

执行以下变量替换操作:

  • NUMBER_OF_STANDBYS:要设置的备用节点数。将此值设置为 0 会停用高可用性。最大值为 5。如果您不确定需要多少个备用节点,请先将值设置为 2,以实现高弹性。

  • (可选)READ_ONLY_PORT:负载均衡器或虚拟 IP 地址上用于备用只读端点的端口。默认值为 5433(主端口加 1)。

  • (可选)HEALTHCHECK_PERIOD:每次健康检查之间等待的秒数。默认值为 30。最小值为 1。最大值为 86400(一天)。

  • (可选)AUTOFAILOVER_TRIGGER_THRESHOLD:在发生故障切换之前健康检查可以失败的次数。默认值为 3。最小值为 0,但如果将该值设置为 0,AlloyDB Omni 会使用默认值。

    如果健康检查失败 AUTOFAILOVER_TRIGGER_THRESHOLD 次或持续 HEALTHCHECK_PERIOD * AUTOFAILOVER_TRIGGER_THRESHOLD 秒(默认情况下为 90 秒),则会发生自动故障切换。

  • (可选)AUTOHEAL_TRIGGER_THRESHOLD:在开始自动修复之前健康检查可以失败的次数。默认值为 5。最小值为 0,但如果将该值设置为 0,AlloyDB Omni 会使用默认值。

    如果健康检查失败 AUTOHEAL_TRIGGER_THRESHOLD 次或持续 HEALTHCHECK_PERIOD * AUTOHEAL_TRIGGER_THRESHOLD 秒,则会发生自动恢复。

验证只读备用端点

当您设置 enableStandbyAsReadReplica: true 时,负载均衡器(HAProxy 和 Keepalived 虚拟 IP 地址)会自动公开一个专用只读端点,以及主读写端点。

HAProxy 会按如下方式在活跃备用实例之间路由流量:

  • 使用 GET /isstandby 对所有备用节点运行健康检查。
  • 使用 leastconn 负载均衡在活跃备用实例之间分配读取查询。
  • 在发生故障切换时自动更新路由,而不会断开客户端与新备用拓扑的连接。

如需验证集群端点,请运行以下命令之一:

alloydbctl

alloydbctl get -d "DEPLOYMENT_SPEC" -t DBCluster -n DBCLUSTER_NAME

执行以下变量替换操作:

Ansible

  1. google.alloydbomni_orchestrator.status 角色创建 Ansible 策略方案。例如,status.yaml

    - name: STATUS_PLAYBOOK_NAME
      hosts: localhost
      vars:
        ansible_user: ANSIBLE_USER
        ansible_ssh_private_key_file: ANSIBLE_SSH_PRIVATE_KEY_FILE
      roles:
      - role: google.alloydbomni_orchestrator.status
    

    执行以下变量替换操作:

    • STATUS_PLAYBOOK_NAME:Ansible 策略方案的名称。例如,My cluster status

    • ANSIBLE_USER:Ansible 用于登录 AlloyDB Omni 节点的操作系统用户。

    • ANSIBLE_SSH_PRIVATE_KEY_FILE:Ansible 用于使用 SSH 连接到 AlloyDB Omni 节点的私钥。

  2. 运行策略方案:

    ansible-playbook status.yaml -i "DEPLOYMENT_SPEC" -e resource_type=DBCluster \
      -e resource_name=DBCLUSTER_NAME

    执行以下变量替换操作:

端点在 status.primary.endpoints 下报告:

    - Read-Write: VIRTUAL_IP:5432
    - Read-Only: VIRTUAL_IP:5433

应用 DBCluster 规范

如需应用配置的 DBCluster 规范,请运行以下命令之一:

alloydbctl

alloydbctl apply -d "DEPLOYMENT_SPEC" -r "DBCLUSTER_SPECIFICATION"

执行以下变量替换操作:

Ansible

ansible-playbook DBCLUSTER_PLAYBOOK -i "DEPLOYMENT_SPEC" \
      -e resource_spec="DBCLUSTER_SPECIFICATION"

执行以下变量替换操作:

  • RESTORE_PLAYBOOK:您为 DBCluster CRD 创建的策略方案的路径。

  • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

  • DBCLUSTER_SPECIFICATION: 您在 创建集群中创建的 DBCluster 规范的路径。

切换到备用实例

当您需要测试高可用性设置或任何其他需要切换主副本和备用副本的计划维护活动时,可以执行切换。切换发生后,复制方向以及主副本和备用副本的角色会发生反转。

切换会执行以下操作:

  1. AlloyDB Omni 编排器使主副本离线。

  2. AlloyDB Omni 编排器将备用副本提升为新的主副本。

  3. AlloyDB Omni 编排器将主副本转换为备用副本。

  4. AlloyDB Omni 启动新转换的备用副本。

执行切换

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

  1. 验证主实例和备用实例的运行状况是否良好。

  2. 验证高可用性 status.phase 是否为 Ready

    alloydbctl

    alloydbctl get -d "DEPLOYMENT_SPEC" -t DBCluster -n DBCLUSTER_SPECIFICATION -o yaml

    执行以下变量替换操作:

    Ansible

    ansible-playbook status.yaml -i DEPLOYMENT_SPEC -e resource_type=DBCluster \
      -e resource_name=DBCLUSTER_SPECIFICATION

    执行以下变量替换操作:

  3. 使用以下格式创建 Switchover 规范:

    Switchover:
      metadata:
        name: SWITCHOVER_NAME
      spec:
        dbClusterRef: DBCLUSTER_NAME
        newPrimary: NEW_PRIMARY_NAME
    

    执行以下变量替换操作:

    • SWITCHOVER_NAME:此 Switchover 规范的名称。例如,my-switchover-1。每次执行切换时,此名称都必须是唯一的。

    • DBCLUSTER_NAME: 您在 创建集群中定义的数据库集群的名称。

    • (可选)NEW_PRIMARY_NAME:是成为新主副本的备用实例。如需将实例名称映射到主机,请参阅所引用 DBCluster 的状态中的 instanceList 字段。

  4. 如果您使用的是 Ansible,请为 Switchover 规范创建策略方案。

    - name: SWITCHOVER_PLAYBOOK_NAME
      hosts: localhost
      vars:
        ansible_user: ANSIBLE_USER
        ansible_ssh_private_key_file: ANSIBLE_SSH_PRIVATE_KEY_FILE
      roles:
      - role: google.alloydbomni_orchestrator.switchover
    

    执行以下变量替换操作:

    • SWITCHOVER_PLAYBOOK_NAME:Ansible 策略方案的名称。例如,My Switchover

    • ANSIBLE_USER:Ansible 用于登录 AlloyDB Omni 节点的操作系统用户。

    • ANSIBLE_SSH_PRIVATE_KEY_FILE:Ansible 用于使用 SSH 连接到 AlloyDB Omni 节点的私钥。

  5. 应用 Switchover 规范。

    alloydbctl

    alloydbctl apply -d "DEPLOYMENT_SPEC" -r "SWITCHOVER_SPECIFICATION"

    执行以下变量替换操作:

    • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

    • SWITCHOVER_SPECIFICATION:您在第 3 步中创建的 Switchover 规范的路径。

    Ansible

    ansible-playbook SWITCHOVER_PLAYBOOK -i "DEPLOYMENT_SPEC" \
      -e resource_spec="SWITCHOVER_SPECIFICATION"

    执行以下变量替换操作:

    • SWITCHOVER_PLAYBOOK:您在第 4 步中为 Switchover CRD 创建的策略方案的路径。

    • DEPLOYMENT_SPEC: 您在 安装 AlloyDB Omni 组件中创建的部署规范的路径。

    • SWITCHOVER_SPECIFICATION:您在第 3 步中创建的 Switchover 规范的路径。

用于实现高可用性的负载平衡器

负载均衡器 (HAProxy) 通过将其节点与 Keepalived 和虚拟 IP 配对来实现高可用性。Keepalived 利用虚拟路由器冗余协议 (VRRP) 来控制浮动虚拟 IP。数据库客户端应用连接到此虚拟 IP,而不是数据库节点的 IP 地址。

在不使用专用负载均衡器的配置中,Keepalived 直接安装在数据库节点上。在这种情况下,高可用性是通过将虚拟 IP 动态分配给当前主节点来实现的,从而确保在主节点不可用时进行无缝故障切换。

为了建立稳定的选举,Keepalived 会为数据库集群节点分配 VRRP 优先级。第一个负载均衡器节点承担主角色,Keepalived 优先级较高,例如 110。后续节点充当辅助角色,优先级较低,例如 100

为了确保虚拟 IP 指向运行状况良好的节点,Keepalived 每两秒运行一次持续健康检查。这会验证 systemd HAProxy 进程的状态。如果主节点上的 HAProxy 服务失败,Keepalived 会将虚拟 IP 迁移到运行状况良好的辅助节点。

如果数据库节点的成员资格发生变化,HAProxy 和 Keepalived 会自动指向新的活跃数据库节点。底层路由配置会更新,而不会断开活跃客户端连接。

配置负载均衡器

如需为负载均衡器节点配置虚拟 IP,请将以下 dbLoadBalancerOptions 字段添加到 DBCluster 规范中的 primarySpec 字段:

DBCluster:
  spec:
    primarySpec:
      ...
      dbLoadBalancerOptions:
        onprem:
          loadBalancerIP: "VIRTUAL_IP"
          loadBalancerType: "internal"
          loadBalancerInterface: "VIRTUAL_IP_INTERFACE"

执行以下变量替换操作:

  • VIRTUAL_IP:用于浮动虚拟 IP 的静态 IP 地址。数据库客户端应用使用此处定义的 IP 地址。为了确保 Keepalived 可以成功广播免费 ARP,此 IP 地址必须可用;不能回送;如果是本地部署,则属于与主节点接口相同的子网。

  • VIRTUAL_IP_INTERFACE: 配置 VIRTUAL_IP的网络接口。 默认值为 eth0