必须先执行ceph osd out和ceph osd set noout,再停osd进程、卸载挂载点、移除crush条目及认证密钥,最后物理更换硬盘并重建osd;跳过任一环节易致数据丢失或health_warn长期hang住。

直接退役物理 OSD 硬盘前不先踢出集群、不设 noout、不等 backfill 完成,大概率触发数据丢失或集群卡在 HEALTH_WARN 状态下长期 hang 住。必须按「逻辑移除 → 物理替换 → 重建 OSD」三阶段操作,中间任何跳步都会让副本一致性失控。
ceph osd out + noout 是防止误均衡的强制前置动作
OSD 进程还在运行时,ceph osd out osd.X 只是标记它“不接收新写入”,但已有 PG 仍可能被选为 primary 或 replica,如果此时磁盘突然掉线或 umount 卡死,就会导致读写失败甚至 PG stuck inactive。
- 执行前先确认集群无 pending recovery:
ceph -s | grep -E "(recovery|backfill)",输出为空才安全 - 立即全局锁住均衡:
ceph osd set noout(不是osd set nodown,后者不管用) - 再执行
ceph osd out osd.X,等待ceph osd tree中该 OSD 状态变为down且out - 若
ceph osd tree里仍显示up,说明进程没停干净,必须补systemctl stop ceph-osd@X
umount 挂载点失败时别硬 kill,优先查 devicemapper 或 lvm 持有者
很多场景下 umount /var/lib/ceph/osd/ceph-X 会卡住,不是因为文件系统忙,而是底层设备被 dm-* 或 lvm 占用——尤其是用了 BlueStore + block.db 或 block.wal 分离部署的集群。
- 先查谁在用:
lsof +D /var/lib/ceph/osd/ceph-X或fuser -v /var/lib/ceph/osd/ceph-X - 若输出含
dm-*设备,运行dmsetup ls --tree看依赖链,再lvchange -an对应 LV - BlueStore 下常见卡在
rocksdb日志刷盘,可临时加sync后重试,别直接 reboot——除非确认ceph-volume lvm zap已无法覆盖旧元数据
ceph-volume lvm zap 要带 --destroy 和 --force 才真正清空旧设备
单纯 ceph-volume lvm zap /dev/sdX 默认只清除 LVM 标签,不格式化底层磁盘,旧 bluefs superblock 或残留 journal 仍可能干扰新 OSD 创建。
- 安全擦除命令必须是:
ceph-volume lvm zap --destroy --force /dev/sdX -
--destroy会调用wipefs -a清除所有签名,--force绕过交互确认 - 执行后验证:
wipefs -a /dev/sdX应无输出;blkid /dev/sdX应返回空 - 若新盘已做过分区(如
/dev/sdX1),必须先parted /dev/sdX mklabel gpt再 zap,否则ceph-volume会报错 “device is partitioned”
重建 OSD 后必须验证 pg_upmap_items 是否清空
用 ceph-volume lvm create 成功后,OSD ID 虽恢复,但 CRUSH map 可能还保留着旧的 upmap 规则(比如之前手动 ceph osd upmap 过),导致部分 PG 长期 stuck 在旧 OSD 上不迁移。
- 检查残留映射:
ceph osd getcrushmap -o /tmp/crush.map && crushtool -d /tmp/crush.map | grep upmap - 清空全部 upmap:
ceph osd rmcrushmap upmap(注意不是rmcrush) - 观察 PG 分布是否收敛:
ceph pg dump_stuck inactive | wc -l应为 0;ceph -s中pgs行的active+clean比例需达 100%
最易被忽略的是:换盘后即使 ceph -s 显示 HEALTH_OK,也要盯住 ceph pg stat 里的 misplaced 数值——它可能持续数小时不归零,尤其当集群 PG 数量大或网络带宽受限时。别只看 OK 就撤 noout,等 misplaced 降为 0 再 ceph osd unset noout。











