强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 [email protected] -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 fullOSD 空间不足扩容或清理数据
HEALTH_ERR: OSD(s) are downOSD 故障检查磁盘和日志
HEALTH_WARN: PGs degraded副本不足等待恢复或替换 OSD
HEALTH_ERR: PGs inconsistent数据不一致执行 scrub/repair
HEALTH_WARN: MONs downMON 故障检查网络和日志
connection refused服务未启动检查服务状态
no route to host网络不通检查网络和防火墙
permission denied认证/权限问题检查 keyring 和 caps
slow requestsOSD 负载高调优或扩容

扩展阅读

  1. Ceph 故障排查
  2. PG 状态详解
  3. 日志调试

下一章16 - 运维最佳实践 — 运维规范、容量规划、硬件选型、备份策略和生产 Checklist。