外观
TiDB 手动故障转移
TiDB 集群具有自动故障转移功能,但在某些情况下,可能需要进行手动故障转移,例如:自动故障转移功能未启用、自动故障转移失败、需要在维护操作前手动转移服务或特殊场景下的故障处理。
故障检测
1. 监控告警
通过监控系统(如 Prometheus + Grafana)检测集群故障:
- TiDB 告警:TiDB 服务不可用、连接数异常、慢查询增多等
- PD 告警:PD 集群异常、leader 切换、调度异常等
- TiKV 告警:TiKV 节点不可用、Region 异常、磁盘空间不足等
- TiFlash 告警:TiFlash 节点不可用、同步延迟等
2. 命令行检查
使用 TiUP 或其他命令行工具检查集群状态:
bash
# 查看集群状态
tiup cluster display <cluster-name>
# 查看 PD 状态
tiup cluster exec <cluster-name> -R pd -- "pd-ctl -u http://<pd-ip>:2379 member"
# 查看 TiKV 状态
tiup cluster exec <cluster-name> -R tikv -- "tikv-ctl status --host <tikv-ip>:20160"3. 日志检查
检查各组件的日志,定位故障原因:
bash
# 查看 TiDB 日志
tail -f /tidb-deploy/tidb-4000/log/tidb.log
# 查看 PD 日志
tail -f /tidb-deploy/pd-2379/log/pd.log
# 查看 TiKV 日志
tail -f /tidb-deploy/tikv-20160/log/tikv.logTiDB 节点手动故障转移
1. 停止故障 TiDB 节点
bash
tiup cluster stop <cluster-name> -N <tidb-ip>:40002. 确认故障节点已停止
bash
tiup cluster display <cluster-name> | grep <tidb-ip>3. 移除故障节点(可选)
如果故障节点无法恢复,可以将其从集群中移除:
bash
tiup cluster scale-in <cluster-name> -N <tidb-ip>:40004. 添加新的 TiDB 节点(可选)
bash
# 编辑集群配置,添加新节点
tiup cluster edit-config <cluster-name>
# 扩容集群
tiup cluster scale-out <cluster-name> scale-out.yaml5. 验证 TiDB 集群状态
bash
tiup cluster display <cluster-name> | grep tidbPD 节点手动故障转移
1. 检查 PD 集群状态
bash
tiup cluster exec <cluster-name> -R pd -- "pd-ctl -u http://<pd-ip>:2379 member"2. 确认 PD leader
bash
tiup cluster exec <cluster-name> -R pd -- "pd-ctl -u http://<pd-ip>:2379 leader"3. 停止故障 PD 节点
bash
tiup cluster stop <cluster-name> -N <pd-ip>:23794. 等待 PD 集群自动选举新 leader
bash
tiup cluster exec <cluster-name> -R pd -- "pd-ctl -u http://<pd-ip>:2379 leader"5. 移除故障 PD 节点(可选)
bash
tiup cluster scale-in <cluster-name> -N <pd-ip>:23796. 添加新的 PD 节点(可选)
bash
# 编辑集群配置,添加新节点
tiup cluster edit-config <cluster-name>
# 扩容集群
tiup cluster scale-out <cluster-name> scale-out.yaml7. 验证 PD 集群状态
bash
tiup cluster exec <cluster-name> -R pd -- "pd-ctl -u http://<pd-ip>:2379 member"TiKV 节点手动故障转移
1. 检查 TiKV 节点状态
bash
tiup cluster display <cluster-name> | grep tikv2. 检查 Region 状态
bash
tiup cluster exec <cluster-name> -R pd -- "pd-ctl -u http://<pd-ip>:2379 region check"3. 标记 TiKV 节点为下线
如果 TiKV 节点无法恢复,需要将其标记为下线:
bash
tiup cluster exec <cluster-name> -R pd -- "pd-ctl -u http://<pd-ip>:2379 store <store-id> state down"4. 等待 Region 迁移完成
bash
tiup cluster exec <cluster-name> -R pd -- "pd-ctl -u http://<pd-ip>:2379 store <store-id>"5. 移除故障 TiKV 节点
bash
tiup cluster scale-in <cluster-name> -N <tikv-ip>:201606. 添加新的 TiKV 节点(可选)
bash
# 编辑集群配置,添加新节点
tiup cluster edit-config <cluster-name>
# 扩容集群
tiup cluster scale-out <cluster-name> scale-out.yaml7. 验证 TiKV 集群状态
bash
tiup cluster display <cluster-name> | grep tikv
tiup cluster exec <cluster-name> -R pd -- "pd-ctl -u http://<pd-ip>:2379 region check"TiFlash 节点手动故障转移
1. 检查 TiFlash 节点状态
bash
tiup cluster display <cluster-name> | grep tiflash2. 检查 TiFlash 同步状态
bash
# 查看 TiFlash 同步状态
mysql -h <tidb-ip> -P 4000 -u root -e "SELECT * FROM information_schema.tiflash_replica;"3. 停止故障 TiFlash 节点
bash
tiup cluster stop <cluster-name> -N <tiflash-ip>:90004. 移除故障 TiFlash 节点
bash
tiup cluster scale-in <cluster-name> -N <tiflash-ip>:90005. 添加新的 TiFlash 节点(可选)
bash
# 编辑集群配置,添加新节点
tiup cluster edit-config <cluster-name>
# 扩容集群
tiup cluster scale-out <cluster-name> scale-out.yaml6. 验证 TiFlash 集群状态
bash
tiup cluster display <cluster-name> | grep tiflash
mysql -h <tidb-ip> -P 4000 -u root -e "SELECT * FROM information_schema.tiflash_replica;"手动故障转移最佳实践
1. 提前做好准备
- 熟悉 TiDB 集群的拓扑结构
- 掌握各组件的故障处理流程
- 准备好必要的工具和命令
- 制定详细的故障转移计划
2. 优先使用自动故障转移
- 启用 TiDB 集群的自动故障转移功能
- 仅在自动故障转移失败或特殊情况下使用手动故障转移
- 定期测试自动故障转移功能的可靠性
3. 谨慎操作
- 在进行手动故障转移前,备份重要数据
- 仔细检查故障节点的状态,确认需要进行手动故障转移
- 按照正确的步骤进行操作,避免误操作
- 操作过程中实时监控集群状态
4. 及时验证
- 故障转移完成后,及时验证集群状态
- 测试业务功能,确保正常
- 监控集群性能,确保稳定
- 记录故障转移过程和结果
5. 分析故障原因
- 故障转移完成后,分析故障原因
- 采取措施防止类似故障再次发生
- 更新故障转移计划和流程
常见故障场景处理
场景1:TiKV 节点磁盘故障
- 处理步骤:
- 标记故障 TiKV 节点为下线
- 等待 Region 迁移完成
- 移除故障节点
- 添加新的 TiKV 节点
场景2:PD leader 节点故障
- 处理步骤:
- 等待 PD 集群自动选举新 leader
- 确认新 leader 选举成功
- 移除故障 PD 节点(可选)
- 添加新的 PD 节点(可选)
场景3:TiDB 节点 OOM 故障
- 处理步骤:
- 重启故障 TiDB 节点
- 分析 OOM 原因
- 调整 TiDB 配置,避免再次 OOM
- 监控 TiDB 节点内存使用
场景4:网络分区导致的集群异常
- 处理步骤:
- 修复网络故障
- 检查集群状态
- 必要时进行手动故障转移
- 验证集群恢复正常
常见问题(FAQ)
Q1: 什么时候需要进行手动故障转移?
A1: 在以下情况下需要进行手动故障转移:
- 自动故障转移功能未启用
- 自动故障转移失败
- 需要在维护操作前手动转移服务
- 特殊场景下的故障处理
Q2: 手动故障转移会影响集群可用性吗?
A2: 正确的手动故障转移操作不会影响集群可用性。但在操作过程中,如果操作不当,可能会导致集群可用性下降或数据丢失。
Q3: 如何确认手动故障转移成功?
A3: 可以通过以下方式确认:
- 查看集群状态,确认所有节点正常运行
- 测试业务功能,确认正常
- 监控集群性能,确认稳定
- 检查日志,确认没有异常
Q4: 手动故障转移失败后如何处理?
A4: 立即停止当前操作,分析失败原因,采取相应的措施,必要时联系 TiDB 官方技术支持。
Q5: 如何提高手动故障转移的效率?
A5: 可以通过以下方式提高效率:
- 熟悉 TiDB 集群的拓扑结构和故障处理流程
- 准备好必要的工具和命令
- 制定详细的故障转移计划
- 定期进行故障转移演练
Q6: 手动故障转移和自动故障转移有什么区别?
A6: 手动故障转移需要人工干预,适用于特殊场景;自动故障转移由系统自动完成,适用于大多数故障场景。自动故障转移具有速度快、可靠性高的优点,但在某些复杂场景下可能无法正常工作,需要手动干预。
