Ceph 存储运维完全指南 / 15 - 故障排查
15 - 故障排查
15.1 故障排查思路
Ceph 故障排查通用流程:
├── 1. 确认故障现象
├── 2. 检查集群健康状态
│ ├── ceph -s
│ ├── ceph health detail
│ └── ceph -w
├── 3. 检查日志
│ ├── journalctl -u ceph-*
│ └── /var/log/ceph/
├── 4. 检查组件状态
│ ├── ceph mon stat
│ ├── ceph osd stat
│ └── ceph mgr stat
├── 5. 分析根因
│ ├── 磁盘空间/故障
│ ├── 网络问题
│ ├── 配置错误
│ └── 软件 Bug
└── 6. 修复并验证
15.2 PG 异常排查
PG 状态异常
# 查看异常 PG
ceph pg stat
# 输出: 512 pgs: 500 active+clean; 5 degraded; 4 active+undersized; 3 inconsistent
# 查看具体异常 PG
ceph pg ls | grep -v active+clean
# 查看 PG 的详细信息
ceph pg dump pgs | grep <pg-id>
ceph pg <pg-id> query
常见 PG 异常及处理
PG Degraded(降级)
# 现象
HEALTH_WARN Degraded data redundancy: 5/1000 objects degraded
# 原因分析
ceph health detail
# 输出: pg 3.5 is degraded+active+undersized, acting [1,2]
# 常见原因:
# 1. OSD 故障
ceph osd tree | grep down
# 2. OSD 被标记 out
ceph osd tree | grep out
# 处理方法
# 如果 OSD 短暂故障,等待恢复
systemctl start ceph-osd@<failed-osd>
# 如果 OSD 永久故障,执行替换(参见第 11 章)
ceph osd out osd.5
# 等待数据恢复...
PG Inconsistent(数据不一致)
# 现象
HEALTH_ERR 2 pgs inconsistent
# 检查不一致详情
ceph health detail
# 输出: pg 3.5 is inconsistent+active+clean
# 处理方法
# 1. 先触发深度 scrub 确认不一致对象
ceph pg deep-scrub 3.5
# 2. 查看 scrub 结果
ceph pg 3.5 query | jq '.info'
# 3. 修复 PG
ceph pg repair 3.5
# 4. 监控修复进度
ceph -w
PG Stale(过期)
# 现象
HEALTH_WARN 3 pgs stale
# 原因:PG 的 primary OSD 和所有 acting OSD 都 down
# 检查
ceph pg dump stale
# 处理方法
# 1. 启动故障的 OSD
systemctl start ceph-osd@<osd-id>
# 2. 如果 OSD 无法恢复,等待 CRUSH 选择新 OSD
ceph -w
# 3. 紧急情况可强制标记
ceph pg force-recovery <pg-id>
PG Incomplete(不完整)
# 现象
HEALTH_ERR 1 pg is incomplete
# 原因:PG 无法选出 primary,所有 acting OSD 的日志都不完整
# 处理方法
# 1. 检查相关 OSD 状态
ceph pg <pg-id> query | jq '.peer_info'
# 2. 尝试强制恢复
ceph pg force-recovery <pg-id>
# 3. 如果仍无法恢复(极端情况,可能丢数据)
# ceph pg force-creating-pg <pg-id> # 危险!仅在确认无法恢复时使用
PG Peering 长时间未完成
# 现象
HEALTH_WARN 2 pgs peering
# 检查 PG peer 状态
ceph pg <pg-id> query | jq '.peer_state'
# 查看 OSD 日志
journalctl -u ceph-osd@<primary-osd> | grep -i peering | tail -20
# 常见原因:
# - OSD 间网络不通
# - OSD 日志损坏
# - 配置不一致
# 处理:检查网络、重启相关 OSD
15.3 OSD 问题排查
OSD 无法启动
# 检查 OSD 状态
systemctl status ceph-osd@5
# 查看日志
journalctl -u ceph-osd@5 -n 100
# 常见原因及处理:
# 1. 磁盘故障
dmesg | grep -i error | tail -20
smartctl -a /dev/sdb # 检查 SMART 信息
# 2. 磁盘空间不足
df -h /var/lib/ceph/osd/ceph-5/
# 3. BlueStore 数据损坏
# 尝试修复
ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-5/ --op fsck
# 4. 配置错误
ceph-osd -i 5 --mkfs # 重新初始化(会丢失数据!)
OSD 慢操作(Slow Requests)
# 查看慢操作
ceph daemon osd.0 dump_ops_in_flight
# 或
ceph tell osd.0 dump_ops_in_flight
# 输出示例:
# {
# "ops": [
# {
# "description": "osd_op(client.1234.0:1000 3.5 3:abc123:::obj1:head [read 0~4194304] snapc 0=[] ondisk+read+retry+supports_pool_eio e100)",
# "initiated_at": "2026-05-10 10:00:00.000000",
# "age": 30.5, ← 已等待 30.5 秒
# "description": "waiting for sub ops"
# }
# ]
# }
# 常见原因:
# 1. 磁盘 I/O 慢
iostat -x 1 5 # 检查磁盘负载
# 2. 网络延迟
ping <osd-node>
iperf3 -c <osd-node>
# 3. OSD 负载过高
ceph osd perf # 查看 OSD 延迟
# 4. 恢复/scrub 占用资源
ceph pg dump pgs | grep -E "recovering|scrubbing"
# 处理方法:
# - 增加 OSD 的 op 线程数
ceph config set osd osd_op_threads 8
# - 限制恢复并发
ceph config set osd osd_recovery_max_active 2
# - 调整 scrub 时间窗口
ceph config set osd osd_scrub_begin_hour 2 # 凌晨 2 点开始
ceph config set osd osd_scrub_end_hour 6 # 凌晨 6 点结束
OSD 频繁崩溃
# 查看崩溃记录
ceph crash ls
ceph crash info <crash-id>
# 常见原因:
# 1. 内存不足(OOM)
dmesg | grep -i oom
# 解决:调整 OSD 内存限制
ceph config set osd osd_memory_target 2147483648 # 2GB
# 2. 磁盘故障
smartctl -a /dev/sdb
# 3. 内核版本 Bug
uname -r
# 建议使用 LTS 内核版本
15.4 Monitor 问题排查
Monitor 无法形成法定人数
# 检查 MON 状态
ceph mon stat
# 检查每个 MON 的状态
ceph mon dump
# 查看 MON 日志
journalctl -u ceph-mon@node1 -n 50
# 常见原因:
# 1. 网络分区
ping <other-mon-node>
# 2. 时钟不同步
chronyc tracking # 检查时间偏移
# 3. 数据损坏
# 检查 MON 数据目录
ls -la /var/lib/ceph/mon/ceph-node1/store.db/
# 4. 配置不一致
diff /etc/ceph/ceph.conf node2:/etc/ceph/ceph.conf
Monitor 数据存储空间不足
# 检查 MON 数据大小
du -sh /var/lib/ceph/mon/ceph-node1/
# 清理历史数据
ceph mon compact # 压缩 RocksDB
# 调整数据保留策略
ceph config set mon mon_data_size_warn 21474836480 # 20GB 告警
15.5 网络问题排查
OSD 间心跳超时
# 检查网络连通性
# 所有 OSD 节点间互 ping
for node in node1 node2 node3; do
echo "Testing $node..."
ping -c 3 $node
done
# 检查集群网络
ping -c 3 10.10.10.11 # cluster_network
# 检查端口
nc -zv node2 6800 # OSD 端口
# 查看网络丢包
netstat -s | grep -i drop
cat /proc/net/snmp | grep -i retransmit
网络性能问题
# 使用 iperf3 测试网络带宽
# 服务端
iperf3 -s
# 客户端
iperf3 -c node2 -t 30
# 检查 MTU
ip link show eth1 | grep mtu
# 检查网卡队列
ethtool -l eth1
# 检查网卡错误
ethtool -S eth1 | grep -i error
Messenger v2 连接问题
# 检查 Messenger 配置
ceph config show osd.0 | grep ms_
# 检查连接状态
ceph daemon osd.0 dump_watchers
# 临时使用 Messenger v1 测试
ceph config set osd ms_type async+posix
# 检查防火墙规则
iptables -L -n | grep 6789
iptables -L -n | grep 6800
15.6 RBD/CephFS 问题排查
RBD 映射失败
# 检查 RBD 镜像
rbd info rbd/myimage
# 检查内核模块
lsmod | grep rbd
modprobe rbd
# 检查内核版本兼容性
uname -r # 需要 5.4+ 以获得完整特性支持
# 检查密钥
ceph auth get client.admin
# 检查日志
dmesg | grep rbd
CephFS 挂载失败
# 检查 MDS 状态
ceph mds stat
ceph fs status myfs
# 检查 MDS 日志
journalctl -u ceph-mds@node1 -n 50
# 内核挂载失败
dmesg | grep ceph
# FUSE 挂载调试
ceph-fuse -m node1:6789 /mnt --debug
# 检查密钥和权限
ceph auth get client.cephfsuser
CephFS 性能问题
# 检查 MDS 负载
ceph tell mds.* perf dump | jq '.mds'
# MDS 内存使用
ceph tell mds.* dump cache
# 调整 MDS 缓存
ceph config set mds mds_cache_memory_limit 8589934592 # 8GB
# 检查客户端缓存
cat /sys/kernel/debug/ceph/*/mdsc
15.7 RGW 问题排查
RGW 无法访问
# 检查 RGW 服务状态
ceph orch ps | grep rgw
systemctl status ceph-radosgw@rgw.<hostname>
# 检查端口
curl -v http://node1:80
# 检查 RGW 日志
journalctl -u ceph-radosgw@rgw.node1 -n 50
# 检查存储池
ceph osd pool ls | grep rgw
S3 上传失败
# 检查用户权限
radosgw-admin user info --uid=myuser
# 检查桶策略
radosgw-admin bucket stats --bucket=mybucket
# 检查配额
radosgw-admin user info --uid=myuser | jq '.bucket_quota'
# 检查日志
cat /var/log/ceph/ceph-client.rgw.*.log | tail -100
15.8 性能问题排查
I/O 延迟高
# 1. 检查 OSD 延迟
ceph osd perf
ceph osd perf sort avg_latency
# 2. 检查磁盘 I/O
iostat -x 1 5
# 3. 检查网络延迟
ping -c 100 <osd-node> | tail -1
# 4. 检查慢操作
ceph daemon osd.0 dump_ops_in_flight | jq '.ops[] | select(.age > 5)'
# 5. 检查恢复/scrub 状态
ceph pg dump pgs | grep -c "recovering"
ceph pg dump pgs | grep -c "scrubbing"
吞吐量低
# 1. 检查网络带宽
iperf3 -c <osd-node> -t 30
# 2. 检查磁盘吞吐
fio --name=throughput --ioengine=libaio --direct=1 --bs=1M --size=4G \
--numjobs=4 --rw=read --runtime=30 --time_based --filename=/dev/sdb
# 3. 检查 OSD 并发配置
ceph config get osd osd_op_threads
# 4. 检查客户端配置
ceph config get client rbd_cache
15.9 常见错误速查表
| 错误信息 | 可能原因 | 处理方法 |
|---|---|---|
HEALTH_WARN: clock skew | 时间不同步 | 配置 NTP/Chrony |
HEALTH_WARN: OSD too full | OSD 空间不足 | 扩容或清理数据 |
HEALTH_ERR: OSD(s) are down | OSD 故障 | 检查磁盘和日志 |
HEALTH_WARN: PGs degraded | 副本不足 | 等待恢复或替换 OSD |
HEALTH_ERR: PGs inconsistent | 数据不一致 | 执行 scrub/repair |
HEALTH_WARN: MONs down | MON 故障 | 检查网络和日志 |
connection refused | 服务未启动 | 检查服务状态 |
no route to host | 网络不通 | 检查网络和防火墙 |
permission denied | 认证/权限问题 | 检查 keyring 和 caps |
slow requests | OSD 负载高 | 调优或扩容 |
扩展阅读
下一章:16 - 运维最佳实践 — 运维规范、容量规划、硬件选型、备份策略和生产 Checklist。