Kubernetes 上的 TiDB 集群故障自动转移
由于 TiDB Operator 基于 StatefulSet
来管理 Pod,但 StatefulSet
在某些 Pod 发生故障时不会自动创建新节点来替换旧节点,所以,TiDB Operator 扩展了 StatefulSet
的这种行为,添加了 Auto Failover 功能。
Auto Failover 功能在 TiDB Operator 中默认开启。部署 TiDB Operator 时,可通过设置 charts/tidb-operator/values.yaml
文件的 controllerManager.autoFailover
为 false
关闭该功能:
pdFailoverPeriod
、tikvFailoverPeriod
、tiflashFailoverPeriod
和 tidbFailoverPeriod
默认均为 5 分钟,它们的含义是在确认实例故障后的等待超时时间,超过这个时间后,TiDB Operator 就开始做自动的故障转移。
假设 PD 集群有 3 个节点,如果一个 PD 节点挂掉超过 5 分钟(pdFailoverPeriod
可配置),TiDB Operator 首先会将这个 PD 节点下线,然后再添加一个新的 PD 节点。此时会有 4 个 Pod 同时存在,待挂掉的 PD 节点恢复后,TiDB Operator 会将新启动的节点删除掉,恢复成原来的 3 个节点。
当一个 TiKV 节点无法正常工作后,该节点的状态会变为 Disconnected
,30 分钟(通过 pd.config
文件中 [schedule]
部分的 max-store-down-time = "30m"
来配置)后会变成 状态,TiDB Operator 会在此基础上再等待 5 分钟(tikvFailoverPeriod
可配置),如果该 TiKV 节点仍不能恢复,就会新起一个 TiKV 节点。待挂掉的 TiKV 节点恢复后,TiDB Operator 不会自动删除新起的节点,用户需要手动减少 TiKV 节点,恢复成原来的节点数。操作方法是将该 TiKV 节点从 TidbCluster
对象的 status.tikv.failureStores
字段中删除:
kubectl edit tc -n ${namespace} ${cluster_name}
cluster1-tikv-0
节点恢复后,将其删除后变为:
...
tikv:
failureStores:
"2":
podName: cluster1-tikv-1
storeID: "2"
...
当一个 TiFlash 节点无法正常工作后,该节点的状态会变为 ,30 分钟(通过 pd.config
文件中 [schedule]
部分的 max-store-down-time = "30m"
来配置)后会变成 Down
状态,TiDB Operator 会在此基础上再等待 5 分钟(tiflashFailoverPeriod
可配置),如果该 TiFlash 节点仍不能恢复,就会新起一个 TiFlash 节点。待挂掉的 TiFlash 节点恢复后,TiDB Operator 不会自动删除新起的节点,用户需要手动减少 TiFlash 节点,恢复成原来的节点数。操作方法是将该 TiFlash 节点从 TidbCluster
对象的 status.tiflash.failureStores
字段中删除。
示例如下,假如有两个 TiFlash Pod 异常:
status
failureStores:
"1":
podName: cluster1-tiflash-0
storeID: "1"
"2":
podName: cluster1-tiflash-1
cluster1-tiflash-0
Pod 恢复后,将其删除后变为: