第 10/20 天
在 Ceph 存储生态中,块存储(RADOS Block Device,简称 RBD)是最核心、应用最广泛的一种数据访问接口。无论是为虚拟化平台提供虚拟磁盘,还是为 Kubernetes 集群提供持久化卷,亦或是为数据库提供高性能共享存储,RBD 都扮演着至关重要的角色。本篇将深入解析 RBD 的架构原理,并在 Ubuntu 24.04 LTS + Ceph Squid v19 环境下完成从镜像创建到客户端挂载的完整生产实践。
RBD 架构与工作原理
RBD 在 Ceph 体系中的位置
Ceph 提供三种存储接口:块存储(RBD)、对象存储(RGW)和文件系统(CephFS)。RBD 基于底层 RADOS 对象存储集群,将一个块设备镜像(image)切分为多个等大小的对象(object),直接分布在存储池的多个 OSD 上。
| 层级 | 组件 | 职责 |
|---|---|---|
| 客户端层 | librbd / krbd | RBD 客户端库与内核模块 |
| 接口层 | RBD Image | 虚拟块设备镜像管理 |
| 条带化层 | stripe | 将镜像分条写入对象 |
| 存储池层 | Pool / PG | 数据放置与 CRUSH 映射 |
| 存储层 | OSD / BlueStore | 实际数据持久化 |
数据流向与条带化机制
RBD 镜像由三层结构组成:image → stripe unit → object。每个 object 默认大小为 4 MB,再按 stripe unit(默认 64 KB)进行条带化。这种设计带来三大优势:
- 并行 I/O:一个镜像的数据分布在数百个 OSD 上,客户端可并行读写
- 精简置备(Thin Provisioning):创建镜像时只分配元数据,实际数据按需写入
- 快照与克隆:基于 COW(Copy-On-Write)机制,快照零成本、克隆秒级完成
内核客户端 vs 用户态客户端
# 内核客户端 krbd:性能高,适用于裸机/虚拟机块设备挂载
modprobe rbd
ls /sys/bus/rbd/
# 用户态客户端 librbd:兼容性好,适用于 QEMU/KVM 虚拟机磁盘
qemu-img info rbd:pool-name/image-name
生产环境中,KVM 虚拟机磁盘推荐使用 librbd(通过 QEMU 直接调用),而宿主机直接使用块设备则用 krbd 内核模块。两者性能差异在 5%–10% 左右,内核客户端在高并发顺序写场景更优。
RBD 与存储池的关系
RBD 镜像必须创建在副本池上(纠删码池需通过特殊配置且限制较多,生产环境不推荐直接用于 RBD)。每个镜像在存储池中对应一个 rbd_directory 对象和多个数据对象:
{
"pool": "rbd-pool",
"image": "vm-disk-01",
"objects": 2560,
"object_size": "4M",
"stripe_unit": "64K",
"stripe_count": 8
}
部署实战:RBD 配置全流程
环境准备
假设集群已部署完毕(前 9 天内容),包含 3 MON、3 OSD 节点。现在需要在专用客户端节点上挂载 RBD 块设备。
# 在客户端节点安装 Ceph 客户端工具(Ubuntu 24.04)
apt update
apt install -y ceph-common librbd1
# 验证版本(Squid v19)
ceph –version
# 期望输出: ceph version 19.2.x (squid)
# 从管理节点拷贝 ceph.conf 和 keyring 到客户端
scp /etc/ceph/ceph.conf client-node:/etc/ceph/
scp /etc/ceph/ceph.client.admin.keyring client-node:/etc/ceph/
chmod 600 /etc/ceph/ceph.client.admin.keyring
# 确认客户端可访问集群
ceph -s
创建专用存储池
# 创建 RBD 专用副本池(生产环境推荐 size=3, min_size=2)
ceph osd pool create rbd-pool 128 128 replicated
# 设置存储池为 RBD 应用类型
ceph osd pool application enable rbd-pool rbd
# 查看 PG 数量是否符合预期
ceph osd pool get rbd-pool pg_num
ceph osd pool get rbd-pool size
上述命令中 128 是初始 PG 数,对于 3 节点 × 多盘环境,128 个 PG 可保证良好的数据分布。PG 数量规划详见第 8 天内容。
创建 RBD 镜像
# 创建一个 100GB 的精简置备镜像
rbd create vm-disk-01 –size 100G –pool rbd-pool
# 指定镜像特性(Squid 默认启用 layering, exclusive-lock, object-map, fast-diff)
rbd create vm-disk-02 –size 200G –pool rbd-pool
–image-feature layering,exclusive-lock,object-map,fast-diff,deep-flatten
# 查看镜像列表与详情
rbd ls rbd-pool
rbd info rbd-pool/vm-disk-01
输出示例:
rbd image 'vm-disk-01':
size 100 GiB, 25600 objects, order 22 (4 MiB objects)
snapshot_count: 0
id: 1a2b3c4d5e6f
block_name_prefix: rbd_data.1a2b3c4d5e6f
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sat Oct 3 11:30:00 2026
access_timestamp: Sat Oct 3 11:30:00 2026
modify_timestamp: Sat Oct 3 11:30:00 2026
内核模块挂载 RBD
# 映射 RBD 镜像到本地块设备
rbd map rbd-pool/vm-disk-01 –name client.admin
# 查看映射结果
rbd showmapped
# 输出示例:
# id pool namespace image snap device
# 0 rbd-pool vm-disk-01 – /dev/rbd0
# 格式化块设备
mkfs.ext4 /dev/rbd0
# 挂载使用
mkdir -p /mnt/rbd-data
mount /dev/rbd0 /mnt/rbd-data
df -h /mnt/rbd-data
客户端专用用户权限配置
生产环境中不应将 admin keyring 分发给所有客户端,需要创建专用 RBD 用户:
# 创建仅可访问 rbd-pool 的客户端用户
ceph auth get-or-create client.rbd-user
mon 'profile rbd'
osd 'profile rbd pool=rbd-pool'
-o /etc/ceph/ceph.client.rbd-user.keyring
# 查看用户权限
ceph auth get client.rbd-user
# 客户端使用专用用户挂载
rbd map rbd-pool/vm-disk-01 –name client.rbd-user
–keyring /etc/ceph/ceph.client.rbd-user.keyring
开机自动挂载配置
# 方式一:通过 rbdmap 服务自动映射
cat > /etc/ceph/rbdmap << 'EOF'
rbd-pool/vm-disk-01 id=rbd-user,keyring=/etc/ceph/ceph.client.rbd-user.keyring
EOF
# 启用 rbdmap 服务
systemctl enable rbdmap
systemctl start rbdmap
# 方式二:fstab 挂载(注意 nofail 防止集群不可用时卡死启动)
echo "/dev/rbd/rbd-pool/vm-disk-01 /mnt/rbd-data ext4 defaults,noatime,nofail 0 0" >> /etc/fstab
mount -a
关键配置参数详解
镜像特性(features)
# 查看默认特性
ceph config get mgr rbd_default_features
# 修改全局默认特性(生产推荐值)
ceph config set mgr rbd_default_features 61
# 单个镜像修改特性
rbd feature disable rbd-pool/vm-disk-01 object-map fast-diff
rbd feature enable rbd-pool/vm-disk-01 object-map fast-diff
| 特性 | 值 | 说明 |
|---|---|---|
| layering | 1 | 支持克隆分层 |
| striping v2 | 2 | 条带化 v2 |
| exclusive-lock | 4 | 排他锁,防多客户端并发写 |
| object-map | 8 | 对象映射,加速 I/O |
| fast-diff | 16 | 快速差异计算 |
| deep-flatten | 32 | 快照扁平化 |
| journaling | 64 | 日志记录(用于异步镜像) |
默认特性值 61 = layering(1) + exclusive-lock(4) + object-map(8) + fast-diff(16) + deep-flatten(32)。
块大小与条带化参数
# 创建时指定 object-size 和 stripe 参数
rbd create high-perf-disk –size 500G –pool rbd-pool
–object-size 8M
–stripe-unit 256K
–stripe-count 16
# 参数影响分析
# object-size: 越大顺序写越好,但故障恢复时单对象重平衡压力大
# stripe-unit: 越小随机写越平滑,但元数据开销增大
# stripe-count: 越大并行度越高,但单次写跨 OSD 数量多
RBD 缓存配置
# 客户端 librbd 缓存(写入 ceph.conf [client] 段)
cat >> /etc/ceph/ceph.conf << 'EOF'
[client]
rbd cache = true
rbd cache size = 33554432
rbd cache max dirty = 25165824
rbd cache target dirty = 16777216
rbd cache max dirty age = 1.0
rbd cache writethrough until flush = true
EOF
RBD 快照与克隆实战
快照管理
# 创建快照(需要先禁用 exclusive-lock 或使用 flatten)
rbd snap create rbd-pool/vm-disk-01@snap-2026-10-03
# 查看快照列表
rbd snap ls rbd-pool/vm-disk-01
# 保护快照(被保护的快照不可删除,防止克隆损坏)
rbd snap protect rbd-pool/vm-disk-01@snap-2026-10-03
# 从快照回滚(生产慎用,会丢失快照后的数据)
rbd snap rollback rbd-pool/vm-disk-01@snap-2026-10-03
# 清理快照
rbd snap unprotect rbd-pool/vm-disk-01@snap-2026-10-03
rbd snap remove rbd-pool/vm-disk-01@snap-2026-10-03
从快照克隆(分层镜像)
# 基于受保护的快照创建克隆镜像(瞬间完成,零数据拷贝)
rbd clone rbd-pool/vm-disk-01@snap-2026-10-03 rbd-pool/vm-disk-01-clone
# 查看克隆镜像的父子关系
rbd children rbd-pool/vm-disk-01@snap-2026-10-03
rbd info rbd-pool/vm-disk-01-clone
# 扁平化克隆(将父镜像数据拷贝到子镜像,解除依赖)
rbd flatten rbd-pool/vm-disk-01-clone
克隆机制非常适合虚拟机模板场景:先制作一个基础镜像快照,然后基于该快照克隆出数十台虚拟机,磁盘占用接近零。

生产环境注意事项与踩坑提示
1. 内核版本兼容性
Squid v19 的 RBD 镜像默认启用了 object-map 和 fast-diff 特性,旧内核(< 5.4)的 krbd 模块不支持这些特性,映射时会报错 feature not supported。Ubuntu 24.04 内核为 6.8,完全兼容。但若客户端是旧系统,需在创建镜像时禁用不兼容特性:
# 为旧内核客户端创建兼容镜像
rbd create legacy-disk –size 50G –pool rbd-pool
–image-feature layering
2. 排他锁与多客户端风险
exclusive-lock 特性会阻止多个客户端同时写入同一个镜像。对于 QEMU/KVM 虚拟机迁移场景(live migration),这是必要保护。但如果你尝试在两台主机上同时 map 同一镜像并写入,后挂载的客户端会报错 Retrying, after attempting to obtain exclusive lock。需要多主机共享读时,使用 --read-only 参数映射。
3. discard/TRIM 支持
精简置备镜像需要正确配置 discard 才能回收已删除数据的空间,否则存储池空间只增不减:
# 挂载时启用 discard
mount -o discard /dev/rbd0 /mnt/rbd-data
# 或在 fstab 中配置
# /dev/rbd/rbd-pool/vm-disk-01 /mnt/rbd-data ext4 discard,noatime,nofail 0 0
# 手动触发 TRIM
fstrim /mnt/rbd-data
# 验证镜像实际占用空间
rbd du rbd-pool/vm-disk-01
4. 网络与 I/O 性能调优
# 客户端 I/O 调优参数(ceph.conf [client] 段)
rbd io_timeout = 120 # I/O 超时(秒),默认 60
rbd readahead trigger requests = 10
rbd readahead max bytes = 1048576 # 预读上限 1MB
# 查看实时 I/O 性能
ceph tell osd.* bench
rbd perf image iotop rbd-pool/vm-disk-01
5. 安全考量
- admin keyring 绝不分发给普通客户端,必须创建专用用户并限制到具体存储池
- 定期轮换 client keyring(
ceph auth caps修改权限后旧 key 立即失效) - RBD 块设备上的数据未加密,敏感数据建议在文件系统层使用 LUKS 加密
6. 监控 RBD 镜像健康
# 查看 RBD 镜像的 I/O 统计
rbd stats rbd-pool/vm-disk-01
# 集群级别的 RBD 监控
ceph df
rbd pool stats rbd-pool
常见问题
Q1: rbd map 报错 “sysfs write failed” 如何处理?
这是因为内核 krbd 模块不支持镜像启用的某些特性。执行 dmesg | grep rbd 查看具体不支持的特性名称,然后用 rbd feature disable 禁用对应特性后重新映射。
Q2: RBD 镜像删除后存储池空间未释放怎么办?
检查是否有快照引用该镜像。使用 rbd children 查看是否有克隆依赖,先 flatten 子镜像、删除快照,再删除镜像。删除后空间会异步回收,可用 ceph df 观察空间回收进度。
Q3: 生产环境中 RBD 镜像最大支持多大?
Ceph RBD 单镜像理论支持 8 EB(64 位寻址),但实际受限于存储池总容量和 OSD 数量。生产实践中,单个 RBD 镜像建议不超过 16 TB,超过此规模建议拆分为多个镜像,以降低快照/恢复时间和单镜像故障影响面。
总结
本篇深入讲解了 Ceph RBD 块存储的架构原理与数据流向,完成了从存储池创建、镜像创建、内核挂载、用户权限管理到快照克隆的完整生产部署流程。关键要点:RBD 基于 RADOS 实现精简置备与并行 I/O;生产环境必须用专用用户而非 admin;正确配置 discard 和缓存才能保证性能与空间利用率;快照克隆是虚拟化模板场景的利器。
RBD 是 Ceph 在虚拟化和容器化场景的核心武器,掌握它就掌握了 Ceph 块存储生产部署的全部能力。
下期预告
明天(第 11 天)将发布 Ceph 对象存储 RGW 网关部署与 S3 兼容,从 RGW 架构原理到 S3/Swift API 对接、多站点同步,全面覆盖 Ceph 对象存储生产部署,敬请期待。
系列目录
- ✅ 第 1 天:Ceph 架构概述与生产环境选型指南
- ✅ 第 2 天:Ubuntu 系统准备:内核调优与磁盘规划
- ✅ 第 3 天:Cephadm 部署工具详解与集群引导初始化
- ✅ 第 4 天:Monitor 节点部署与高可用配置
- ✅ 第 5 天:Manager 节点部署与模块启用
- ✅ 第 6 天:OSD 存储节点部署:BlueStore 配置与磁盘管理
- ✅ 第 7 天:CRUSH Map 架构解析与故障域规划
- ✅ 第 8 天:存储池(Pool)创建与 PG 数量规划
- ✅ 第 9 天:副本与纠删码存储池策略对比实战
- 📌 第 10 天:Ceph 块存储 RBD 配置与生产实践(本文)
- ⏳ 第 11 天:Ceph 对象存储 RGW 网关部署与 S3 兼容
- ⏳ 第 12 天:CephFS 分布式文件系统部署与挂载
- ⏳ 第 13 天:Ceph 网络架构:集群网络与公共网络分离
- ⏳ 第 14 天:Ceph 认证体系 cephx 与用户权限管理
- ⏳ 第 15 天:Ceph 集群监控:Prometheus + Grafana + 内置仪表盘
- ⏳ 第 16 天:Ceph 性能调优:OSD 参数与缓存分层
- ⏳ 第 17 天:Ceph 集群扩容实战:OSD 动态添加与 CRUSH 重平衡
- ⏳ 第 18 天:Ceph 高可用与容灾设计:多副本、跨机房与异地灾备
- ⏳ 第 19 天:Ceph 故障排查与数据恢复实战
- ⏳ 第 20 天:Ceph 生产环境升级维护与版本迭代策略

















暂无评论内容