Ceph系列第四期:Ceph块存储(RBD)精讲
本期目标
- 理解 RBD 的工作原理和 IO 流程
- 掌握 RBD 镜像的创建、映射、格式化、挂载
- 熟练使用
rbd命令管理镜像(大小调整、重命名、复制、回收站) - 掌握 RBD 快照的创建、回滚、克隆
- 掌握 RBD 导出/导入及增量备份恢复
- 理解并配置 RBD Mirror 实现跨集群异步复制
前置要求 :已有一个运行正常的 Ceph 集群(参考第二期)。建议先在集群中创建专用的
rbd存储池。
1. RBD 简介
RADOS Block Device (RBD) 是 Ceph 提供的块存储接口。它将块设备镜像(如虚拟机磁盘)以对象的形式存储在 Ceph 集群的池中,支持精简配置、快照、克隆、镜像等高级功能。
1.1 RBD 数据流
text
应用 / 虚拟机
│ 写入块数据
▼
librbd / krbd
│ 切块(默认 4M)
▼
RBD 镜像(image)
│ 对象名:rbd_data.<image_id>.<object_number>
▼
Pool (PG) → CRUSH → OSDs
1.2 RBD IO 流程要点
- 客户端(如 QEMU)将数据写入 RBD 设备。
- RBD 将数据切分为 4MB 的对象(可调)。
- 每个对象通过
pool + object_id计算 PG,再通过 CRUSH 找到主 OSD。 - 客户端与主 OSD 通信完成读写。
- 写入时主 OSD 负责同步至副本 OSD。
2. 准备 RBD 池和用户
2.1 创建池并初始化
bash
# 创建名为 images_pool 的副本池
ceph osd pool create images_pool 32 32
# 初始化池为 RBD 类型(相当于执行 application enable)
rbd pool init images_pool
# 验证
ceph osd pool ls detail | grep images_pool
输出应包含 'application rbd'。
2.2 创建专用 Cephx 用户(推荐)
为避免使用 client.admin 进行日常操作,创建一个受限用户,仅授权访问 images_pool。
bash
ceph auth get-or-create client.rbd \
mon 'profile rbd' \
osd 'profile rbd' \
-o /etc/ceph/ceph.client.rbd.keyring
参数解释:
mon 'profile rbd':预定义配置,允许用户查询 MON 并访问 RBD 相关功能。osd 'profile rbd':允许用户读写 OSD 上的 RBD 数据。
3. RBD 镜像基本管理
3.1 创建镜像
bash
# 语法:rbd create <pool>/<image_name> --size <size>
rbd create images_pool/webapp1 --size 1G
# 查看池中镜像列表
rbd ls images_pool
# 输出:webapp1
# 查看镜像详细信息
rbd info images_pool/webapp1
输出示例:
text
rbd image 'webapp1':
size 1 GiB in 256 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: acb9415d427f
block_name_prefix: rbd_data.acb9415d427f
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
...
关键属性解释:
order:对象大小,2^22 = 4 MiB,可调范围 1225(4K32M)。features:镜像启用的功能,下面详细说明。
3.2 RBD 镜像功能
| Feature | 位 | 说明 |
|---|---|---|
| layering | 1 | 支持分层(快照和克隆的基础) |
| striping | 2 | 支持条带化 v2 |
| exclusive-lock | 4 | 独占锁,防止多客户端冲突 |
| object-map | 8 | 对象映射,加速快照差异计算 |
| fast-diff | 16 | 快速比较快照差异 |
| deep-flatten | 32 | 支持扁平化所有快照 |
| journaling | 64 | 支持 RBD Mirror 日志模式 |
默认启用的功能:layering, exclusive-lock, object-map, fast-diff, deep-flatten
禁用/启用功能示例:
bash
# 禁用 object-map
rbd feature disable images_pool/webapp1 object-map
# 启用 object-map
rbd feature enable images_pool/webapp1 object-map
注意:
layering等不可变功能无法禁用。
3.3 调整镜像大小
bash
# 扩容(在线,不影响使用)
rbd resize images_pool/webapp1 --size 2G
# 缩容(需谨慎,可能导致数据损坏)
rbd resize images_pool/webapp1 --size 1G --allow-shrink
缩容时,建议先确保文件系统也相应缩小(如
xfs_growfs不能缩,resize2fs可以缩)。
3.4 重命名和复制镜像
bash
# 重命名(不能跨池)
rbd rename images_pool/webapp1 images_pool/webapp2
# 跨池复制
rbd cp images_pool/webapp2 images_pool_2/webapp2
images_pool_2需要提前创建并rbd pool init。
3.5 回收站(Trash)管理
删除镜像时可以将其移入回收站,便于恢复。
bash
# 移入回收站
rbd trash mv images_pool/webapp2
# 查看回收站
rbd trash ls images_pool
# 输出:<image_id> webapp2
# 恢复镜像(需使用 image_id)
rbd trash restore -p images_pool <image_id>
# 永久删除回收站中的镜像
rbd trash rm -p images_pool <image_id>
4. 使用 KRBD 映射并挂载 RBD
4.1 客户端安装和配置
在客户端节点(如 client)上操作:
bash
# 安装 ceph-common
dnf install -y ceph-common
# 从管理节点复制配置文件和密钥环
scp root@ceph1:/etc/ceph/ceph.conf /etc/ceph/
scp root@ceph1:/etc/ceph/ceph.client.rbd.keyring /etc/ceph/
# 设置环境变量简化命令(可选)
export CEPH_ARGS='--id=rbd'
4.2 映射 RBD 镜像
bash
# 映射(需要 root 权限)
rbd device map images_pool/webapp1
# 输出:/dev/rbd0
# 查看映射关系
rbd showmapped
# 或
rbd device list
4.3 格式化和挂载
bash
# 格式化(示例:xfs)
mkfs.xfs /dev/rbd0
# 挂载
mkdir -p /webapp/webapp1
mount /dev/rbd0 /webapp/webapp1
# 测试写入
echo "Hello RBD" > /webapp/webapp1/index.html
df -h /webapp/webapp1
4.4 卸载和取消映射
bash
umount /webapp/webapp1
rbd device unmap /dev/rbd0
# 或
rbd unmap images_pool/webapp1
4.5 开机自动挂载
编辑 /etc/ceph/rbdmap:
bash
images_pool/webapp1 id=rbd,keyring=/etc/ceph/ceph.client.rbd.keyring
编辑 /etc/fstab:
bash
/dev/rbd/images_pool/webapp1 /webapp/webapp1 xfs _netdev 0 0
启用服务:
bash
systemctl enable rbdmap.service
5. RBD 快照管理
5.1 创建和查看快照
bash
# 确保镜像未挂载或先 sync 数据
umount /webapp/webapp1
# 创建快照
rbd snap create images_pool/webapp1@snap1
# 列出快照
rbd snap ls images_pool/webapp1
5.2 回滚快照
bash
# 先卸载并取消映射
umount /webapp/webapp1
rbd device unmap /dev/rbd0
# 回滚
rbd snap rollback images_pool/webapp1@snap1
# 重新映射、挂载,数据恢复至快照时状态
回滚前必须确保没有客户端使用该镜像(包括 map 和挂载)。
5.3 删除快照
bash
# 删除单个快照
rbd snap rm images_pool/webapp1@snap1
# 删除所有快照
rbd snap purge images_pool/webapp1
6. RBD 克隆(Clone)
克隆是基于一个受保护的快照创建可写镜像,采用 COW(写时复制) 技术。
6.1 克隆步骤
bash
# 1. 创建快照并保护(保护后可防止意外删除)
rbd snap create images_pool/webapp@snap1
rbd snap protect images_pool/webapp@snap1
# 2. 基于快照创建克隆
rbd clone images_pool/webapp@snap1 images_pool/webapp-clone-1
# 3. 克隆镜像可以正常映射、挂载(与普通镜像无异)
rbd map images_pool/webapp-clone-1
mount /dev/rbdX /mnt/clone
6.2 查看克隆关系
bash
# 查看快照有哪些克隆
rbd children images_pool/webapp@snap1
6.3 扁平化(Flatten)
扁平化会将 COW 父级数据全部拷贝到克隆中,使克隆独立于父快照。
bash
rbd flatten images_pool/webapp-clone-1
扁平化后无法再使用父快照回滚,但克隆可以完全独立删除父镜像。
6.4 克隆镜像的 UUID 冲突处理
克隆镜像与原始镜像有相同的文件系统 UUID,无法同时挂载到同一客户端。解决方法:
bash
# 对于 xfs
xfs_admin -U generate /dev/rbdX
# 对于 ext4
tune2fs -U random /dev/rbdX
7. RBD 导出和导入
7.1 导出镜像到文件
bash
# 导出整个镜像
rbd export images_pool/webapp webapp.img
# 导出快照
rbd export images_pool/webapp@snap1 webapp-snap1.img
7.2 从文件导入
bash
# 导入(会创建新镜像)
rbd import webapp.img images_pool/webapp-restore
7.3 管道方式跨集群导出导入
bash
# 同一集群内复制
rbd export images_pool/webapp - | rbd import - images_pool/webapp-copy
# 跨集群(通过 SSH)
rbd export images_pool/webapp - | ssh root@remote-cluster 'rbd import - images_pool/webapp-remote'
7.4 增量导出与导入
增量导出可以导出两个快照之间的变更,极大节省备份时间和空间。
bash
# 创建两个快照
rbd snap create images_pool/data@snap1
# ... 写入数据 ...
rbd snap create images_pool/data@snap2
# 导出 snap1 → snap2 之间的增量
rbd export-diff --from-snap snap1 images_pool/data@snap2 inc_snap1_snap2.data
# 导入增量(目标镜像必须已有 snap1)
rbd import-diff inc_snap1_snap2.data images_pool/data
典型备份流程:
- 每周全量备份:
rbd export - 每日增量备份:
rbd export-diff --from-snap prev_snap ...
8. RBD 缓存调优
RBD 客户端(librbd)使用本地内存缓存提高性能,相关参数可通过 ceph config set 修改。
| 参数 | 默认值 | 说明 |
|---|---|---|
rbd_cache |
true | 启用缓存 |
rbd_cache_policy |
writearound | 模式:writearound / writeback / writethrough |
rbd_cache_size |
33554432 (32M) | 每个镜像的缓存大小(字节) |
rbd_cache_max_dirty |
25165824 (24M) | 最大脏数据字节数 |
rbd_cache_target_dirty |
16777216 (16M) | 开始刷新的脏数据阈值 |
rbd_cache_max_dirty_age |
1 | 脏数据最大存活时间(秒) |
示例:临时开启 writeback 模式
bash
ceph config set client rbd_cache_policy writeback
注意:writeback 模式在客户端宕机时可能丢失数据,适合对性能要求高、可容忍部分数据丢失的场景。
9. RBD Mirror(跨集群异步复制)
RBD Mirror 可在两个 Ceph 集群之间异步复制 RBD 镜像,用于灾备。
9.1 概念
- 单向(active-passive):一个主集群(可读写),一个或多个备集群(只读)。
- 双向(active-active):两个集群同时可读写,互相复制(需应用层解决冲突)。
- 模式 :
- 基于日志(journal-based):每次写入先写日志,mirror 重放日志。性能开销大,但保证一致性。
- 基于快照(snapshot-based):定期快照并传输差异。适合 RPO 较高的场景。
9.2 单向池模式配置(prod→backup)
前提
- 两个集群(prod: ceph1~3,backup: ceph4~6)均已部署,且
HEALTH_OK。 - 两个集群中创建同名池
rbd并初始化。
bash
# 在两个集群都执行
ceph osd pool create rbd 32 32
rbd pool init rbd
步骤
1. 在主集群(prod)创建镜像并启用镜像功能
bash
# 创建镜像时需开启 journaling 和 exclusive-lock
rbd create image1 --size 1024 --pool rbd --image-feature=layering,exclusive-lock,journaling
# 在池上启用 mirror(池模式)
rbd mirror pool enable rbd pool
2. 在主集群生成 bootstrap token
bash
rbd mirror pool peer bootstrap create --site-name prod rbd > bootstrap_token_prod
# 将 token 复制到 backup 集群
rsync bootstrap_token_prod root@ceph4:
3. 在备集群部署 rbd-mirror 守护进程并导入 token
bash
# 部署 rbd-mirror(假设 placement 为 ceph4)
ceph orch apply rbd-mirror --placement=ceph4.whisky.cloud
# 导入 token(单向复制,方向 rx-only)
rbd mirror pool peer bootstrap import --site-name backup --direction rx-only rbd bootstrap_token_prod
4. 验证状态
bash
# 备集群查看
rbd mirror pool info rbd
rbd mirror pool status rbd
rbd info rbd/image1 # 应出现 mirroring state: enabled, mirroring primary: false
9.3 清理 Mirror 配置
bash
# 删除对端
rbd mirror pool peer remove rbd <peer_uuid>
# 禁用池 mirror
rbd mirror pool disable rbd
# 删除 rbd-mirror 服务
ceph orch rm rbd-mirror
10. 常用命令速查表
| 操作 | 命令 |
|---|---|
| 创建镜像 | rbd create <pool>/<img> --size <size> |
| 列出镜像 | rbd ls <pool> |
| 查看镜像信息 | rbd info <pool>/<img> |
| 扩容 | rbd resize <pool>/<img> --size <new> |
| 缩容 | rbd resize <pool>/<img> --size <new> --allow-shrink |
| 重命名 | rbd rename <pool>/<old> <pool>/<new> |
| 复制 | rbd cp <pool>/<src> <pool>/<dst> |
| 移入回收站 | rbd trash mv <pool>/<img> |
| 恢复回收站 | rbd trash restore -p <pool> <image_id> |
| 映射 | rbd map <pool>/<img> |
| 取消映射 | rbd unmap <pool>/<img> 或 rbd device unmap /dev/rbdX |
| 创建快照 | rbd snap create <pool>/<img>@<snap> |
| 回滚快照 | rbd snap rollback <pool>/<img>@<snap> |
| 保护快照 | rbd snap protect <pool>/<img>@<snap> |
| 克隆 | rbd clone <pool>/<img>@<snap> <pool>/<clone> |
| 扁平化 | rbd flatten <pool>/<clone> |
| 导出镜像 | rbd export <pool>/<img> <file> |
| 导入镜像 | rbd import <file> <pool>/<img> |
| 增量导出 | rbd export-diff --from-snap <snap> <pool>/<img> <file> |
| 增量导入 | rbd import-diff <file> <pool>/<img> |
| 启用池 mirror | rbd mirror pool enable <pool> pool |
| 生成 bootstrap token | rbd mirror pool peer bootstrap create --site-name <name> <pool> |
| 导入 token | rbd mirror pool peer bootstrap import --site-name <name> --direction rx-only <pool> <token-file> |
11. 本期小结
- RBD 是 Ceph 的块存储接口,适用于虚拟机磁盘、云平台等场景。
- 基本操作:创建、映射、挂载、扩容、快照、克隆。
- 高级特性:回收站、增量备份恢复、跨集群 Mirror 灾备。
- 性能调优:RBD 缓存模式(writeback/writethrough)可影响性能和数据安全。
- Mirror 配置分基于日志和基于快照两种,需提前规划网络和故障转移策略。
下一期预告:Ceph 对象存储(RADOS Gateway),包括 S3/Swift 兼容 API、用户管理、多站点同步和配额控制。