在 Kubernetes 中管理高可用性

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

概览

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

启用高可用性

在数据库集群中启用高可用性之前,请确保您的 Kubernetes 集群满足以下条件:

  • 可用于两个完整数据副本的存储空间

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

如需启用高可用性,请按以下步骤操作:

  1. 修改数据库集群的清单,使其 spec 部分下包含 availability 部分。此部分使用 numberOfStandbys 参数指定要添加的备用实例数量。

    spec:
      availability:
        numberOfStandbys: NUMBER_OF_STANDBYS
    

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

  2. 重新应用清单。

停用高可用性

如需停用高可用性,请按以下步骤操作:

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

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

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

如需检查数据库集群的高可用性状态,请检查其 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 操作器使主数据库实例离线。

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

  3. AlloyDB Omni 操作器删除之前的主数据库实例。

  4. AlloyDB Omni 操作器创建新的备用副本。

停用自动故障切换

自动故障切换在数据库集群上默认处于启用状态。

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

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

    spec:
      availability:
        enableAutoFailover: false
    

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

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

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

阈值是指在触发故障切换之前健康检查连续失败的次数。如需更改健康检查周期或阈值,请在集群的清单中将 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 操作器支持手动切换。切换会导致以下事件序列:

  1. AlloyDB Omni 操作器使主数据库实例离线。

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

  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 操作器会进行定期健康检查(您可以对其进行配置)。如需了解详情,请参阅调整自动故障切换触发器设置。如果备用副本达到自动修复触发器阈值,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