外观
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.log3. 监控 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-query、txn-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_partition、tidb_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_sent或tidb_network_bytes_received异常
解决方法
- 检查网络连接:使用
ping、telnet等命令检查 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 tidb2. 扩容 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.yaml3. 切换 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_partition、tidb_opt_agg_push_down等 - 使用 TiFlash 加速分析型查询
- 增加 TiDB 服务器资源,如 CPU、内存等
- 检查网络连接,确保网络带宽充足
Q4: TiDB 服务器内存使用量过高怎么办?
A4: 可以通过以下方法解决:
- 调整 TiDB 配置文件中的内存相关参数,如
mem-quota-query、txn-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
