Skip to content

TiDB 故障处理流程

故障分类与等级

故障分类

根据故障影响范围和性质,TiDB 故障可分为以下几类:

1. 组件故障

  • TiDB Server 故障:包括进程崩溃、响应缓慢、SQL 执行错误等
  • TiKV Server 故障:包括节点宕机、磁盘故障、Raft 异常等
  • PD Server 故障:包括领导者选举失败、元数据损坏等
  • TiFlash 故障:包括节点宕机、查询异常等
  • 监控系统故障:包括 Prometheus、Grafana 故障等

2. 性能故障

  • 查询延迟高:SQL 执行时间过长
  • 吞吐量下降:QPS 或 TPS 明显降低
  • 资源使用率高:CPU、内存、磁盘或网络使用率异常升高
  • 热点问题:单个或多个 Region 访问频率过高

3. 数据故障

  • 数据丢失:部分或全部数据丢失
  • 数据不一致:不同副本间数据不一致
  • 数据损坏:数据文件损坏或元数据错误
  • 事务异常:事务提交失败、死锁等

4. 网络故障

  • 网络分区:集群分裂为多个子集群
  • 网络延迟:节点间通信延迟过高
  • 网络中断:节点间通信中断

故障等级

根据故障影响程度,可将故障分为以下等级:

等级影响程度响应时间要求示例
P0系统完全不可用,影响核心业务立即响应(15分钟内)TiDB 集群完全宕机,核心业务无法访问
P1系统部分不可用,影响重要业务1小时内响应部分 TiKV 节点宕机,部分业务受影响
P2系统性能下降,影响一般业务4小时内响应查询延迟升高,影响用户体验
P3系统存在隐患,可能影响业务24小时内响应单个 TiDB 节点进程重启

故障诊断方法

1. 状态检查

bash
# 检查集群状态
tiup cluster display cluster-name

# 检查节点状态
systemctl status tidb-server
systemctl status tikv-server
systemctl status pd-server
systemctl status tiflash-server

# 检查端口连通性
nc -zv <host> <port>

2. 日志分析

bash
# 查看 TiDB 错误日志
tail -f <tidb-log-path>/tidb.log | grep -i error

# 查看 TiKV 错误日志
tail -f <tikv-log-path>/tikv.log | grep -i error

# 查看 PD 错误日志
tail -f <pd-log-path>/pd.log | grep -i error

# 查看 TiFlash 错误日志
tail -f <tiflash-log-path>/tiflash.log | grep -i error

# 查看关键日志
grep -E "panic|fatal|error|warn" <log-file>

3. 监控指标分析

通过 Grafana 监控面板分析关键指标:

  • 集群状态pd_cluster_status
  • 节点状态up
  • CPU 使用率process_cpu_seconds_total
  • 内存使用率process_resident_memory_bytes
  • 磁盘 I/Odisk_io_time_seconds_total
  • 网络流量network_receive_bytes_total, network_transmit_bytes_total
  • 查询延迟tidb_executor_statement_latency
  • 热点 Regionpd_hot_region

4. 集群诊断工具

bash
# 使用 PD Control 诊断
tiup ctl pd -u http://pd-host:2379 cluster
tiup ctl pd -u http://pd-host:2379 store
tiup ctl pd -u http://pd-host:2379 hot read
tiup ctl pd -u http://pd-host:2379 hot write

# 使用 tikv-ctl 诊断
tiup ctl tikv --host tikv-host:20160 status
tiup ctl tikv --host tikv-host:20160 raft status

# 使用 TiDB 诊断工具
tiup cluster diag cluster-name [-N nodes] [-R roles]

5. SQL 诊断

sql
-- 查看当前执行的 SQL
SHOW PROCESSLIST;

-- 查看慢查询日志
SELECT * FROM mysql.slow_log LIMIT 10;

-- 查看事务状态
SELECT * FROM information_schema.innodb_trx;

-- 查看锁状态
SELECT * FROM information_schema.innodb_locks;
SELECT * FROM information_schema.innodb_lock_waits;

故障处理流程

1. 故障发现与上报

  • 自动发现:通过监控系统、告警系统自动发现故障
  • 手动发现:用户或运维人员手动发现故障
  • 故障上报:通过邮件、短信、电话等方式上报故障
  • 故障记录:记录故障发生时间、现象、影响范围等信息

2. 故障评估与定级

  • 评估影响范围:确定故障影响的业务范围和用户数量
  • 评估严重程度:根据故障等级定义,确定故障等级
  • 评估恢复时间:初步估算故障恢复所需时间
  • 制定响应策略:根据故障等级和影响范围,制定响应策略

3. 故障定位与分析

  • 收集信息:收集日志、监控数据、系统状态等信息
  • 定位故障点:通过分析信息,定位具体的故障点
  • 分析故障原因:确定故障的根本原因
  • 验证故障原因:通过测试或模拟,验证故障原因的准确性

4. 故障修复与恢复

  • 制定修复方案:根据故障原因,制定详细的修复方案
  • 执行修复操作:按照修复方案,执行修复操作
  • 验证修复效果:验证故障是否已经修复
  • 恢复业务:逐步恢复受影响的业务

常见故障处理示例

1. TiDB Server 宕机

处理流程

  1. 发现故障:监控系统告警,TiDB Server 节点宕机
  2. 评估影响:如果是唯一的 TiDB 节点,系统完全不可用(P0);如果是多个 TiDB 节点之一,系统仍可用但性能下降(P2)
  3. 定位故障:查看 TiDB 日志,确定宕机原因
  4. 修复故障
    bash
    # 尝试重启 TiDB 服务
    systemctl restart tidb-server
    # 或使用 TiUP 重启
    tiup cluster restart cluster-name -N <tidb-node>
  5. 验证恢复:检查 TiDB 节点状态,确认服务已恢复
  6. 分析原因:查看日志,分析宕机原因,制定改进措施

2. TiKV Server 磁盘故障

处理流程

  1. 发现故障:监控系统告警,TiKV Server 磁盘使用率 100%
  2. 评估影响:如果是多个 TiKV 节点之一,系统仍可用但性能下降(P2)
  3. 定位故障:查看 TiKV 日志,确认磁盘空间不足
  4. 修复故障
    bash
    # 清理磁盘空间
    rm -rf /path/to/unnecessary/files
    # 或扩容磁盘
    # 如果磁盘损坏,需要替换磁盘并重新部署 TiKV 节点
    tiup cluster scale-out cluster-name ./new-tikv.yaml
    tiup cluster scale-in cluster-name --node <faulty-node>
  5. 验证恢复:检查 TiKV 节点状态,确认服务已恢复
  6. 分析原因:分析磁盘空间增长原因,制定容量规划改进措施

3. PD 领导者选举失败

处理流程

  1. 发现故障:监控系统告警,PD 集群失去领导者
  2. 评估影响:PD 集群无法正常工作,影响 TiDB 集群调度(P1)
  3. 定位故障:查看 PD 日志,确认领导者选举失败原因
  4. 修复故障
    bash
    # 检查 PD 节点状态
    tiup cluster display cluster-name -R pd
    # 重启 PD 节点
    tiup cluster restart cluster-name -R pd
  5. 验证恢复:检查 PD 集群状态,确认领导者已选举成功
  6. 分析原因:分析领导者选举失败原因,制定改进措施

故障处理最佳实践

1. 建立完善的监控告警体系

  • 配置全面的监控指标
  • 设置合理的告警阈值
  • 建立多级告警机制
  • 确保告警能够及时送达

2. 制定详细的故障处理预案

  • 针对常见故障制定详细的处理流程
  • 明确各角色的职责和权限
  • 定期更新故障处理预案
  • 进行故障演练,验证预案的有效性

3. 培养专业的运维团队

  • 加强运维人员的技术培训
  • 建立知识共享机制
  • 鼓励运维人员参与故障处理
  • 建立故障处理经验库

4. 采用自动化故障处理工具

  • 使用自动化工具进行故障检测和诊断
  • 实现部分故障的自动修复
  • 建立自动化的故障处理流程
  • 提高故障处理效率

5. 建立完善的文档体系

  • 记录所有故障的处理过程和结果
  • 建立故障案例库
  • 定期进行故障分析和总结
  • 更新相关文档和流程

故障处理工具与资源

1. 官方工具

  • TiUP:集群部署、管理和监控
  • PD Control:PD 集群管理和诊断
  • tikv-ctl:TiKV 节点管理和诊断
  • tidb-ctl:TiDB 节点管理和诊断
  • TiDB Dashboard:Web 界面的集群管理和监控

2. 第三方工具

  • Prometheus:监控数据收集和存储
  • Grafana:监控数据可视化
  • ELK Stack:日志收集、存储和分析
  • Zabbix:系统监控和告警

常见问题(FAQ)

Q1: 如何快速定位 TiDB 集群故障?

A1: 可以按照以下步骤快速定位故障:

  1. 检查集群状态:tiup cluster display cluster-name
  2. 查看监控面板,关注关键指标
  3. 查看错误日志,定位具体错误
  4. 使用诊断工具收集更多信息
  5. 进行针对性的测试和验证

Q2: TiDB 集群完全宕机怎么办?

A2: 如果 TiDB 集群完全宕机,建议采取以下措施:

  1. 立即检查所有节点的状态
  2. 优先恢复 PD 集群,确保领导者选举成功
  3. 恢复 TiKV 集群,确保多数派节点正常运行
  4. 恢复 TiDB 节点,确保 SQL 服务可用
  5. 逐步恢复业务,验证系统可用性

Q3: 如何处理 TiKV 热点问题?

A3: 处理 TiKV 热点问题的步骤:

  1. 使用 PD Control 查看热点信息:tiup ctl pd -u http://pd-host:2379 hot read/write
  2. 分析热点原因,可能是数据分布不均或访问模式问题
  3. 采取相应措施:
    • 优化 SQL 查询,减少热点访问
    • 调整表结构,使用分区表分散热点
    • 调整 PD 调度策略,加速热点迁移
    • 使用打散列或随机前缀等方式分散热点

Q4: 如何避免类似故障再次发生?

A4: 避免类似故障再次发生的措施:

  1. 进行根因分析,确定故障的根本原因
  2. 制定针对性的改进措施
  3. 更新相关文档和流程
  4. 进行故障演练,验证改进措施的有效性
  5. 加强监控和告警,提高故障发现能力
  6. 定期进行系统维护和优化

Q5: 故障处理过程中需要注意什么?

A5: 故障处理过程中需要注意:

  1. 保持冷静,按照既定流程处理
  2. 详细记录故障处理过程
  3. 避免盲目操作,确保每一步操作都有明确的目的
  4. 优先恢复核心业务,减少故障影响
  5. 及时与相关人员沟通,保持信息透明
  6. 故障恢复后,进行全面的验证和测试