跳到正文
cyxc.club

机械盘和缓存盘故障时怎么换

/ 约 12 分钟

三台 Dell R730xd:k8s-10-1-16-2110.1.16.21)、k8s-10-1-16-22k8s-10-1-16-23。Rook v1.17.9,Ceph Squid 19.2.3,host-based OSD。对象池 ceph-objectstore.rgw.buckets.data:EC 2+1、故障域 hostmin_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.212223。 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 系统盘 不是这两条 见文末

核对:

Terminal window
ceph -s
ceph osd tree
ceph osd metadata osd.<id> | grep -E 'hostname|device_ids|device_paths|bluefs_dedicated'
storcli /c0/e32/s<槽> show
lsblk -ndo SERIAL,SIZE,MODEL /dev/disk/by-id/wwn-0x<WWN>

device_pathsscsi-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. 认盘,数据先搬走

  1. 用序列号 / WWN / 槽对上 OSD(上一节命令)。
  2. 盘还在服务:ceph osd out <id>。已经 down:看 ceph -s,该走的 remap 是否已经走完。
  3. 全部 PG active+clean、没有 remapped
  4. ceph osd safe-to-destroy <id> 必须通过。EBUSY 就再等,不要 --force

可选:ceph osd set noscrub / nodeep-scrub;回填慢再临时 osd_mclock_profile=high_recovery_opsosd_max_backfills=24。干净后改回 balanced / 16 并 unset scrub。

B. 停 OSD,purge,抽旧盘

  1. kubectl -n rook-ceph scale deploy/rook-ceph-operator --replicas=0
  2. kubectl -n rook-ceph scale deploy/rook-ceph-osd-<id> --replicas=0,等 pod 消失。
  3. ceph osd purge <id> --yes-i-really-mean-it
  4. ceph auth ls | grep osd.<id> 还在:ceph auth del osd.<id>(09-14 在 16.22 不删会 key does not match)。
  5. kubectl -n rook-ceph delete deploy rook-ceph-osd-<id>。清 /var/lib/rook/rook-ceph/<cluster-fsid>_<osd-fsid>,否则 raw list 会起幽灵 deploy。
  6. 先核槽 10,再抽盘。 该机其余 3 条 osd-db 必须还在;刚 purge 的那条一般会随 zap 消失,VFree 大约从 68 GiB 回到 ~498 GiB。少一条都不要抽盘。禁止 dmsetup remove_all
  7. 热插拔 同一槽。禁止碰槽 0 / 10 / 11 / 12 / 13。

C. 新盘进 CR,手挂槽 10

  1. storcli 确认新盘在同一槽。记下 序列号 / WWN。smartctl -H 要 PASSED。16T CMR,不要 SMR。
  2. 只按新 WWN 擦盘
  3. rook-ceph-cluster.yaml 里这一行 devices::WWN、注释里的序列号 / 槽。metadataDevice 仍是 该机槽 10 旧 WWN,不要改成新 16T。helm upgrade(或等价)把 CR 改出去。operator 先保持 0。
  4. 手挂槽 10 的 Job prepare。KEEP_DBS = 槽 10 上还在跑的 3 条 osd-db
  5. 宿主机 pvscan --cache
  6. ceph-volume lvm list 能看见新 OSD。
  7. kubectl -n rook-ceph scale deploy/rook-ceph-operator --replicas=1。Rook lvm list 收养。不要指望 lvm batch
  8. 硬认:device_ids 含新 16T 序列号 + 该机槽 10 PM883;SCSI 槽号对;bluefs_dedicated_db=1、WAL=0、DB 430 GiB。改台账和 CR 注释里的 OSD 号。
  9. 等 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,确认另外两台还在

  1. 同机 4 个 HDD OSD down;storcli 槽 10 对上台账那块 PM883(上一节表)。不要看到 4 个 OSD down 就抽 16T。
  2. 另外两台 8 个 HDD OSD 全 up,对象池还能写(min_size=2)。有一台不健康:停手
  3. SSD OSD(槽 12/13)应仍 up。不要 purge 它们。
  4. ceph osd out 这 4 个 HDD(已经 down 也 out)。不要等 393 PG clean——等不到。
Terminal window
ceph osd out <id1> <id2> <id3> <id4>
ceph osd set noscrub
ceph osd set nodeep-scrub

B. 停 OSD,purge(这里等不到 safe-to-destroy)

  1. operator replicas=0。4 个 rook-ceph-osd-* scale 0,等 pod 没了。
  2. 分别 ceph osd purge <id> --yes-i-really-mean-it。3 台 + 缓存已坏时,safe-to-destroy 会一直 EBUSY,不要为了 EBUSY 去加 --force 乱 purge 别的 OSD;确认的就是这 4 个、另外两台健康,才 purge 这 4 个。
  3. ceph auth del osd.<id>(若还在)。删 4 个 deploy。清 4 份 /var/lib/rook/rook-ceph/<cluster-fsid>_<osd-fsid>
  4. 不要 dmsetup remove_all。不要动另外两台的槽 10。

C. 只换槽 10,再擦这台 4 块 16T

  1. 热插拔 槽 10。记下新缓存序列号 / WWN。容量仍按能切 4×430 GiB(企业级 1.92T 这档)。smartctl -H PASSED。
  2. 按 WWN 擦 新槽 10
  3. 按 WWN 擦这台槽 1、2、3、4 四块 16T。旧 LV / BlueStore 没有 DB 已经不能用。禁止擦另外两台任何盘,禁止擦槽 0 / 11 / 12 / 13。
  4. 改 CR:这台 4 行 HDD 的 metadataDevice 改成 新槽 10 WWN。4 块 16T 自己的 WWN 不要改(还是原盘)。缓存 WWN 不要写进 devices:databaseSizeMB 仍是 "440320"。helm upgrade。operator 仍保持 0 直到下一步选定怎么 prepare。

D. 空缓存 + 4 块空 16T:让 Rook 一次 batch

  1. 这是 09-11 第一波那种状态:槽 10 没有 LVM child,4 块数据盘是空的。kubectl -n rook-ceph scale deploy/rook-ceph-operator --replicas=1。prepare 应按 CR 一次切 4 条 430 GiB osd-db
  2. 若仍报 metadata device is not found / none are available:operator 再缩回 0,按 Job 做 4 次(第一次 vgcreate 槽 10,后面三次在同一 VG 上 lvcreateKEEP_DBS 随已做成的条数增加)。
  3. 硬认:4 个新 OSD dedicated_db=1、DB 在新 PM883、SCSI 槽 1–4 对、槽 10 VFree 约 68 GiB。改台账:槽 10 新 SN/WWN,4 个 HDD 的新 OSD 号。
  4. 对象池从另外两台重建约 1/3 到这台。等 393 PG active+clean。然后:
Terminal window
ceph config set osd osd_mclock_profile balanced
ceph config set osd osd_max_backfills 16
ceph osd unset noscrub
ceph osd unset nodeep-scrub

重建期间不要整机维护、不要动另外两台、不要动 N9K。


擦盘(只按 WWN)

Terminal window
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=progress
partprobe "$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 --yeslvcreate --noudevsync -y -Wn -Zn -l 100%FREEdmsetup 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-osd Job

这篇没写的

情况
槽 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 本集群 未验证,坏盘时旧缓存也读不出