Skip to content

TiDB 服务器故障处理

TiDB 服务器是 TiDB 集群的核心组件之一,负责处理客户端请求、执行 SQL 语句、管理事务等。当 TiDB 服务器出现故障时,会影响整个集群的可用性和性能。本文档介绍 TiDB 服务器常见故障的识别、定位和解决方法。

故障识别

1. 监控告警

通过 Prometheus 和 Grafana 监控 TiDB 服务器的关键指标,设置合理的告警阈值,当指标超过阈值时,会触发告警通知。常见的 TiDB 服务器告警指标包括:

  • tidb_server_start_time:TiDB 服务器启动时间,用于判断 TiDB 服务器是否重启
  • tidb_connection_count:TiDB 服务器当前连接数,用于判断连接数是否过高
  • tidb_query_duration_seconds:TiDB 服务器查询延迟,用于判断查询性能是否异常
  • tidb_transaction_duration_seconds:TiDB 服务器事务延迟,用于判断事务性能是否异常
  • tidb_memory_usage_bytes:TiDB 服务器内存使用量,用于判断内存是否不足
  • tidb_cpu_usage:TiDB 服务器 CPU 使用率,用于判断 CPU 是否过载

2. 日志分析

通过分析 TiDB 服务器的日志,识别故障类型和原因。TiDB 服务器日志默认保存在 tidb.log 文件中,日志级别可以通过配置文件调整。常见的故障日志包括:

  • 连接拒绝:日志中出现 "too many connections" 或 "connection refused" 等关键词
  • 内存不足:日志中出现 "out of memory" 或 "memory limit exceeded" 等关键词
  • CPU 过载:日志中出现 "cpu usage high" 或 "slow query" 等关键词
  • 磁盘空间不足:日志中出现 "disk full" 或 "no space left on device" 等关键词
  • 网络故障:日志中出现 "connection timeout" 或 "network error" 等关键词

3. 客户端反馈

客户端应用程序可能会反馈连接 TiDB 服务器失败、查询超时、事务失败等问题,这些反馈也是识别 TiDB 服务器故障的重要依据。

故障定位

1. 检查 TiDB 服务器状态

bash
# 使用 tiup 查看 TiDB 服务器状态
tiup cluster display cluster-name | grep tidb

# 使用 tidb-ctl 查看 TiDB 服务器状态
tiup tidb-ctl status --host tidb-host --port <tidb-status-port>

2. 查看 TiDB 服务器日志

bash
# 查看 TiDB 服务器最新日志
tail -n 100 <tidb-log-path>/tidb.log

# 查看 TiDB 服务器错误日志
grep -i error <tidb-log-path>/tidb.log

# 查看 TiDB 服务器慢查询日志
tail -n 100 <tidb-log-path>/slow-query.log

3. 监控 TiDB 服务器指标

通过 Grafana 监控面板查看 TiDB 服务器的关键指标,包括连接数、查询延迟、事务延迟、内存使用量、CPU 使用率等,帮助定位故障原因。

4. 检查系统资源

bash
# 检查 CPU 使用率
top -p <tidb-pid>

# 检查内存使用量
free -h

# 检查磁盘空间
df -h

# 检查磁盘 I/O
iostat -x

# 检查网络连接
netstat -an | grep tidb-port

常见故障及解决方法

1. 连接数过多

故障现象

  • 客户端连接 TiDB 服务器失败,提示 "too many connections"
  • TiDB 服务器日志中出现 "too many connections" 关键词
  • 监控指标 tidb_connection_count 达到或超过配置的最大连接数

解决方法

  • 调整最大连接数:修改 TiDB 配置文件中的 max_connections 参数,增加最大连接数
    toml
    [server]
    max_connections = 3000
  • 优化客户端连接池:调整客户端应用程序的连接池配置,减少空闲连接数和最大连接数
  • 关闭空闲连接:修改 TiDB 配置文件中的 wait_timeout 参数,缩短空闲连接超时时间
    toml
    [server]
    wait_timeout = 3600
  • 监控连接数:设置连接数告警,当连接数接近阈值时,及时采取措施

2. 内存不足

故障现象

  • TiDB 服务器日志中出现 "out of memory" 或 "memory limit exceeded" 关键词
  • TiDB 服务器进程被 OOM killer 杀死
  • 监控指标 tidb_memory_usage_bytes 达到或超过系统内存

解决方法

  • 增加系统内存:为 TiDB 服务器节点增加物理内存
  • 调整 TiDB 内存配置:修改 TiDB 配置文件中的内存相关参数,如 mem-quota-querytxn-total-size-limit
    toml
    [performance]
    mem-quota-query = 10737418240
    
    [transaction]
    txn-total-size-limit = 10737418240
  • 优化查询:优化占用内存较多的查询,如减少返回结果集大小、增加索引等
  • 限制并发查询:通过 TiDB 配置文件中的 concurrency-limit 参数,限制并发查询数量
    toml
    [performance]
    concurrency-limit = 100

3. CPU 过载

故障现象

  • TiDB 服务器 CPU 使用率达到 100%
  • 查询延迟增加,事务处理时间延长
  • 监控指标 tidb_cpu_usage 持续高位

解决方法

  • 增加 CPU 资源:为 TiDB 服务器节点增加 CPU 核心数
  • 优化查询:优化占用 CPU 较多的查询,如增加索引、重写 SQL 语句等
  • 限制查询并发度:通过 TiDB 配置文件中的 concurrency-limit 参数,限制并发查询数量
  • 调整 TiDB 配置:修改 TiDB 配置文件中的 tidb_enable_table_partitiontidb_opt_agg_push_down 等参数,优化查询执行计划
  • 使用 TiFlash:将分析型查询路由到 TiFlash 执行,减轻 TiDB 服务器的 CPU 压力

4. 磁盘空间不足

故障现象

  • TiDB 服务器日志中出现 "disk full" 或 "no space left on device" 关键词
  • 监控指标 tidb_disk_usage 达到或超过 90%
  • TiDB 服务器无法写入日志或临时文件

解决方法

  • 清理磁盘空间:删除不需要的日志文件、临时文件等,释放磁盘空间
  • 扩展磁盘容量:为 TiDB 服务器节点增加磁盘容量
  • 调整日志配置:修改 TiDB 配置文件中的日志保留策略,减少日志文件大小和保留时间
    toml
    [log]
    max-size = 100
    max-days = 7
  • 分离日志和数据目录:将 TiDB 服务器的日志目录和数据目录挂载到不同的磁盘上,避免相互影响

5. 网络故障

故障现象

  • TiDB 服务器无法连接到 PD 或 TiKV 集群
  • 客户端连接 TiDB 服务器超时
  • 监控指标 tidb_network_bytes_senttidb_network_bytes_received 异常

解决方法

  • 检查网络连接:使用 pingtelnet 等命令检查 TiDB 服务器与其他组件之间的网络连接
  • 检查防火墙配置:确保 TiDB 服务器的端口(默认 4000、10080)已在防火墙中开放
  • 调整网络配置:优化 TiDB 服务器的网络配置,如调整 TCP 缓冲区大小、启用 TCP 快速打开等
  • 增加网络带宽:如果网络带宽不足,考虑增加网络带宽

6. 配置错误

故障现象

  • TiDB 服务器无法启动
  • TiDB 服务器启动后异常退出
  • TiDB 服务器日志中出现 "invalid configuration" 或 "unknown configuration" 关键词

解决方法

  • 检查配置文件:使用 tiup cluster check-config 命令检查 TiDB 配置文件是否正确
  • 查看错误日志:分析 TiDB 服务器启动日志,找出配置错误的具体原因
  • 恢复默认配置:如果无法确定配置错误的原因,可以先恢复默认配置,然后逐步调整
  • 参考官方文档:查阅 TiDB 官方文档,确保配置参数的名称和值都正确

故障恢复

1. 重启 TiDB 服务器

当 TiDB 服务器出现故障无法正常运行时,可以通过 TiUP 工具重启 TiDB 服务器:

bash
# 重启单个 TiDB 服务器
tiup cluster restart cluster-name -N tidb-host:tidb-port

# 重启所有 TiDB 服务器
tiup cluster restart cluster-name -R tidb

2. 扩容 TiDB 服务器

当 TiDB 服务器资源不足时,可以通过 TiUP 工具扩容 TiDB 服务器:

bash
# 编辑扩容拓扑文件
cat > tidb-scale-out.yaml << EOF
tidb_servers:
  - host: <new-tidb-host>
    port: 4000
    status_port: 10080
    deploy_dir: /tidb-deploy/tidb-4000
    data_dir: /tidb-data/tidb-4000
EOF

# 执行扩容操作
tiup cluster scale-out cluster-name tidb-scale-out.yaml

3. 切换 TiDB 服务器

当主 TiDB 服务器出现故障时,可以将客户端请求切换到备用 TiDB 服务器。如果使用了负载均衡器(如 HAProxy、Nginx),可以通过负载均衡器自动切换;如果没有使用负载均衡器,需要手动修改客户端连接配置。

故障预防

1. 合理配置资源

根据业务需求和数据规模,为 TiDB 服务器配置足够的 CPU、内存、磁盘和网络资源,避免资源不足导致故障。

2. 优化查询和事务

  • 优化 SQL 查询语句,减少不必要的计算和数据传输
  • 合理设计表结构和索引,提高查询性能
  • 控制事务大小,避免长事务和大事务
  • 使用合适的隔离级别,平衡一致性和性能

3. 定期监控和维护

  • 定期检查 TiDB 服务器的监控指标,及时发现异常
  • 定期分析 TiDB 服务器的日志,找出潜在问题
  • 定期清理不需要的日志和临时文件,释放磁盘空间
  • 定期备份 TiDB 服务器的配置文件,以便在故障时快速恢复

4. 高可用部署

  • 部署多个 TiDB 服务器节点,实现负载均衡和故障转移
  • 使用负载均衡器(如 HAProxy、Nginx)分发客户端请求
  • 配置合理的监控告警,及时发现和处理故障

常见问题(FAQ)

Q1: TiDB 服务器突然重启怎么办?

A1: 首先查看 TiDB 服务器的日志,找出重启的原因。常见的重启原因包括:

  • 内存不足,被 OOM killer 杀死
  • CPU 过载,导致系统不稳定
  • 配置错误,导致 TiDB 服务器异常退出
  • 硬件故障,如磁盘损坏、电源故障等

根据日志分析结果,采取相应的解决措施,如增加内存、优化查询、修复配置错误、更换硬件等。

Q2: TiDB 服务器连接数过高怎么办?

A2: 可以通过以下方法解决:

  • 调整 TiDB 配置文件中的 max_connections 参数,增加最大连接数
  • 优化客户端连接池配置,减少空闲连接数和最大连接数
  • 关闭空闲连接,修改 TiDB 配置文件中的 wait_timeout 参数
  • 监控连接数,设置连接数告警,及时采取措施

Q3: TiDB 服务器查询延迟高怎么办?

A3: 可以通过以下方法解决:

  • 优化查询语句,增加索引,重写 SQL 语句
  • 调整 TiDB 配置参数,如 tidb_enable_table_partitiontidb_opt_agg_push_down
  • 使用 TiFlash 加速分析型查询
  • 增加 TiDB 服务器资源,如 CPU、内存等
  • 检查网络连接,确保网络带宽充足

Q4: TiDB 服务器内存使用量过高怎么办?

A4: 可以通过以下方法解决:

  • 调整 TiDB 配置文件中的内存相关参数,如 mem-quota-querytxn-total-size-limit
  • 优化查询,减少返回结果集大小
  • 限制并发查询数量,修改 TiDB 配置文件中的 concurrency-limit 参数
  • 增加系统内存,为 TiDB 服务器节点增加物理内存

Q5: TiDB 服务器无法连接到 PD 集群怎么办?

A5: 可以通过以下方法解决:

  • 检查 TiDB 服务器与 PD 集群之间的网络连接
  • 检查 PD 集群是否正常运行
  • 检查 TiDB 配置文件中的 PD 地址是否正确
  • 检查防火墙配置,确保 PD 端口(默认 2379)已开放

Q6: TiDB 服务器无法连接到 TiKV 集群怎么办?

A6: 可以通过以下方法解决:

  • 检查 TiDB 服务器与 TiKV 集群之间的网络连接
  • 检查 TiKV 集群是否正常运行
  • 检查 TiDB 配置文件中的 TiKV 地址是否正确
  • 检查防火墙配置,确保 TiKV 端口(默认 20160)已开放

Q7: 如何提高 TiDB 服务器的可用性?

A7: 可以通过以下方法提高 TiDB 服务器的可用性:

  • 部署多个 TiDB 服务器节点,实现负载均衡和故障转移
  • 使用负载均衡器(如 HAProxy、Nginx)分发客户端请求
  • 配置合理的监控告警,及时发现和处理故障
  • 定期备份 TiDB 服务器的配置文件和数据
  • 制定详细的故障恢复计划,定期进行演练

Q8: 如何优化 TiDB 服务器的性能?

A8: 可以通过以下方法优化 TiDB 服务器的性能:

  • 合理配置 CPU、内存、磁盘和网络资源
  • 优化查询语句和事务,减少不必要的计算和数据传输
  • 合理设计表结构和索引,提高查询性能
  • 调整 TiDB 配置参数,优化查询执行计划
  • 使用 TiFlash 加速分析型查询
  • 定期收集统计信息,更新查询执行计划

Q9: 如何监控 TiDB 服务器的状态?

A9: 可以通过以下方法监控 TiDB 服务器的状态:

  • 使用 Prometheus 和 Grafana 监控 TiDB 服务器的关键指标
  • 分析 TiDB 服务器的日志,识别潜在问题
  • 使用 tiup cluster display 命令查看 TiDB 服务器的运行状态
  • 使用 tidb-ctl 工具查看 TiDB 服务器的详细信息

Q10: 如何备份和恢复 TiDB 服务器的配置?

A10: 可以通过以下方法备份和恢复 TiDB 服务器的配置:

  • 备份 TiDB 配置文件:cp /tidb-deploy/tidb-4000/conf/tidb.toml /backup/tidb.toml
  • 恢复 TiDB 配置文件:cp /backup/tidb.toml /tidb-deploy/tidb-4000/conf/tidb.toml
  • 重启 TiDB 服务器:tiup cluster restart cluster-name -N tidb-host:tidb-port