Kubernetes 上的 TiDB 集群故障自动转移

优质
小牛编辑
141浏览
2023-12-01

故障自动转移是指在 TiDB 集群的某些节点出现故障时,TiDB Operator 会自动添加一个节点,保证 TiDB 集群的高可用,类似于 K8s 的 Deployment 行为。

由于 TiDB Operator 基于 StatefulSet 来管理 Pod,但 StatefulSet 在某些 Pod 发生故障时不会自动创建新节点来替换旧节点,所以,TiDB Operator 扩展了 StatefulSet 的这种行为,添加了 Auto Failover 功能。

Auto Failover 功能在 TiDB Operator 中默认开启。部署 TiDB Operator 时,可通过设置 charts/tidb-operator/values.yaml 文件的 controllerManager.autoFailoverfalse 关闭该功能:

controllerManager:
 serviceAccount: tidb-controller-manager
 logLevel: 2
 replicas: 1
 resources:
   limits:
     cpu: 250m
     memory: 150Mi
   requests:
     cpu: 80m
     memory: 50Mi
 # autoFailover is whether tidb-operator should auto failover when failure occurs
 autoFailover: true
 # pd failover period default(5m)
 pdFailoverPeriod: 5m
 # tikv failover period default(5m)
 tikvFailoverPeriod: 5m
 # tidb failover period default(5m)
 tidbFailoverPeriod: 5m
 # tiflash failover period default(5m)
 tiflashFailoverPeriod: 5m

pdFailoverPeriodtikvFailoverPeriodtiflashFailoverPeriodtidbFailoverPeriod 默认均为 5 分钟,它们的含义是在确认实例故障后的等待超时时间,超过这个时间后,TiDB Operator 就开始做自动的故障转移。

实现原理

TiDB 集群有 PD、TiKV 和 TiDB 三个组件,它们的故障转移策略有所不同,本节将详细介绍这三种策略。

PD 故障转移策略

假设 PD 集群有 3 个节点,如果一个 PD 节点挂掉超过 5 分钟(pdFailoverPeriod 可配置),TiDB Operator 首先会将这个 PD 节点下线,然后再添加一个新的 PD 节点。此时会有 4 个 Pod 同时存在,待挂掉的 PD 节点恢复后,TiDB Operator 会将新启动的节点删除掉,恢复成原来的 3 个节点。

TiKV 故障转移策略

当一个 TiKV Pod 无法正常工作后,该 Pod 对应的 Store 状态会变为 Disconnected,30 分钟(通过 pd.config 文件中 [schedule] 部分的 max-store-down-time = "30m" 来配置)后会变成 Down 状态,TiDB Operator 会在此基础上再等待 5 分钟(tikvFailoverPeriod 可配置),如果该 TiKV Pod 仍不能恢复,就会新起一个 TiKV Pod。异常的 TiKV Pod 恢复后,考虑到自动缩容会引起数据的迁移,TiDB Operator 不会自动缩容新起的 Pod。

如果所有异常的 TiKV Pod 都已经恢复,这时如果需要缩容新起的 Pod,请参考以下步骤:

配置 spec.tikv.recoverFailover: true (从 TiDB Operator v1.1.5 开始支持):

kubectl edit tc -n ${namespace} ${cluster_name}

TiDB Operator 会自动将新起的 TiKV Pod 缩容,请在集群缩容完成后,配置 spec.tikv.recoverFailover: false,避免下次发生故障转移并恢复后自动缩容。

TiDB 故障转移策略

假设 TiDB 集群有 3 个节点,TiDB 的故障转移策略跟 Kubernetes 中的 Deployment 的是一致的。如果一个 TiDB 节点挂掉超过 5 分钟(tidbFailoverPeriod 可配置),TiDB Operator 会添加一个新的 TiDB 节点。此时会有 4 个 Pod 同时存在,待挂掉的 TiDB 节点恢复后,TiDB Operator 会将新启动的节点删除掉,恢复成原来的 3 个节点。

TiFlash 故障转移策略

当一个 TiFlash Pod 无法正常工作后,该 Pod 对应的 Store 状态会变为 Disconnected,30 分钟(通过 pd.config 文件中 [schedule] 部分的 max-store-down-time = "30m" 来配置)后会变成 Down 状态,TiDB Operator 会在此基础上再等待 5 分钟(tiflashFailoverPeriod 可配置),如果该 TiFlash Pod 仍不能恢复,就会新起一个 TiFlash Pod。异常的 TiFlash Pod 恢复后,考虑到自动缩容会引起数据的迁移,TiDB Operator 不会自动缩容新起的 Pod。

如果所有异常的 TiFlash Pod 都已经恢复,这时如果需要缩容新起的 Pod,请参考以下步骤:

配置 spec.tiflash.recoverFailover: true (从 TiDB Operator v1.1.5 开始支持):

kubectl edit tc -n ${namespace} ${cluster_name}

TiDB Operator 会自动将新起的 TiFlash Pod 缩容,请在集群缩容完成后,配置 spec.tiflash.recoverFailover: false,避免下次发生故障转移并恢复后自动缩容。