三台 R730xd 在 2026-09-03 换成裸机 之后,对象池还在 6 块 960G 上,还能写大约 2.4 TiB。TrueNAS 10.1.16.254 上 12 块 16T 做一组 RAIDZ2,NFS 看得见大约 133T、已用大约 30T。另外还有 2 块闲置 16T,本来就不在这组 RAIDZ2 里。盘位怎么锁、容量怎么算,见上一篇:三台 R730xd 的槽位和容量。这篇只写数据怎么离开 NAS、盘怎么进前舱。
不要整池 rsync 进 Ceph,也不要指望 RAIDZ2 在线抽盘缩容。
目录
- 要解决什么
- RAIDZ2 抽不出来
- 不要整池灌进对象存储
- 时间线(CST,UTC+8)
- 不进对象池的先拷走
- 3 块 16T 先把对象池落到机械盘
- rclone 进 RGW
- 迁完再拆池
- 和容量规划怎么接
要解决什么
现网对象池 ceph-objectstore.rgw.buckets.data:EC 2+1、故障域 host。09-03 刚换完底座时前舱没有 16T,对象还挤在后舱 960G 上,还能写大约 2.4 TiB。30T 进不去。TrueNAS 的 12 块当时还在服役,不能先整组拆给 Ceph。手头另有 2 块闲置 16T,不在那组 RAIDZ2 里,可以先用。
所以要两头错开:先让对象池落到机械盘上(容量够装要迁的那一批),用 rclone 进 RGW,其余拷移动盘,再销毁 hdd-pool,12 块 16T 进三台前舱。块 / CephFS / RGW 索引一直钉在后舱 960G,这篇不动它们。
RAIDZ2 抽不出来
12 块 16T 单组 RAIDZ2:大约 10 块数据 + 2 块校验。ZFS 不能从 vdev 里拿掉几块,也不能把 12 宽收成 8 宽。近年 OpenZFS 只能给 RAIDZ 加盘,不能减。换成更小的盘也不行,替换盘必须 ≥ 16T,容量不会变小。
抽 1 块,池变成 DEGRADED,文件还在,NFS 还能用,可用容量还是大约 133T,还剩 1 块校验。抽 2 块也能读,但再坏一块整池结束。热备 / SLOG / L2ARC 可以摘,那不是 RAIDZ 成员,摘了数据容量不变。这次只抽 1 块:手头已经有 2 块闲置,凑齐三台各 1 块就够。
想把盘挪到 21/22/23:只能先把要保留的数据迁走,停写,销毁 hdd-pool,擦净再插。不要把还在池里的盘擦了去做 OSD。
不要整池灌进对象存储
09-04 早上本机 zfs / du:hdd-pool 上要搬走的数据合计大约 27.9 TiB,无快照,未加密,压缩关。其中大约 25 TiB 进对象池,其余大约 3 TiB 不走 RGW。
3 块 16T、EC 2+1,用户侧大约能装 25T(会过 nearfull,到不了 95% 停写)。把整池灌进去会顶到 90% 附近。所以:
- 大约 25 TiB → RGW(一个桶)
- 其余 → 5T 移动盘,核对后再从源上删
不要整池 rsync 进对象存储。对象池按 key 存,不是再做一份 POSIX 树。
时间线(CST,UTC+8)
| 时间 | 做什么 |
|---|---|
| 09-03 | 三台裸机就绪,对象还在 960G 上,大约还能写 2.4 TiB |
| 09-04 凌晨 | ceph-block fio(证明加 SSD OSD 救不了对象池);盘位角色锁死 |
| 09-04 白天 | 确认 RAIDZ2 不能缩;定「只迁进对象池的那一批,其余走移动盘」 |
| 09-04 20:17 起 | TrueNAS 上 5T USB 做成单盘池,拷不进对象池的那部分(--remove-source-files) |
| 09-04 晚 | 2 块闲置 16T(不在 TrueNAS 里)加上 RAIDZ2 抽 1 块(offline,不对 sdX),三台各 1 块做成 HDD OSD |
| 09-05 00:11 | 三台各 1 个 HDD OSD 已 up(当晚的 OSD 号后来换过盘,认序列号),crush 落到 default~hdd,对象池在回填 |
| 09-05 00:49 起 | TrueNAS 配 rclone → 内网 RGW 入口。回填未干净时 先不灌 25T |
| 回填接近 clean 之后(具体开拷的钟点我这边没有记下) | rclone copy 进对象桶 |
| 迁完核对、停写 | 销毁 hdd-pool,剩下的盘进前舱槽 1–4;10.1.16.254 关机,不要开机、不要把盘插回去 |
USB 拷贝墙钟大约十几个小时,卡在移动盘大约 40 MB/s。降级抽盘对这次拷贝几乎无感:瓶颈在 USB,不在池。
不进对象池的先拷走
不进 RGW 的大约 2.9 TiB,5T 装得下。盘做成 TrueNAS 能认的单盘 ZFS,不要格式化成还在 hdd-pool 里的那 12 块。拷贝带 --remove-source-files,拷完的文件源上已经没了,最后清空目录即可。
这条路径和 rclone 抢同一组机械盘的读。09-05 凌晨 USB 还在跑的时候,不要同时开 25T 上传。
3 块 16T 先把对象池落到机械盘
手头本来就有 2 块闲置 16T,不在 TrueNAS 那组 RAIDZ2 里。EC 2+1 还差一台,所以只从 RAIDZ2 抽 1 块(offline),三台各插 1 块:槽位按容量规划来,前舱左列,不当缓存、不当 ssd OSD。09-04 23:50 按 WWN 做成 HDD OSD。09-05 00:11 机械盘上大约 47 GiB,对象池 stored 大约 119 GiB,MAX AVAIL 大约 28 TiB,够装要迁的那一批。当晚的 OSD 号后来重建时换过,这篇只认「三台各一块 16T」,不认当时的 id。
三台各 1 块才能开迁。每台 1 块也不「好看」,只是桥。TrueNAS 拆掉之后才是每台 4 块。
抽那 1 块用 partuuid zpool offline,先停它上面的 swap/md。不要 detach。灯还在闪的时候对序列号,不要对 sdX。
回填期间 HEALTH_WARN、部分 PG acting 缺成员,是新 OSD 还没跟上,不是 PG 太少。当时对象池 256 PG。回填没完不要改 pg_num,不要开 25T rclone。
rclone 进 RGW
TrueNAS 当时 DNS 不通,必须走 /etc/hosts 把 RGW 的名字指到内网 VIP 10.1.10.3,不要走公网解析。remote 类型 S3、provider Ceph、path-style。探测上传成功再删探测对象。
rclone copy 只对要进对象池的那一棵目录,不要把整个 hdd-pool 灌进去。
等 USB 差不多、对象池接近 active+clean 之后再整库。transfers 不要开太大,和回填抢 OSD。核对用 size / 对象数对照,不要只看 rclone 进度条。
当时用过的参数大致是:
tmux new -s rclone-nasrclone copy "<源目录>" rgw:<桶> \ --progress --stats 30s --fast-list \ --transfers 4 --checkers 8 \ --s3-chunk-size 64M --s3-upload-concurrency 4 \ --retries 10 --low-level-retries 20 \ --log-file /var/log/rclone-nas.log --log-level INFO迁完再拆池
对象桶对得上、其余在移动盘上、NAS 停写之后,才销毁 hdd-pool。剩下的 16T 擦净,按槽位规划进 21/22/23 前舱 1–4。原 NAS 关机。N9K Po6 对这台,不要再插回去。
之后才是给这 12 块挂槽 10 缓存,那是 给 6 个旧 HDD OSD 挂槽 10。换盘见 机械盘和缓存盘故障时怎么换。
09-11 对照:对象池 stored 大约 26 TiB。索引仍在 ssd。
和容量规划怎么接
这篇解决「数据怎么离开 RAIDZ2」。容量规划解决「进来之后插哪」,见 三台 R730xd 的槽位和容量。16T 只进 hdd,三台同一天加同规格,缓存不加容量。不要为了把 12 块一次塞满,把 16T 插进最右列,也不要在回填没完时重建还扛着数据的 OSD。
不要:
- 池还在的时候擦 RAIDZ2 成员去做 OSD
- 整池 rsync / rclone 进对象池
- USB 拷贝和第一趟 HDD 回填还在抢盘时开 25T 上传
- 走公网解析 RGW 入口