3. 块存储 RBD
本章目标
- 完整走一遍 RBD:创建 → 映射 → 挂载 → 扩容 → 快照 → 克隆
- 理解"薄置备 + 快照链"机制
- 理解 RBD 在虚拟化/云盘场景的位置与性能要点
3.1 RBD 是什么
RBD(RADOS Block Device)= 第 4 章网络块设备 的分布式加强版:
- 把虚拟磁盘切成 4MiB 对象散到 pool(默认
rbd),条带横跨多个 OSD —— 一块盘天然吃到整个集群的并行度 - 薄置备:
create --size 1T只写元数据,实际按写入增长;分配发生在每个 4MiB 对象首次写入时 - 两种访问路径:内核
rbd模块(块节点/物理机)、librbd 直连(QEMU/KVM 云主机路径,性能最好)
3.2 核心操作流
bash
# 创建与挂载(客户端需要 ceph-common 与 kernel rbd 模块)
rbd create vm-disk --size 100G --pool rbd
rbd map rbd/vm-disk # 出现 /dev/rbd0
mkfs.xfs /dev/rbd0 && mount /dev/rbd0 /mnt/vm
# 在线扩容(三步:镜像 → 内核识别 → 文件系统)
rbd resize rbd/vm-disk --size 200G
resize2fs /dev/rbd0 # ext4;xfs 用 xfs_growfs <挂载点>
# 快照与回滚
rbd snap create rbd/vm-disk@before-upgrade
rbd snap rollback rbd/vm-disk@before-upgrade # 注意:回滚前需 unmap 或接受一致性代价
# 薄克隆(模板→虚拟机的标准玩法)
rbd snap protect rbd/vm-disk@golden
rbd clone rbd/vm-disk@golden rbd/vm-clone-1 # 秒级,不复制数据
rbd flatten rbd/vm-clone-1 # 可选:拍平依赖,变独立快照链的代价:每次快照后读旧块、写新块都要查"这个块属于哪一层",链越长越慢 —— 深度 >5 就该 flatten。与 LVM COW(第一篇)同思想:快照是 O(1) 创建,但不是免费的。
3.3 性能要点
rbd cache:内核 rbd 与 librbd 默认开回写缓存 ——writeback模式下主机掉电可能丢最近写入,云盘场景用 mirror/快照兜底,别裸关- 条带参数:默认
object_size 4M / stripe_unit 4M。极少数超大顺序写场景才值得调,先测后调 - 测量姿势:fio 直接对
/dev/rbd0(--ioengine=libaio --direct=1),用第一篇的观测链同时看:客户端 fio、OSD 侧ceph -s的 load、网络流量 —— 三点对齐才有完整的性能画像
延迟预期管理(呼应第一篇延迟账):全闪 3 副本集群 4K 随机写 P50 约 0.5~1ms 是正常水位;"RBD 怎么不像本地 NVMe"不是故障,是物理。
3.4 典型场景
| 场景 | 用法 |
|---|---|
| 私有云虚拟机盘 | QEMU + librbd,配合 rbd cache |
| K8s 动态卷 | RBD CSI(第三篇),数据库/中间件的 RWO 盘 |
| 物理机块设备 | rbd map,给无法装客户端的场景可走 iSCSI 网关 |
RBD 是"数据库/虚拟机"这类独占块设备负载的答案;多机共享同一目录请走 CephFS,HTTP API 存取走 RGW —— 三接口选型第一问永远是"应用怎么访问"。
本章小结
- RBD = 4MiB 对象化的网络块设备,薄置备 + 条带跨 OSD
- 六连招:create → map → resize → snap → rollback → clone;快照链深了要 flatten
- librbd(QEMU)路径性能最好;rbd cache 有掉电窗口
- 独占块负载用 RBD,共享目录用 CephFS,API 访问用 RGW
自测
Quizrbd create 一个 1TiB 镜像后立刻 `rbd du` 查看,实际占用约为?
Quiz基于快照 `@golden` clone 出的虚拟机盘,运行一个月后变慢。最相关的解释是?
Lab · RBD 全流程:创建→挂载→快照→克隆进阶
1. 创建 100G RBD(thin),映射挂载,写入 5GB 测试数据;`rbd du` 与 `ceph df` 双向验证薄置备。 2. 快照 `@v1` → 删掉一半文件 → `ls` 确认 → 回滚快照 → 验证文件全部回来。 3. `protect + clone` 出 3 个克隆盘同时 map 挂载(注意克隆盘与原卷的 UUID 冲突处理:`rbd map` 时用 `--exclusive` 理解为什么共享写是不安全的)。 4. fio 压测 4K 随机写:`fio --name=t --filename=/dev/rbdX --rw=randwrite --bs=4k --ioengine=libaio --direct=1 --runtime=60 --time_based`,同时另一终端 `ceph -s` 观察 client load 与恢复活动。 5. 对第 3 步的一个克隆盘执行 `flatten`,用 `rbd info` 观察前后的 parent 与 size 变化。 6. **验收标准**:能解释"薄克隆为什么几乎不占空间、什么情况下会变慢",以及 fio 期间客户端 IOPS 与 `ceph -s` load 的对应关系。
📎 参考手册 ↗