三台 Dell R730xd:k8s-10-1-16-21(10.1.16.21)、k8s-10-1-16-22、k8s-10-1-16-23。Rook v1.17.9,Ceph Squid 19.2.3,host-based OSD。对象池 ceph-objectstore.rgw.buckets.data:EC 2+1、故障域 host、min_size=2。块 / CephFS / RGW 索引在 ssd,换 HDD / 槽 10 不会动它们。
定位只用 WWN / 序列号 / 槽号,不要用 /dev/sdX,不要只认 OSD 号(号会变)。PERC:0:0:槽:0,storcli:/c0/e32/s槽。本机 locate 灯不可用。SSH:ssh root@10.1.16.21、22、23。
09-14 为什么 Rook 不能二次挂 metadataDevice:给 6 个旧 HDD OSD 挂槽 10。
removeOSDsIfOutAndSafeToRemove=false。不要用 osd.rook.io/replace,不要用 rook-ceph-purge-osd Job。
目录
先分清坏的是哪块
两条流程不能混。混了会擦错盘,或在 3 台上把对象池打到不可恢复。
| 现象 | 坏的是 | 走哪条 |
|---|---|---|
| 1 个 HDD OSD down / SMART 报死;同机另外 3 个 HDD 仍 up | 槽 1–4 里一块 16T | 换一块 16T |
同机 4 个 HDD OSD 一起 down;device_ids 都带同一块 PM883;storcli 槽 10 失败 |
槽 10 缓存 | 换槽 10 |
| 槽 12/13 的 960G、槽 0 系统盘 | 不是这两条 | 见文末 |
核对:
ceph -sceph osd treeceph osd metadata osd.<id> | grep -E 'hostname|device_ids|device_paths|bluefs_dedicated'storcli /c0/e32/s<槽> showlsblk -ndo SERIAL,SIZE,MODEL /dev/disk/by-id/wwn-0x<WWN>device_paths 里 scsi-0:0:<槽>:0 必须对上前舱槽。device_ids 里 16T 序列号和槽 10 PM883 序列号要分得清。
前舱编号(左上角第一列往下):
0 3 6 9 1 4 7 10 2 5 8 11槽 10 = 缓存,不是 OSD。槽 1–4 = 16T。禁止碰槽 0 / 11 / 12 / 13,除非那条流程明确写了要碰。
槽 10 现在挂着谁
每台 4×430 GiB osd-db,WAL 同住 DB,剩约 68 GiB。缓存 WWN 不进 devices:,只出现在各 HDD 的 metadataDevice。
| 机 | 槽 10 序列号 | WWN | 带着的 HDD OSD(认序列号) |
|---|---|---|---|
| 16.21 | S455NY0MB34106 | 5002538e09b8d73f | 2CKHK8HN / 2PGAK6VT / 2PG180HT / 2PGBNGKV |
| 16.22 | S455NY0R712793 | 5002538e0174c2e8 | 2PGBPU7V / 2PG13TMT / 2DG026YS / 2PG0KHYT |
| 16.23 | S455NY0KA00972 | 5002538e00024339 | 2PGBRYGV / 2PG1XWJT / 2PG15T0T / 2PG22LLT |
OSD 号以台账为准,换盘后会再变。
换一块 16T 机械盘
3 台现场:一次只换一块。同机另外 3 块 HDD 还在,这一份 EC 会搬到它们上面,可以等 safe-to-destroy。集群里已有别的 remapped、已有别的 OSD down,不要开换。
槽 10 已有 LVM。Rook metadataDevice 不会给新 16T 自动挂上缓存,prepare 仍报 metadata device is not found。改 CR / 开 operator / helm 过不去。还是预切 430 GiB osd-db + ceph-volume lvm prepare --block.db。不要擦槽 10。
和 09-14 重建 6 块的差别:这次新盘 WWN 变了,CR 要改;operator 保持 0,直到手做完 prepare。
A. 认盘,数据先搬走
- 用序列号 / WWN / 槽对上 OSD(上一节命令)。
- 盘还在服务:
ceph osd out <id>。已经 down:看ceph -s,该走的 remap 是否已经走完。 - 等 全部 PG
active+clean、没有 remapped。 ceph osd safe-to-destroy <id>必须通过。EBUSY 就再等,不要--force。
可选:ceph osd set noscrub / nodeep-scrub;回填慢再临时 osd_mclock_profile=high_recovery_ops、osd_max_backfills=24。干净后改回 balanced / 16 并 unset scrub。
B. 停 OSD,purge,抽旧盘
kubectl -n rook-ceph scale deploy/rook-ceph-operator --replicas=0kubectl -n rook-ceph scale deploy/rook-ceph-osd-<id> --replicas=0,等 pod 消失。ceph osd purge <id> --yes-i-really-mean-it- 若
ceph auth ls | grep osd.<id>还在:ceph auth del osd.<id>(09-14 在 16.22 不删会key does not match)。 kubectl -n rook-ceph delete deploy rook-ceph-osd-<id>。清/var/lib/rook/rook-ceph/<cluster-fsid>_<osd-fsid>,否则raw list会起幽灵 deploy。- 先核槽 10,再抽盘。 该机其余 3 条
osd-db必须还在;刚 purge 的那条一般会随 zap 消失,VFree 大约从 68 GiB 回到 ~498 GiB。少一条都不要抽盘。禁止dmsetup remove_all。 - 热插拔 同一槽。禁止碰槽 0 / 10 / 11 / 12 / 13。
C. 新盘进 CR,手挂槽 10
storcli确认新盘在同一槽。记下 新 序列号 / WWN。smartctl -H要 PASSED。16T CMR,不要 SMR。- 只按新 WWN 擦盘。
- 改
rook-ceph-cluster.yaml里这一行devices::WWN、注释里的序列号 / 槽。metadataDevice仍是 该机槽 10 旧 WWN,不要改成新 16T。helm upgrade(或等价)把 CR 改出去。operator 先保持 0。 - 按 手挂槽 10 的 Job prepare。
KEEP_DBS= 槽 10 上还在跑的 3 条osd-db。 - 宿主机
pvscan --cache。 ceph-volume lvm list能看见新 OSD。kubectl -n rook-ceph scale deploy/rook-ceph-operator --replicas=1。Rooklvm list收养。不要指望lvm batch。- 硬认:
device_ids含新 16T 序列号 + 该机槽 10 PM883;SCSI 槽号对;bluefs_dedicated_db=1、WAL=0、DB 430 GiB。改台账和 CR 注释里的 OSD 号。 - 等 remap 干净。开过的 noscrub / mclock 改回去。
同机不要两块 16T 一起换:3 台 + host 故障域,同机只剩 2 块 HDD,墙钟和风险都差一截。
换槽 10 缓存盘
槽 10 一坏,这台 4 个 HDD OSD 的 RocksDB / WAL 一起没了。16T 上的 object 数据还在盘上,但没有 DB 就起不来,不能当原 OSD 救。只能 purge 这 4 个,擦这 4 块 16T,换上新缓存,再建成 4 个新 OSD,从另外两台把那一份 EC 重建回来。
和换 16T 的关键差别
| 换一块 16T | 换槽 10 | |
|---|---|---|
| 这台还剩几个 HDD OSD | 3 个,能接 remap | 0 个 |
3 台上能不能等 safe-to-destroy |
能。同机 3 块会搬完 | 不能。 没有第四台,remap 不会来 |
| purge 的含义 | 数据已经搬走 | 这一台身上那 1/3 已经读不到,靠另外两台 EC 重建 |
| 擦哪些盘 | 只擦新 16T | 新槽 10 以及这台 4 块 16T(旧 BlueStore 作废) |
| 新 OSD 怎么挂 DB | 槽 10 VG 还在,预切 LV + prepare --block.db |
槽 10 是空盘,4 块 16T 一起进,可以走 Rook lvm batch(和 09-11 第一波一样) |
| 全程冗余 | 仍有 3 份里的 3 份(搬完)再重建新盘 | 全程 min_size=2。另外两台再坏一台就丢数据 |
计划换还没坏透的槽 10:3 台上同样没有地方 remap,等于主动进入上面这一行。能拖就拖;必须换时选业务低谷,禁止同时动另外两台、禁止动交换机。
≥4 台已经有 HDD OSD 时:可以先 out 这台 4 个 HDD → 等 remap 到另外三台 → safe-to-destroy → 再按下面 C/D 换缓存。那是 Rook 官方「共享这块 SSD 的 OSD 全删、一次 batch」。现在现场不是。
A. 确认是槽 10,确认另外两台还在
- 同机 4 个 HDD OSD down;storcli 槽 10 对上台账那块 PM883(上一节表)。不要看到 4 个 OSD down 就抽 16T。
- 另外两台 8 个 HDD OSD 全 up,对象池还能写(
min_size=2)。有一台不健康:停手。 - SSD OSD(槽 12/13)应仍 up。不要 purge 它们。
ceph osd out这 4 个 HDD(已经 down 也 out)。不要等 393 PG clean——等不到。
ceph osd out <id1> <id2> <id3> <id4>ceph osd set noscrubceph osd set nodeep-scrubB. 停 OSD,purge(这里等不到 safe-to-destroy)
- operator replicas=0。4 个
rook-ceph-osd-*scale 0,等 pod 没了。 - 分别
ceph osd purge <id> --yes-i-really-mean-it。3 台 + 缓存已坏时,safe-to-destroy会一直 EBUSY,不要为了 EBUSY 去加--force乱 purge 别的 OSD;确认的就是这 4 个、另外两台健康,才 purge 这 4 个。 ceph auth del osd.<id>(若还在)。删 4 个 deploy。清 4 份/var/lib/rook/rook-ceph/<cluster-fsid>_<osd-fsid>。- 不要
dmsetup remove_all。不要动另外两台的槽 10。
C. 只换槽 10,再擦这台 4 块 16T
- 热插拔 槽 10。记下新缓存序列号 / WWN。容量仍按能切 4×430 GiB(企业级 1.92T 这档)。
smartctl -HPASSED。 - 按 WWN 擦 新槽 10。
- 按 WWN 擦这台槽 1、2、3、4 四块 16T。旧 LV / BlueStore 没有 DB 已经不能用。禁止擦另外两台任何盘,禁止擦槽 0 / 11 / 12 / 13。
- 改 CR:这台 4 行 HDD 的
metadataDevice改成 新槽 10 WWN。4 块 16T 自己的 WWN 不要改(还是原盘)。缓存 WWN 不要写进devices:。databaseSizeMB仍是"440320"。helm upgrade。operator 仍保持 0 直到下一步选定怎么 prepare。
D. 空缓存 + 4 块空 16T:让 Rook 一次 batch
- 这是 09-11 第一波那种状态:槽 10 没有 LVM child,4 块数据盘是空的。
kubectl -n rook-ceph scale deploy/rook-ceph-operator --replicas=1。prepare 应按 CR 一次切 4 条 430 GiBosd-db。 - 若仍报
metadata device is not found/none are available:operator 再缩回 0,按 Job 做 4 次(第一次vgcreate槽 10,后面三次在同一 VG 上lvcreate;KEEP_DBS随已做成的条数增加)。 - 硬认:4 个新 OSD
dedicated_db=1、DB 在新 PM883、SCSI 槽 1–4 对、槽 10 VFree 约 68 GiB。改台账:槽 10 新 SN/WWN,4 个 HDD 的新 OSD 号。 - 对象池从另外两台重建约 1/3 到这台。等 393 PG
active+clean。然后:
ceph config set osd osd_mclock_profile balancedceph config set osd osd_max_backfills 16ceph osd unset noscrubceph osd unset nodeep-scrub重建期间不要整机维护、不要动另外两台、不要动 N9K。
擦盘(只按 WWN)
DEV=$(readlink -f /dev/disk/by-id/wwn-0x…)lsblk -ndo SERIAL,SIZE,MODEL "$DEV" # 必须对上台账wipefs -a "$DEV"sgdisk --zap-all "$DEV"dd if=/dev/zero of="$DEV" bs=1M count=64 oflag=direct status=progresspartprobe "$DEV"wipefs "$DEV" # 应为空不要 blkdiscard 当擦盘。不要对槽 10 走 ceph-volume lvm zap,除非这条流程写明槽 10 整块作废(缓存盘那条的第 10 步用 wipefs,不是 zap 还活着的 VG)。
手挂槽 10 的 Job
换一块 16T 时必走。换槽 10 时只在 Rook batch 失败后走。
hostIPC: true,特权,镜像harbor.cyxc.club/quay/ceph/ceph:v19.2.3- 不要挂宿主机
/etc/lvm,不要挂整个/run - 挂:
/dev、/run/udev、/run/lock、/var/lib/rook ceph auth get client.bootstrap-osd- 槽 10:
lvcreate --noudevsync -y -Wn -Zn -L 440320M(不要-W y) - 16T:
pvcreate --yes(不要--noudevsync)→vgcreate --yes→lvcreate --noudevsync -y -Wn -Zn -l 100%FREE→dmsetup mknodes ceph-volume lvm prepare --bluestore --no-systemd --crush-device-class hdd --data <vg/lv> --block.db <槽10-vg/osd-db>- 换 16T:
KEEP_DBS= 其余 3 条已有osd-db,禁止用错 LV - 骨架和踩坑见 重建博客 · 做成这样才稳 和 附录:Job 骨架
不要做
- 没分清 16T / 槽 10 就开始抽盘
- 换 16T 时擦槽 10,或
dmsetup remove_all - 换槽 10 时去抽 / 擦另外两台的盘
- 换一块 16T 却
out同机 4 块(3 台上等于缓存盘那条的风险) - 换 16T 时不等
safe-to-destroy就 purge - 换槽 10 时死等
safe-to-destroy(3 台等不到),或反过来把 EBUSY--force用到别的 OSD 上 - 换 16T 之后开 operator 等它自动挂槽 10
- 把新缓存 WWN 写进
devices: - 用
/dev/sdX擦盘 - 缓存盘流程进行中动另外两台或交换机
- 用
osd.rook.io/replace/rook-ceph-purge-osdJob
这篇没写的
| 情况 | |
|---|---|
| 槽 12/13 的 960G | 不走 metadataDevice,流程未写 |
| 槽 0 系统盘 | 不进 Ceph |
| 槽 11 / 槽 5–8 加盘 | 空槽 11 上 4 块 16T 一起加 才能走 09-11 的 lvm batch;加一块就会再踩 metadata device is not found |
| 同机两块 16T 同时坏 | 先只处理一块;两块一起 out 时同机只剩 2 个 HDD OSD,另写窗口 |
| 把 DB 从旧槽 10 live migrate 到新 SSD | ceph-bluestore-tool bluefs-bdev-migrate 本集群 未验证,坏盘时旧缓存也读不出 |