Skip to content

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 错误

处理步骤

  1. 查看日志定位原因

    bash
    tail -n 1000 <pd-log-path>/pd.log | grep -i panic
  2. 尝试重启 PD 服务

    bash
    systemctl restart pd-server
    # 或使用 TiUP 重启
    tiup cluster restart <cluster-name> -N <pd-node>
  3. 验证节点恢复

    bash
    tiup cluster display <cluster-name> -N <pd-node>
  4. 检查集群状态

    bash
    tiup ctl pd -u http://<pd-host>:2379 cluster

机器宕机故障

故障现象

  • 机器无法访问
  • Ping 不通
  • SSH 连接失败

处理步骤

  1. 确认机器状态

    bash
    ping <pd-host>
    ssh <pd-host> uptime
  2. 尝试恢复机器

    • 联系机房人员检查硬件
    • 重启物理机器或虚拟机
  3. 恢复 PD 服务

    bash
    # 机器恢复后,重启 PD 服务
    systemctl start pd-server
    # 或使用 TiUP 启动
    tiup cluster start <cluster-name> -N <pd-node>
  4. 验证集群状态

    bash
    tiup cluster display <cluster-name>
    tiup ctl pd -u http://<pd-host>:2379 cluster

网络隔离故障

故障现象

  • 机器可以访问,但 PD 服务无法访问
  • 监控显示该节点与其他节点心跳中断
  • 日志中出现大量网络连接错误

处理步骤

  1. 检查网络连接

    bash
    # 检查 PD 端口连通性
    nc -zv <pd-host> 2379
    # 检查与其他 PD 节点的连通性
    ssh <pd-host> ping <other-pd-host>
  2. 检查防火墙规则

    bash
    iptables -L -n
    # 或检查云平台安全组规则
  3. 检查网络设备

    • 检查交换机、路由器状态
    • 检查网络线缆连接
  4. 验证网络恢复

    bash
    # 确认网络恢复后,检查 PD 服务状态
    tiup cluster display <cluster-name> -N <pd-node>

多节点故障处理

多数派节点故障

故障现象

  • PD 集群无法选举出领导者
  • 监控显示 pd_cluster_status 为 0
  • TiDB 集群无法正常工作

处理步骤

  1. 紧急恢复关键节点

    • 优先恢复 PD 集群中的多数派节点
    • 重启故障节点,恢复 PD 服务
  2. 检查集群状态

    bash
    tiup ctl pd -u http://<pd-host>:2379 cluster
  3. 等待集群自动恢复

    • PD 集群会自动进行领导者选举
    • 选举成功后,pd_cluster_status 会变为 1
  4. 验证服务恢复

    bash
    # 检查 TiDB 集群状态
    tiup cluster display <cluster-name>
    # 连接 TiDB 验证服务
    mysql -h <tidb-host> -P 4000 -u root -e "SELECT 1;"

网络分区故障

故障现象

  • PD 集群分裂为多个子集群
  • 每个子集群可能选举出自己的领导者
  • 监控显示多个 PD 节点同时为领导者

处理步骤

  1. 识别网络分区

    • 查看网络拓扑,确定分区位置
    • 检查各节点间的连通性
  2. 修复网络问题

    • 恢复网络连接,消除网络分区
    • 等待 PD 集群自动合并
  3. 检查集群状态

    bash
    tiup ctl pd -u http://<pd-host>:2379 cluster
    tiup ctl pd -u http://<pd-host>:2379 member
  4. 验证数据一致性

    • 检查 PD 元数据是否一致
    • 检查 TiKV 集群状态

数据一致性故障处理

元数据损坏故障

故障现象

  • PD 服务无法启动
  • 日志中出现元数据解析错误
  • PD Control 无法正常获取集群信息

处理步骤

  1. 备份现有数据

    bash
    cp -r <pd-data-dir> <pd-data-dir>.bak
  2. 尝试修复元数据

    bash
    # 使用 PD 修复工具
    pd-server --config <pd-config-path> --repair-metadata
  3. 重建 PD 集群

    • 如果修复失败,考虑重建 PD 集群
    • 从备份恢复元数据
  4. 验证数据一致性

    bash
    tiup ctl pd -u http://<pd-host>:2379 cluster
    tiup ctl pd -u http://<pd-host>:2379 store

Raft 日志不一致故障

故障现象

  • PD 节点无法加入集群
  • 日志中出现 Raft 日志不匹配错误
  • 监控显示 Raft 状态异常

处理步骤

  1. 查看 Raft 日志状态

    bash
    grep -i raft <pd-log-path>/pd.log
  2. 重新初始化节点

    bash
    # 停止 PD 服务
    systemctl stop pd-server
    # 清空数据目录
    rm -rf <pd-data-dir>/*
    # 重启 PD 服务,重新加入集群
    systemctl start pd-server
  3. 验证节点恢复

    bash
    tiup 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: 请按照以下步骤排查:

  1. 查看 PD 日志,定位重启原因
  2. 检查系统资源使用情况,如 CPU、内存、磁盘
  3. 检查网络连接是否稳定
  4. 检查配置文件是否正确
  5. 尝试升级 PD 版本到最新稳定版
  6. 如果问题仍然存在,联系 TiDB 官方支持

Q2: PD 集群无法选举出领导者怎么办?

A2: 请按照以下步骤处理:

  1. 检查 PD 集群中是否有多数派节点存活
  2. 检查节点间网络连接是否正常
  3. 检查 PD 数据目录是否损坏
  4. 尝试重启所有 PD 节点
  5. 如果问题仍然存在,考虑重建 PD 集群

Q3: PD 元数据损坏如何恢复?

A3: 请按照以下步骤处理:

  1. 尝试使用 PD 修复工具修复元数据
  2. 如果修复失败,从备份恢复 PD 数据
  3. 如果没有备份,考虑重建 PD 集群
  4. 重建后,需要重新部署 TiKV 和 TiDB 集群

Q4: 如何防止 PD 集群出现脑裂?

A4: 可以采取以下措施:

  1. 部署至少 3 个 PD 节点,确保多数派机制正常工作
  2. 配置合理的 Raft 选举超时时间
  3. 确保网络连接稳定,避免网络分区
  4. 定期检查 PD 集群状态
  5. 配置监控告警,及时发现脑裂问题

Q5: PD 节点磁盘空间不足怎么办?

A5: 请按照以下步骤处理:

  1. 检查 PD 数据目录大小,定位大文件
  2. 清理不必要的日志文件
  3. 考虑扩容磁盘空间
  4. 如果是云环境,可以直接扩容云盘
  5. 考虑配置日志轮转和清理策略