在 Kubernetes 中管理高可用性

本文档介绍了如何在基于 Kubernetes 的 AlloyDB Omni 数据库集群上启用和测试高可用性 (HA)。本文档假定您具备有关应用 Kubernetes 清单文件和使用 kubectl 命令行工具的基本知识。

概览

您可以通过配置 AlloyDB Omni Kubernetes 操作器来创建主数据库实例的备用副本,从而在数据库集群中启用高可用性。AlloyDB Omni 运算符会将您的数据库集群配置为持续更新此副本中的数据,并与主实例上的所有数据更改保持一致。

启用高可用性

在对数据库集群启用 HA 之前,请确保您的 Kubernetes 集群具有以下特性:

  • 存储您数据的两个完整副本

  • 两个并行运行的数据库实例的计算资源

如需启用 HA,请按以下步骤操作:

  1. 修改数据库集群的清单,在其 spec 部分下添加 availability 部分。本部分使用 numberOfStandbys 参数指定要添加的待机设备数量。

    spec:
      availability:
        numberOfStandbys: NUMBER_OF_STANDBYS
    

    NUMBER_OF_STANDBYS 替换为您要添加的待机设备数量。最大值为 5。如果您不确定需要的待机数量,请先将值设置为 12

  2. 重新应用清单。

停用高可用性

如需停用 HA,请按以下步骤操作:

  1. 在集群的清单中将 numberOfStandbys 设置为 0

    spec:
      availability:
        numberOfStandbys: 0
    
  2. 重新应用清单。

验证数据库集群的高可用性

如需检查数据库集群上的高可用性 (HA) 状态,请检查其 HAReady 状态。如果 HAReady 的状态为 True,则表示高可用性已启用并在集群中运行。如果为 False,则表示已启用,但尚未准备就绪,因为它正在设置中。

如需使用 kubectl 命令行检查 HAReady 状态,请运行以下命令:

kubectl get dbcluster.alloydbomni.dbadmin.goog DB_CLUSTER_NAME -o jsonpath={.status.conditions[?(@.type == \'HAReady\')]} -n NAMESPACE

替换以下内容:

  • DB_CLUSTER_NAME:数据库集群的名称。

  • NAMESPACE:数据库集群的命名空间。

故障切换到备用实例

如果您的主实例在可配置的时间段内不可用,则 AlloyDB Omni 运维方会自动从主数据库实例故障切换到备用实例。以下参数决定何时启动自动故障切换:

  • 两次健康检查之间的时间(默认为 30 秒)

  • 连续失败的健康检查次数(默认值为 3)

在连续出现指定数量的健康检查失败后,系统会开始自动故障切换,每次健康检查失败之间相隔指定的时间。如果保留默认值,则在连续 3 次(间隔 30 秒)健康检查失败后,系统会自动进行故障切换。

如果您想从意外故障中快速恢复并尽可能缩短停机时间,则执行手动故障切换是一个不错的选择。

AlloyDB Omni 运算符同时支持自动和手动故障切换。自动故障切换功能默认处于启用状态。

故障切换会导致以下事件序列:

  1. AlloyDB Omni operator 会将主数据库实例下线。

  2. AlloyDB Omni operator 会将备用副本提升为新的主数据库实例。

  3. AlloyDB Omni operator 会删除之前的主数据库实例。

  4. AlloyDB Omni operator 会创建新的待机副本。

停用自动故障切换

数据库集群默认启用自动故障转移。

如需停用故障切换,请按以下步骤操作:

  1. 在集群的清单中将 enableAutoFailover 设置为 false

    spec:
      availability:
        enableAutoFailover: false
    

调整自动故障切换触发器设置

您可以使用设置来调整每个数据库集群的自动故障切换。

AlloyDB Omni 运维者会向主数据库实例以及所有备用副本发出定期健康检查。健康检查的默认频率为 30 秒。如果实例达到自动故障切换触发器阈值,AlloyDB Omni operator 会触发自动故障切换。

阈值值是触发故障切换之前健康检查连续失败的次数。如需更改健康检查周期或阈值,请在集群的清单中将 healthcheckPeriodSecondsautoFailoverTriggerThreshold 字段设置为整数值:

spec:
  availability:
    healthcheckPeriodSeconds: HEALTHCHECK_PERIOD
    autoFailoverTriggerThreshold: AUTOFAILOVER_TRIGGER_THRESHOLD

替换以下内容:

  • HEALTHCHECK_PERIOD:一个整数值,表示每次健康检查之间等待的秒数。默认值为 30。最小值为 1,最大值为 86400(相当于一天)。

  • AUTOFAILOVER_TRIGGER_THRESHOLD:一个整数值,表示在触发故障切换之前健康检查连续失败的次数。默认值为 3。最小值为 0。没有最大值。如果此字段设置为 0,则系统会改为使用默认值 3

触发手动故障切换

如需触发手动故障切换,请为新的故障切换资源创建并应用清单:

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Failover
metadata:
  name: FAILOVER_NAME
  namespace: NAMESPACE
spec:
  dbclusterRef: DB_CLUSTER_NAME

替换以下内容:

  • FAILOVER_NAME:此资源的名称,例如 failover-1

  • NAMESPACE:此故障切换资源的命名空间,该命名空间必须与其适用的数据库集群的命名空间一致。

  • DB_CLUSTER_NAME:要进行故障转移的数据库集群的名称。

如需监控故障切换,请运行以下命令:

kubectl get failover FAILOVER_NAME -o jsonpath={.status.state} -n NAMESPACE

替换以下内容:

  • FAILOVER_NAME:您在创建故障切换资源时为其分配的名称。

  • NAMESPACE:数据库集群的命名空间。

新主数据库实例准备就绪后,该命令会返回 Success。如需监控新的待机实例的状态,请参阅下一部分。

切换到待机实例

当您要测试灾难恢复设置或任何其他需要切换主数据库和备用副本角色的计划活动时,系统会执行切换。

切换完成后,复制方向以及主数据库实例和备用副本的角色会相反。使用切换功能,更好地控制灾难恢复设置的测试,同时不会丢失数据。

AlloyDB Omni operator 支持手动切换。切换会导致以下事件序列:

  1. AlloyDB Omni operator 会将主数据库实例下线。

  2. AlloyDB Omni operator 会将备用副本提升为新的主数据库实例。

  3. AlloyDB Omni 运算符会将之前的主数据库实例切换为备用副本。

执行切换

在开始切换之前,请执行以下操作:

如需执行切换,请为新的切换资源创建并应用清单:

apiVersion: alloydbomni.dbadmin.goog/v1
kind: Switchover
metadata:
    name: SWITCHOVER_NAME
spec:
     dbclusterRef: DB_CLUSTER_NAME
     newPrimary: STANBDY_REPLICA_NAME

替换以下内容:

  • SWITCHOVER_NAME:此切换资源的名称,例如 switchover-1

  • DB_CLUSTER_NAME:切换操作应用的主数据库实例的名称。

  • STANBDY_REPLICA_NAME:您要提升为新主实例的数据库实例的名称。

    如需确定待机副本名称,请运行以下命令:

    kubectl get instances.alloydbomni.internal.dbadmin.goog

自动修复待机实例

如果备用实例不可用,AlloyDB Omni 运维者会通过删除旧的备用副本并创建一个新的备用副本来替换它,从而修复该实例。触发自动修复的默认时间为 90 秒。

自动修复数据库集群有助于维持主数据库的健康、持续复制。

停用自动修复实例

默认情况下,数据库集群上会启用自动修复备用实例。

如需停用自动修复功能,请按以下步骤操作:

  1. 在集群的清单中,将 enableAutoHeal 设置为 false

    spec:
      availability:
        enableAutoHeal: false
    

调整自动修复触发器设置

对于每个数据库集群,您都可以使用设置来调整自动修复功能。

AlloyDB Omni operator 会定期发出您可以配置的健康检查。如需了解详情,请参阅调整自动故障切换触发器设置。如果备用副本达到自动修复触发器阈值,AlloyDB Omni 运维管理员会触发自动修复。

阈值值是触发修复之前健康检查的连续失败次数。如需更改阈值,请在集群的清单中设置 autoHealTriggerThreshold

spec:
  availability:
    autoHealTriggerThreshold: AUTOHEAL_TRIGGER_THRESHOLD

替换以下内容:

  • AUTOHEAL_TRIGGER_THRESHOLD:一个整数值,表示在触发修复之前健康检查连续失败的次数。默认值为 3。最小值为 2,因为待机状态健康检查可能会出现暂时性一次性错误。

排查实例修复问题

如果您在单个 Kubernetes 集群中使用大量数据库集群,则可能会(但不太可能)使自动修复功能过载。如果您收到以 HealthCheckProber: health check for instance failed 开头且提及超时或连接失败的错误,则可以尝试通过以下操作来缓解错误:

以下是可能由自动修复过载导致的错误示例。这些示例省略了有助于您识别错误来源的环境详细信息,例如集群名称或 IP 地址。

  • HealthCheckProber: health check for instance failed" err="DBSE0005: DBDaemon Client Error. secure dbdaemon connection failed: context deadline exceeded...

  • HealthCheckProber: health check for instance failed" err="rpc error: code = Code(10303) desc = DBSE0303: Healthcheck: Health check table query failed. dbdaemon/healthCheck: read healthcheck table: timeout...

  • HealthCheckProber: health check for instance failed" err="rpc error: code = Code(12415) desc = DBSE2415: Postgres: failed to connect to database. dbdaemon/healthCheck: failed to connect...

将待机副本用作只读实例

如需将备用副本用作只读实例,请完成以下步骤:

  1. 将数据库集群的清单中的 enableStandbyAsReadReplica 设置为 true

    spec:
      availability:
        enableStandbyAsReadReplica: true
    
  2. 重新应用清单。

  3. 验证 DBCluster 对象的 status 字段中是否报告了只读端点:

    kubectl describe dbcluster -n NAMESPACE DB_CLUSTER_NAME

    以下示例响应显示了只读实例的端点:

    Status:
    [...]
    Primary: 
      [...]
      Endpoints:
        Name: Read-Write
        Value: 10.128.0.81:5432
        Name: Read-Only
        Value: 10.128.0.82:5432