Skip to content

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.log

TiDB 节点手动故障转移

1. 停止故障 TiDB 节点

bash
tiup cluster stop <cluster-name> -N <tidb-ip>:4000

2. 确认故障节点已停止

bash
tiup cluster display <cluster-name> | grep <tidb-ip>

3. 移除故障节点(可选)

如果故障节点无法恢复,可以将其从集群中移除:

bash
tiup cluster scale-in <cluster-name> -N <tidb-ip>:4000

4. 添加新的 TiDB 节点(可选)

bash
# 编辑集群配置,添加新节点
tiup cluster edit-config <cluster-name>

# 扩容集群
tiup cluster scale-out <cluster-name> scale-out.yaml

5. 验证 TiDB 集群状态

bash
tiup cluster display <cluster-name> | grep tidb

PD 节点手动故障转移

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>:2379

4. 等待 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>:2379

6. 添加新的 PD 节点(可选)

bash
# 编辑集群配置,添加新节点
tiup cluster edit-config <cluster-name>

# 扩容集群
tiup cluster scale-out <cluster-name> scale-out.yaml

7. 验证 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 tikv

2. 检查 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>:20160

6. 添加新的 TiKV 节点(可选)

bash
# 编辑集群配置,添加新节点
tiup cluster edit-config <cluster-name>

# 扩容集群
tiup cluster scale-out <cluster-name> scale-out.yaml

7. 验证 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 tiflash

2. 检查 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>:9000

4. 移除故障 TiFlash 节点

bash
tiup cluster scale-in <cluster-name> -N <tiflash-ip>:9000

5. 添加新的 TiFlash 节点(可选)

bash
# 编辑集群配置,添加新节点
tiup cluster edit-config <cluster-name>

# 扩容集群
tiup cluster scale-out <cluster-name> scale-out.yaml

6. 验证 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 节点磁盘故障

  • 处理步骤
    1. 标记故障 TiKV 节点为下线
    2. 等待 Region 迁移完成
    3. 移除故障节点
    4. 添加新的 TiKV 节点

场景2:PD leader 节点故障

  • 处理步骤
    1. 等待 PD 集群自动选举新 leader
    2. 确认新 leader 选举成功
    3. 移除故障 PD 节点(可选)
    4. 添加新的 PD 节点(可选)

场景3:TiDB 节点 OOM 故障

  • 处理步骤
    1. 重启故障 TiDB 节点
    2. 分析 OOM 原因
    3. 调整 TiDB 配置,避免再次 OOM
    4. 监控 TiDB 节点内存使用

场景4:网络分区导致的集群异常

  • 处理步骤
    1. 修复网络故障
    2. 检查集群状态
    3. 必要时进行手动故障转移
    4. 验证集群恢复正常

常见问题(FAQ)

Q1: 什么时候需要进行手动故障转移?

A1: 在以下情况下需要进行手动故障转移:

  • 自动故障转移功能未启用
  • 自动故障转移失败
  • 需要在维护操作前手动转移服务
  • 特殊场景下的故障处理

Q2: 手动故障转移会影响集群可用性吗?

A2: 正确的手动故障转移操作不会影响集群可用性。但在操作过程中,如果操作不当,可能会导致集群可用性下降或数据丢失。

Q3: 如何确认手动故障转移成功?

A3: 可以通过以下方式确认:

  • 查看集群状态,确认所有节点正常运行
  • 测试业务功能,确认正常
  • 监控集群性能,确认稳定
  • 检查日志,确认没有异常

Q4: 手动故障转移失败后如何处理?

A4: 立即停止当前操作,分析失败原因,采取相应的措施,必要时联系 TiDB 官方技术支持。

Q5: 如何提高手动故障转移的效率?

A5: 可以通过以下方式提高效率:

  • 熟悉 TiDB 集群的拓扑结构和故障处理流程
  • 准备好必要的工具和命令
  • 制定详细的故障转移计划
  • 定期进行故障转移演练

Q6: 手动故障转移和自动故障转移有什么区别?

A6: 手动故障转移需要人工干预,适用于特殊场景;自动故障转移由系统自动完成,适用于大多数故障场景。自动故障转移具有速度快、可靠性高的优点,但在某些复杂场景下可能无法正常工作,需要手动干预。