Day-2 运维:扩容、换盘、升级
集群跑起来只是开始,接下来两年都是这些活。
学完这节你能做到
- 安全地加盘、下线盘并控制数据迁移速度
- 滚动升级集群且不中断业务
- 处理 near full、slow ops 一类日常告警
集群跑起来只是开始
部署一次,运维两年。这一节讲的是那两年里你真正要天天做的事:加盘、换盘、扩容、升级、处理告警。
所有 Day-2 操作的共同点:它们都会触发数据迁移。而数据迁移会和业务抢 I/O。所以每一条命令背后,都要先回答两个问题:迁多少?迁多快?
扩容:加节点与加盘
# 加节点前:先确认网络连通性
# 新节点必须能和现有客户端、现有集群节点互通
ceph fs get prod | tail -1 # 拿到 mds 服务名
ceph tell mds.<name> client ls | grep -oP '\d{1,3}(\.\d{1,3}){3}' | sort -u
# 从新节点 ping 上面每一个客户端 IP,以及所有现有集群节点
# 加节点
ceph orch host add ceph-node4
ceph orch daemon add osd ceph-node4:/dev/nvme1n1
新节点和集群内部通了,不代表和客户端通了。客户端要直连 OSD 读写数据(还记得吗,Ceph 没有代理层)。新节点上的 OSD 一旦承载了 PG,那些连不通它的客户端就会卡住。
所以扩容前一定要把现有客户端 IP 列表拉出来,从新节点逐个 ping 一遍。这一步在实际项目的运维文档里被专门强调过——因为它出过事。
加盘后数据会自动回填。控制回填速度:
# 查看当前恢复限速参数
ceph config get osd osd_max_backfills # 每个 OSD 同时进行的回填数,默认 1
ceph config get osd osd_recovery_max_active # 同时恢复的对象数
ceph config get osd osd_recovery_sleep # 每次恢复操作之间的休眠,越大越慢
# 业务高峰期:调慢
ceph config set osd osd_max_backfills 1
ceph config set osd osd_recovery_sleep 0.1
# 业务低峰期:调快
ceph config set osd osd_max_backfills 4
ceph config set osd osd_recovery_sleep 0
缩容:优雅下线一块盘
顺序很重要,做反了会造成不必要的两次数据迁移。
# 1. 先 reweight 到 0,让数据逐步迁走(比直接 out 更平缓)
ceph osd reweight 14 0
# 等待数据迁移完成
watch ceph -s
# 2. 标记 out,从数据分布中移除
ceph osd out 14
# 3. 停止守护进程
ceph orch daemon stop osd.14
# 4. 从集群彻底移除
ceph osd purge 14 --yes-i-really-mean-it
out 会立刻触发这块盘上所有数据的重新分布。如果集群水位已经很高(比如有 OSD 到了 85% nearfull),迁移可能把某个 OSD 顶到 backfillfull 甚至 full,导致整个池拒绝写入。
换盘前的检查清单:
ceph df # 集群整体余量
ceph osd df | sort -k17 -rn # 按使用率排序,看最满的那块盘
ceph osd df tree # 按主机看分布是否均匀确认最满的 OSD 吸收这部分迁移后仍在安全线内,再动手。
坏盘更换标准流程
# 1. 确认根因(Ceph 层 + 硬件层双重证据)
ceph health detail
ssh <host> dmesg -T | tail -30
ssh <host> smartctl -a /dev/sdd
# 2. 算容量(见上)
ceph df && ceph osd df | sort -k17 -rn | head
# 3. 下线
ceph osd out 14
# 等迁移完成,PG 回到 active+clean
ceph osd purge 14 --yes-i-really-mean-it
# 4. 物理换盘,记录序列号与槽位
# 5. 重新加入
ceph orch device zap <host> /dev/sdd --force
ceph orch daemon add osd <host>:/dev/sdd
# 6. 验证
ceph osd tree
ceph -s
运维开关:什么时候该用
| 开关 | 作用 | 典型场景 |
|---|---|---|
noout | OSD 掉线也不标记为 out | 重启单台机器,避免不必要的数据迁移 |
norebalance | 不做再平衡 | 批量加盘时先加完再一起平衡 |
nobackfill / norecover | 暂停回填 / 恢复 | 业务高峰临时刹车 |
noscrub / nodeep-scrub | 暂停清洗 | 排查性能问题时排除干扰 |
# 重启一台机器的标准姿势
ceph osd set noout
systemctl reboot # 在目标机器上
# 机器起来、OSD 全部 up 之后
ceph osd unset noout
noout 忘了取消,是运维事故排行榜上的常客。后果是:真的有盘坏了,集群也不会自动把它踢出去做恢复,数据长期处于降级状态而没人发现——直到第二块盘也坏了。
ceph -s 会在 health 里明确提示 noout flag(s) set。看到这行提示不要习以为常,要确认它是谁、什么时候、为什么设的。
滚动升级
# 查看当前版本分布
ceph versions
# 检查目标版本是否可升级
ceph orch upgrade check --ceph-version 20.2.2
# 开始升级(cephadm 会按 mgr → mon → osd → mds → rgw 的顺序滚动)
ceph orch upgrade start --ceph-version 20.2.2
# 观察进度
ceph orch upgrade status
ceph -W cephadm # 实时看 cephadm 的事件
# 出问题时暂停
ceph orch upgrade pause
ceph orch upgrade resume
ceph orch upgrade stop
升级纪律:
- 升级前:集群必须
HEALTH_OK,PG 全部active+clean。带病升级是自找麻烦 - 升级中:不要同时做其它变更(加盘、改 crush rule)
- 跨大版本:先读官方 release notes 里的 upgrade 章节,确认是否需要中间版本过渡
容量水位管理
# 查看三条水位线
ceph osd dump | grep -E 'full_ratio|nearfull'
# 临时调整(应急用,不是常规手段)
ceph osd set-nearfull-ratio 0.87
ceph osd set-backfillfull-ratio 0.92
ceph osd set-full-ratio 0.96
日常真正该做的是让分布更均匀,而不是抬高水位线:
# 开启 balancer(默认开)
ceph balancer status
ceph balancer mode upmap
ceph balancer on
# 看 PG 分布的标准差
ceph osd df | tail -3
# MIN/MAX VAR: 0.82/1.18 STDDEV: 4.21 ← STDDEV 越小越好
水位到 85% 才告警,留给你的时间通常不够走完采购流程。实际做法是做趋势预测:按过去 30 天的增长率外推,在"预计 60 天后达到 80%"时就发出扩容提醒。
这件事在 L4 的可观测性一节里会具体做。
要重启一台存储节点做内核升级,正确的操作顺序是?
集群有 OSD 已达 88% 使用率,此时一块盘坏了。下一步最合理的是?
ceph -s 显示 health: HEALTH_WARN 且有 noout flag(s) set。该怎么处理?
这节课的落点
- 所有 Day-2 操作都会触发迁移,动手前先回答"迁多少、迁多快"
- 加节点前务必验证与现有客户端的网络连通性
- 下线顺序:reweight 0 → out → stop → purge
- 换盘前必须先算容量,避免迁移把集群顶到 full
- 计划内重启用
noout,用完立刻取消 - 升级前集群必须 HEALTH_OK,升级中不夹带其它变更
- 抬高水位线是应急,让分布均匀(balancer)才是常规手段
延伸资料
- ·k8s-in-action
storage/cephadm/day-2.md - ·k8s-in-action
storage/rook/day-2.md