闯关:HEALTH_WARN 从哪儿看起
在模拟终端里接手一套告警集群,一步步定位到根因。
学完这节你能做到
- 形成"先看全局再看局部"的排查顺序
- 把 ceph health detail 的告警映射到具体动作
- 独立完成一次从告警到根因的闭环
场景
周二上午 10:14,监控群里弹出告警:
[P2] ceph-prod 集群 health 状态变更:HEALTH_OK → HEALTH_WARN
你是这套集群的值班人。业务侧暂时没有报障,但告警必须在 30 分钟内给出初步结论。这套集群的情况你只知道个大概:36 个 OSD,3 台存储节点,同时提供 RBD 和 CephFS。
现在开始排查。下面是一个模拟终端,你已经登录到 ceph-node1(MON 节点之一)。
新人最容易犯的错是直接 ssh 到某台机器上翻日志。正确顺序永远是:
先看集群全局状态 → 再看告警明细 → 再定位到具体 OSD/主机 → 最后才登机器看硬件层证据。
反过来做,你会在错误的机器上浪费半小时。
- 1.查看集群整体状态,确认告警范围
- 2.展开告警明细,拿到具体的 OSD 编号
- 3.确认故障 OSD 在哪台主机、故障域是否还安全
- 4.确认 OSD 进程是自己退出的,还是被系统杀掉的
- 5.到故障主机上找硬件层的直接证据
- 6.用 SMART 确认盘本身已经损坏,形成结论
模拟终端:这是一次预置的排障演练,输出固定。 输入 goals 查看目标,hint 获取提示。开始吧。
复盘:这次告警的完整结论
排查完成后,值班记录应该长这样——结论、依据、动作、风险四段齐全:
结论:ceph-node3 上的 osd.14 对应的物理盘 /dev/sdd(SN: S6CVNE0T412938)介质损坏,已被固件置为只读,OSD 进程因 BlueStore 读取失败而反复崩溃退出。
依据:
ceph health detail→osd.14 (host=ceph-node3) is downsystemctl status ceph-osd@14→ BlueStore 读盘返回(5) Input/output error,进程 assert 后被 ABRTdmesg→critical medium error, dev sdd,扇区级不可恢复读错误smartctl→SMART overall-health: FAILED,Available Spare 0%,Percentage Used 97%,介质错误 2847 次
动作:
- 走坏盘更换流程:
ceph osd out 14→ 等待数据迁移完成 →ceph osd purge 14→ 换盘 → 重新加入 OSD - 提工单联系厂商更换(盘寿命已用 97%,属于正常损耗)
风险与次生问题(这部分最容易漏,也最能体现水平):
osd.29已达 86%,进入 nearfull。osd.14 的数据迁移会进一步推高其它 OSD 的水位,有触发backfillfull甚至full(拒绝写入)的风险。迁移前应先确认容量余量,必要时限速回填。- 集群 OSD 平均
Percentage Used需要普查——这批盘同批次采购、同期上线,一块到寿命意味着其它盘也接近。这是典型的批次性故障风险。 - 当前 61 个 PG 处于
undersized+degraded,副本数不足。在恢复完成前,集群容错额度是降低的。
看到盘坏了就立刻 out,是新人最常见的操作事故。out 会立即触发大规模数据迁移,如果此时集群水位已高(就像本例的 osd.29 到了 86%),迁移可能把某个 OSD 顶到 full,导致整个池拒绝写入——一次小故障被你亲手升级成了业务中断。正确做法是先算容量、再限速、再操作。
本次故障中,判断「盘确实坏了」最有力的证据是哪一条?
在执行换盘流程之前,必须先确认哪些事情?(多选)
ceph -s 里 osd 那一行显示「36 osds: 35 up, 36 in」。这里的 in 是什么意思?
这一关的落点
- 排查顺序:
ceph -s→ceph health detail→ceph osd tree→ 进程日志 → 内核日志 → SMART - Ceph 层的告警只能定位到 OSD,硬件结论必须由 dmesg 和 SMART 提供
- 一个故障往往带着次生风险(本例是容量水位),只报根因不报风险,等于没做完
- 任何会触发数据迁移的命令,执行前先算容量
延伸资料
- ·k8s-in-action
storage/cephadm/7-faq.md - ·k8s-in-action
storage/rook/README.md