外观
TiDB PD 服务器故障处理
PD 服务器故障类型
单节点故障
单节点故障是指 PD 集群中单个节点出现故障,包括:
- 进程崩溃
- 机器宕机
- 网络隔离
- 磁盘故障
多节点故障
多节点故障是指 PD 集群中多个节点同时出现故障,包括:
- 多数派节点故障
- 网络分区导致集群分裂
- 大规模硬件故障
数据一致性故障
数据一致性故障是指 PD 集群数据出现不一致,包括:
- 元数据损坏
- Raft 日志不一致
- 数据丢失
故障诊断方法
状态检查
bash
# 检查 PD 进程状态
systemctl status pd-server
# 检查 PD 端口连通性
nc -zv <pd-host> 2379
# 使用 TiUP 查看 PD 节点状态
tiup cluster display <cluster-name> -R pd日志分析
bash
# 查看 PD 错误日志
tail -f <pd-log-path>/pd.log | grep -i error
# 查看 PD 关键日志
grep -E "panic|fatal|error|warn" <pd-log-path>/pd.log
# 查看 PD 选举日志
grep -i election <pd-log-path>/pd.log监控指标
通过 Grafana 监控面板查看 PD 关键指标:
- PD 节点状态:
pd_cluster_status - PD 领导者状态:
pd_is_leader - PD 心跳延迟:
pd_heartbeat_timestamp_diff_seconds - Raft 状态:
pd_raft_is_leader,pd_raft_state_count - 存储使用:
pd_store_size,pd_store_available
集群诊断
bash
# 使用 PD Control 查看集群状态
tiup ctl pd -u http://<pd-host>:2379 cluster
# 查看 PD 成员信息
tiup ctl pd -u http://<pd-host>:2379 member
# 查看 PD 存储状态
tiup ctl pd -u http://<pd-host>:2379 store
# 查看 PD 配置
tiup ctl pd -u http://<pd-host>:2379 config show单节点故障处理
进程崩溃故障
故障现象
- PD 进程不存在
- 监控显示该节点状态为 Down
- 日志中出现 panic 或 fatal 错误
处理步骤
查看日志定位原因:
bashtail -n 1000 <pd-log-path>/pd.log | grep -i panic尝试重启 PD 服务:
bashsystemctl restart pd-server # 或使用 TiUP 重启 tiup cluster restart <cluster-name> -N <pd-node>验证节点恢复:
bashtiup cluster display <cluster-name> -N <pd-node>检查集群状态:
bashtiup ctl pd -u http://<pd-host>:2379 cluster
机器宕机故障
故障现象
- 机器无法访问
- Ping 不通
- SSH 连接失败
处理步骤
确认机器状态:
bashping <pd-host> ssh <pd-host> uptime尝试恢复机器:
- 联系机房人员检查硬件
- 重启物理机器或虚拟机
恢复 PD 服务:
bash# 机器恢复后,重启 PD 服务 systemctl start pd-server # 或使用 TiUP 启动 tiup cluster start <cluster-name> -N <pd-node>验证集群状态:
bashtiup cluster display <cluster-name> tiup ctl pd -u http://<pd-host>:2379 cluster
网络隔离故障
故障现象
- 机器可以访问,但 PD 服务无法访问
- 监控显示该节点与其他节点心跳中断
- 日志中出现大量网络连接错误
处理步骤
检查网络连接:
bash# 检查 PD 端口连通性 nc -zv <pd-host> 2379 # 检查与其他 PD 节点的连通性 ssh <pd-host> ping <other-pd-host>检查防火墙规则:
bashiptables -L -n # 或检查云平台安全组规则检查网络设备:
- 检查交换机、路由器状态
- 检查网络线缆连接
验证网络恢复:
bash# 确认网络恢复后,检查 PD 服务状态 tiup cluster display <cluster-name> -N <pd-node>
多节点故障处理
多数派节点故障
故障现象
- PD 集群无法选举出领导者
- 监控显示
pd_cluster_status为 0 - TiDB 集群无法正常工作
处理步骤
紧急恢复关键节点:
- 优先恢复 PD 集群中的多数派节点
- 重启故障节点,恢复 PD 服务
检查集群状态:
bashtiup ctl pd -u http://<pd-host>:2379 cluster等待集群自动恢复:
- PD 集群会自动进行领导者选举
- 选举成功后,
pd_cluster_status会变为 1
验证服务恢复:
bash# 检查 TiDB 集群状态 tiup cluster display <cluster-name> # 连接 TiDB 验证服务 mysql -h <tidb-host> -P 4000 -u root -e "SELECT 1;"
网络分区故障
故障现象
- PD 集群分裂为多个子集群
- 每个子集群可能选举出自己的领导者
- 监控显示多个 PD 节点同时为领导者
处理步骤
识别网络分区:
- 查看网络拓扑,确定分区位置
- 检查各节点间的连通性
修复网络问题:
- 恢复网络连接,消除网络分区
- 等待 PD 集群自动合并
检查集群状态:
bashtiup ctl pd -u http://<pd-host>:2379 cluster tiup ctl pd -u http://<pd-host>:2379 member验证数据一致性:
- 检查 PD 元数据是否一致
- 检查 TiKV 集群状态
数据一致性故障处理
元数据损坏故障
故障现象
- PD 服务无法启动
- 日志中出现元数据解析错误
- PD Control 无法正常获取集群信息
处理步骤
备份现有数据:
bashcp -r <pd-data-dir> <pd-data-dir>.bak尝试修复元数据:
bash# 使用 PD 修复工具 pd-server --config <pd-config-path> --repair-metadata重建 PD 集群:
- 如果修复失败,考虑重建 PD 集群
- 从备份恢复元数据
验证数据一致性:
bashtiup ctl pd -u http://<pd-host>:2379 cluster tiup ctl pd -u http://<pd-host>:2379 store
Raft 日志不一致故障
故障现象
- PD 节点无法加入集群
- 日志中出现 Raft 日志不匹配错误
- 监控显示 Raft 状态异常
处理步骤
查看 Raft 日志状态:
bashgrep -i raft <pd-log-path>/pd.log重新初始化节点:
bash# 停止 PD 服务 systemctl stop pd-server # 清空数据目录 rm -rf <pd-data-dir>/* # 重启 PD 服务,重新加入集群 systemctl start pd-server验证节点恢复:
bashtiup cluster display <cluster-name> -N <pd-node>
故障恢复最佳实践
定期备份 PD 数据
bash
# 定期备份 PD 数据目录
cp -r <pd-data-dir> <backup-dir>/pd-$(date +%Y%m%d-%H%M%S)
# 或使用 PD Control 导出元数据
tiup ctl pd -u http://<pd-host>:2379 config show > pd-config-$(date +%Y%m%d).json
tiup ctl pd -u http://<pd-host>:2379 member > pd-member-$(date +%Y%m%d).json配置自动重启
bash
# 修改 systemd 配置,启用自动重启
cat > /etc/systemd/system/pd-server.service << EOF
[Unit]
Description=PD Server
After=network.target
[Service]
User=tidb
ExecStart=<pd-bin-path>/pd-server --config <pd-config-path>
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
# 重新加载配置
systemctl daemon-reload
systemctl enable pd-server监控告警配置
配置关键告警规则:
yaml
groups:
- name: pd_alerts
rules:
- alert: PDNodeDown
expr: up{job="pd"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "PD node {{ $labels.instance }} down"
description: "PD node {{ $labels.instance }} has been down for more than 5 minutes."
- alert: PDLostLeader
expr: pd_cluster_status == 0
for: 1m
labels:
severity: critical
annotations:
summary: "PD lost leader"
description: "PD cluster has lost its leader for more than 1 minute."
- alert: PDDiskUsageHigh
expr: (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: "PD disk usage high"
description: "PD node {{ $labels.instance }} disk usage is above 80%."高可用部署
- 部署至少 3 个 PD 节点,确保高可用
- 节点分布在不同的机架或可用区
- 配置合理的 Raft 选举超时时间
- 监控 PD 集群状态,及时发现问题
故障预防措施
硬件层面
- 使用可靠的硬件设备
- 配置 RAID 存储,提高磁盘可靠性
- 部署在不同的物理机架或可用区
- 定期检查硬件状态
软件层面
- 保持 PD 版本更新,修复已知 bug
- 配置合理的 PD 参数
- 定期备份 PD 数据
- 配置监控告警
运维层面
- 制定详细的故障处理预案
- 定期进行故障演练
- 培训运维人员,提高故障处理能力
- 建立完善的变更管理流程
- 避免在生产环境进行危险操作
常见问题(FAQ)
Q1: PD 节点频繁重启怎么办?
A1: 请按照以下步骤排查:
- 查看 PD 日志,定位重启原因
- 检查系统资源使用情况,如 CPU、内存、磁盘
- 检查网络连接是否稳定
- 检查配置文件是否正确
- 尝试升级 PD 版本到最新稳定版
- 如果问题仍然存在,联系 TiDB 官方支持
Q2: PD 集群无法选举出领导者怎么办?
A2: 请按照以下步骤处理:
- 检查 PD 集群中是否有多数派节点存活
- 检查节点间网络连接是否正常
- 检查 PD 数据目录是否损坏
- 尝试重启所有 PD 节点
- 如果问题仍然存在,考虑重建 PD 集群
Q3: PD 元数据损坏如何恢复?
A3: 请按照以下步骤处理:
- 尝试使用 PD 修复工具修复元数据
- 如果修复失败,从备份恢复 PD 数据
- 如果没有备份,考虑重建 PD 集群
- 重建后,需要重新部署 TiKV 和 TiDB 集群
Q4: 如何防止 PD 集群出现脑裂?
A4: 可以采取以下措施:
- 部署至少 3 个 PD 节点,确保多数派机制正常工作
- 配置合理的 Raft 选举超时时间
- 确保网络连接稳定,避免网络分区
- 定期检查 PD 集群状态
- 配置监控告警,及时发现脑裂问题
Q5: PD 节点磁盘空间不足怎么办?
A5: 请按照以下步骤处理:
- 检查 PD 数据目录大小,定位大文件
- 清理不必要的日志文件
- 考虑扩容磁盘空间
- 如果是云环境,可以直接扩容云盘
- 考虑配置日志轮转和清理策略
