Skip to content

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 性能要点

  1. rbd cache:内核 rbd 与 librbd 默认开回写缓存 —— writeback 模式下主机掉电可能丢最近写入,云盘场景用 mirror/快照兜底,别裸关
  2. 条带参数:默认 object_size 4M / stripe_unit 4M。极少数超大顺序写场景才值得调,先测后调
  3. 测量姿势: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 全流程:创建→挂载→快照→克隆进阶
⏱ 60 分钟🖥 已完成的 Ceph 实验集群 + 一台客户端
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 的对应关系。
📎 参考手册 ↗

上一章 · 下一章:4. 文件存储 CephFS →