外观
TiDB 网络故障
网络故障类型
1. 节点间网络中断
- 症状:节点间无法通信,集群状态异常
- 影响:可能导致 Region 不可用,事务失败
- 常见原因:网线松动、网卡故障、交换机故障、防火墙配置错误
2. 网络延迟过高
- 症状:节点间通信延迟增加,集群性能下降
- 影响:查询响应时间变长,事务提交延迟增加,Raft 选举超时
- 常见原因:网络拥塞、路由问题、硬件资源不足、网络拓扑不合理
3. 网络分区
- 症状:集群被分割成多个无法通信的子集群
- 影响:可能导致脑裂,数据不一致
- 常见原因:交换机故障、网络配置错误、大规模网络故障
4. 端口不可达
- 症状:特定端口无法访问,服务无法正常通信
- 影响:组件无法正常通信,服务不可用
- 常见原因:防火墙拦截、端口未开放、服务未启动、配置错误
网络故障诊断
1. 日志分析
bash
# 查看 TiDB 日志
tiup cluster log `<cluster-name>` --component tidb --instance `<tidb-address>`:4000 --follow
# 查看 TiKV 日志
tiup cluster log `<cluster-name>` --component tikv --instance `<tikv-address>`:20160 --follow
# 查看 PD 日志
tiup cluster log `<cluster-name>` --component pd --instance `<pd-address>`:2379 --follow2. 监控检查
bash
# 访问 TiDB Dashboard
tiup cluster display `<cluster-name>` --dashboard
# 查看网络监控
grafana http://`<grafana-address>`:3000/d/TiDB-Overview/tidb-overview?var-datasource=prometheus&var-cluster=`<cluster-name>`3. 网络工具使用
bash
# 检查节点间连通性
ping `<target-address>`
# 检查端口可达性
telnet `<target-address>` `<port>`
# 使用 nc 检查端口
nc -zv `<target-address>` `<port>`
# 检查网络延迟和丢包率
iperf3 -c `<target-address>`
# 检查路由
traceroute `<target-address>`
# 检查网络连接状态
ss -tuln
# 检查防火墙规则
iptables -L -n网络故障处理
1. 自动恢复机制
Raft 协议
TiDB 基于 Raft 协议实现数据一致性,当网络故障发生时:
- Raft 选举会在超时后重新进行
- 少数派节点会自动拒绝写请求
- 当网络恢复后,集群会自动恢复正常
PD 调度
PD 会监控集群状态,当检测到网络故障时:
- 暂停调度操作
- 当网络恢复后,自动恢复调度
- 重新平衡集群负载
2. 手动干预措施
节点间网络中断
bash
# 检查网络连接
ping `<target-address>`
# 检查网卡状态
ip link show
# 检查网络配置
ip addr show
# 重启网络服务
systemctl restart network
# 检查防火墙配置
firewall-cmd --list-all网络延迟过高
bash
# 检查网络拥塞情况
tc -s qdisc
# 检查系统负载
uptime
# 检查磁盘 I/O
iotop
# 调整网络参数
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"网络分区
bash
# 查看集群状态
tiup cluster display `<cluster-name>`
# 查看 PD 成员状态
tiup ctl pd -u http://`<pd-address>`:2379 member
# 查看 Region 状态
tiup ctl pd -u http://`<pd-address>`:2379 region status
# 手动移除故障节点(仅当确认节点无法恢复时)
tiup cluster scale-in `<cluster-name>` --node `<faulty-node-address>`:`<port>`端口不可达
bash
# 检查服务状态
systemctl status `<service-name>`
# 检查服务配置
cat `<service-config-file>`
# 检查防火墙规则
firewall-cmd --add-port=`<port>`/tcp --permanent
firewall-cmd --reload
# 检查 SELinux 状态
getenforce
setenforce 0网络故障预防
1. 网络架构设计
- 使用冗余网络架构
- 采用万兆或更高带宽网络
- 合理规划网络拓扑
- 使用专用网络进行节点间通信
2. 监控和告警
yaml
# 示例 Prometheus 告警规则
groups:
- name: network-alerts
rules:
- alert: HighNetworkLatency
expr: rate(node_network_receive_bytes_total[5m]) / rate(node_network_transmit_bytes_total[5m]) > 0.9
for: 5m
labels:
severity: warning
annotations:
summary: "High network latency on {{ $labels.instance }}"
description: "Network latency is above 90% for 5 minutes"
- alert: NetworkPacketLoss
expr: rate(node_network_transmit_drop_total[5m]) > 0
for: 5m
labels:
severity: critical
annotations:
summary: "Network packet loss on {{ $labels.instance }}"
description: "Network packet loss detected for 5 minutes"3. 定期网络测试
bash
# 定期测试节点间连通性
for node in $(tiup cluster display `<cluster-name>` | grep -E 'tidb|tikv|pd' | awk '{print $1}'); do
ping -c 5 $node
echo "---"
done
# 定期测试端口可达性
for node in $(tiup cluster display `<cluster-name>` | grep -E 'tidb|tikv|pd' | awk '{print $1}'); do
for port in 4000 20160 2379 20180; do
nc -zv $node $port
done
done4. 配置优化
toml
# TiKV 网络配置优化
[server]
# 调整 gRPC 线程数
grpc-concurrency = 8
# 调整 gRPC 超时时间
grpc-keepalive-time = "10s"
grpc-keepalive-timeout = "3s"
# PD 网络配置优化
[grpc]
# 调整 gRPC 超时时间
timeout = "3s"
# TiDB 网络配置优化
[server]
# 调整连接超时时间
tcp-keep-alive = true网络故障案例分析
案例 1: 节点间网络中断
问题现象
- 集群中一个 TiKV 节点无法与其他节点通信
- TiDB Dashboard 显示该节点状态为 Down
- 相关 Region 变为不可用
诊断过程
- 检查节点间连通性,发现 ping 失败
- 检查网卡状态,发现网卡故障
- 查看系统日志,确认网卡硬件故障
解决方案
- 更换故障网卡
- 重启网络服务
- 验证节点恢复正常
- 检查集群状态,确认 Region 恢复正常
案例 2: 网络延迟过高
问题现象
- 集群性能下降,查询响应时间变长
- 监控显示网络延迟超过 100ms
- Raft 选举超时频繁发生
诊断过程
- 使用 iperf3 测试网络带宽,发现带宽利用率接近 100%
- 检查网络流量,发现有大量异常流量
- 定位到异常流量源,是一个应用程序异常发送数据
解决方案
- 停止异常应用程序
- 调整网络 QoS,优先保障 TiDB 集群流量
- 升级网络带宽
- 验证集群性能恢复正常
案例 3: 网络分区
问题现象
- 集群被分割成两个子集群
- 两个子集群都有自己的 PD Leader
- 数据出现不一致
诊断过程
- 检查网络连接,发现交换机故障导致网络分区
- 查看 PD 日志,确认脑裂发生
- 检查数据一致性,发现部分数据不一致
解决方案
- 修复交换机故障,恢复网络连接
- 手动干预,确保只有一个 PD Leader
- 使用 TiDB Backup & Restore 工具恢复数据一致性
- 验证集群恢复正常
常见问题(FAQ)
Q1: 如何检测 TiDB 集群中的网络故障?
A1: 可以通过以下方法检测:
- 查看 TiDB Dashboard 监控
- 检查集群日志中的网络相关错误
- 使用网络工具(如 ping、telnet、iperf3)测试节点间连通性
- 配置网络监控告警
Q2: 网络故障会导致 TiDB 数据丢失吗?
A2: 在默认配置下,TiDB 保证数据一致性,网络故障不会导致数据丢失。但在极端情况下,如网络分区持续时间过长,可能会导致数据不一致,需要手动干预恢复。
Q3: 如何处理 TiKV 节点网络延迟过高的问题?
A3: 可以尝试以下解决方案:
- 检查网络拥塞情况
- 调整网络配置参数
- 优化网络拓扑
- 升级网络硬件
- 调整 TiKV 配置,如增加 gRPC 线程数
Q4: 网络分区发生时,如何避免脑裂?
A4: TiDB 通过以下机制避免脑裂:
- Raft 协议要求多数派才能提交写请求
- PD 采用 etcd 实现,自带脑裂防护
- 合理配置副本数,建议使用奇数副本(3或5)
Q5: 如何优化 TiDB 集群的网络性能?
A5: 可以尝试以下优化:
- 使用万兆或更高带宽网络
- 采用冗余网络架构
- 优化网络配置参数
- 调整 TiDB、TiKV、PD 的网络相关配置
- 合理规划网络拓扑,减少网络跳数
Q6: 如何处理 PD 节点间网络通信故障?
A6: 可以尝试以下解决方案:
- 检查 PD 节点间的网络连通性
- 查看 PD 日志,分析故障原因
- 重启故障 PD 节点
- 如无法恢复,考虑移除故障节点并添加新节点
Q7: 网络故障导致 TiKV 节点离线,如何处理?
A7: 可以尝试以下解决方案:
- 检查网络连接,修复网络故障
- 重启 TiKV 节点
- 如无法恢复,使用 tiup cluster scale-in 移除故障节点
- 使用 tiup cluster scale-out 添加新节点
Q8: 如何配置 TiDB 集群的网络监控?
A8: 可以通过以下步骤配置:
- 确保 Prometheus 和 Grafana 已部署
- 导入 TiDB 官方提供的 Grafana 仪表板
- 配置网络相关的告警规则
- 定期查看监控数据,分析网络性能
Q9: 如何测试 TiDB 集群的网络吞吐量?
A9: 可以使用以下工具测试:
- iperf3:测试网络带宽
- ping:测试网络延迟
- sysbench:测试数据库性能,间接反映网络性能
- TiDB 自带的压测工具:如 go-ycsb、tiup bench
Q10: 网络故障恢复后,如何验证 TiDB 集群恢复正常?
A10: 可以通过以下步骤验证:
- 检查集群状态:tiup cluster display
<cluster-name> - 检查所有节点状态:tiup cluster health
<cluster-name> - 运行简单查询测试:select 1;
- 运行性能测试:tiup bench tpcc --db tpcc --host
<tidb-address>--port 4000 --user root --password<password>--warehouses 10 run --time 300 - 检查数据一致性:tiup sync-diff-inspector --config ./sync-diff-config.toml
Q11: 如何处理 TiDB 集群中的防火墙问题?
A11: 可以尝试以下解决方案:
- 检查防火墙规则:iptables -L -n
- 开放 TiDB 集群所需端口:4000(TiDB)、20160(TiKV)、2379(PD)、20180(TiKV 状态)、2380(PD 节点间通信)
- 考虑关闭防火墙(仅在安全环境中)
- 使用防火墙白名单,仅允许集群节点通信
Q12: 如何处理 TiDB 集群中的 DNS 问题?
A12: 可以尝试以下解决方案:
- 使用 IP 地址代替主机名配置集群
- 检查 DNS 配置:cat /etc/resolv.conf
- 测试 DNS 解析:nslookup
<hostname> - 考虑使用本地 hosts 文件:echo "
<ip-address><hostname>" >> /etc/hosts
Q13: 如何处理 TiKV 节点间的 gRPC 连接问题?
A13: 可以尝试以下解决方案:
- 检查 gRPC 端口是否可达:nc -zv
<tikv-address>20160 - 查看 TiKV 日志中的 gRPC 相关错误
- 调整 TiKV 的 gRPC 配置参数
- 检查网络 MTU 设置,确保所有节点一致
Q14: 如何处理 TiDB 客户端连接超时问题?
A14: 可以尝试以下解决方案:
- 检查网络连通性:ping
<tidb-address> - 检查 TiDB 服务状态:tiup cluster display
<cluster-name> - 调整客户端连接超时参数
- 增加 TiDB 节点数量,分散连接负载
- 检查 TiDB 配置中的最大连接数:max-connections
Q15: 如何规划 TiDB 集群的网络拓扑?
A15: 网络拓扑规划建议:
- 使用专用网络进行节点间通信
- 采用分层网络架构,核心层、汇聚层、接入层
- 确保网络冗余,避免单点故障
- 合理规划 VLAN,隔离不同服务
- 考虑网络延迟,将相关组件部署在同一机架或机房
