精读笔记(RHCA 英文教材)· CL260 Chapter 6 Providing Block Storage Using RADOS Block Devices
精读笔记(RHCA 英文教材)· CL260 Chapter 6 Providing Block Storage Using RADOS Block Devices
教材原文:RHCA 官方英文教材(PDF 第 203~248 页)(OCR 整书版已从本站移除,本页为章节精读) 关联知识:Ch4(pool/EC/object map)、Ch7(RBD 扩展运维);
00-RHCA教材精读-导航与学习法.md
Chapter Goal / Objectives(原文+译)
- GOAL: Provide block storage to Ceph clients using RBD(用 RADOS Block Device 提供块存储).
- OBJECTIVES: ① 用命令行创建/管理 RBD 映像;② 管理 RBD 快照与克隆;③ 导入/导出 RBD 映像(整盘与增量)。
- 结构:三个 Section + Guided Exercise + 章末 Lab(
lab grade block-review)。
6.1 Managing RADOS Block Devices(RBD 映像管理)
访问方式
- krbd(内核 RBD):Linux 主机用内核模块把 RBD 映像映射成本地块设备
/dev/rbd0,可 mkfs/mount 当普通盘用。 - librbd(用户态):给 KVM/QEMU 虚拟机、OpenStack(Cinder/Nova/Glance)用;OpenStack 可把 RBD 映像当实例启动盘。
- ⚠️ 同一块含普通单挂文件系统(如 XFS)的 RBD 盘,只允许一台客户端同时挂载;HA 场景做双机 standby 另说,多客户端同时挂会导致文件系统损坏/数据丢失。
rbd map/unmap需要 root。
建池与映像
ceph osd pool create rbd 32 32 # 映像专用池(自定 pg)
ceph osd pool application enable rbd rbd # 声明该池跑 rbd 应用
rbd pool init rbd # 初始化 RBD(建 rbd_directory/rbd_info/rbd_children 等元数据对象)
ceph config set osd rbd_default_pool rbd # 设默认池(缺省池名就叫 rbd)
rbd create rbd/test --size 10G [--object-size 4M] [--image-feature …] # 建 10G 映像
rbd info rbd/test # 详情:size/order/block_name_prefix/features/format
rbd ls rbd # 列映像
rbd resize rbd/test --size 20G # 扩容(缩容用 --size 缩小有风险)
rbd rm rbd/test # 删除(有快照时先 purge)- 映像内部:数据对象名 =
block_name_prefix(如rbd_data.867cba5c2d68)+.+ 12 位十六进制编号;每对象经 PG 条带化散到多 OSD。 - order / object size:order 是二进制左移值(
1<<order字节),合法 12~25(12=4KiB…25=32MiB);默认 22=4 MiB 对象;也可用--object-size 4K/4M(4KiB~32MiB)。 - image format:默认 2(format 1 已弃用、不支持克隆/镜像);布局参数
stripe_unit × stripe_count = object_size(默认均为 object_size / 1,可调条带化)。
映射、持久挂载与缓存
rbd map rbd/test # krbd 映射 → /dev/rbd0
rbd showmapped # 列出本机已映射(device/pool/image/snap)
rbd unmap /dev/rbd0 # 取消映射- 持久化(rbdmap 服务):编辑
/etc/ceph/rbdmap(每行:pool/image id=client.X,keyring=/etc/ceph/ceph.client.X.keyring)→ 服务在开机/关机时自动 map/unmap(配/etc/fstab挂载点):
systemctl enable --now rbdmap
cat /etc/ceph/rbdmap
# rbd/test id=client.rbduser,keyring=/etc/ceph/ceph.client.rbduser.keyring- 客户端机器必须能连集群:拷
ceph.conf+ 受限用户 keyring 到/etc/ceph/。 - 缓存参数(librbd 客户端,可用
ceph config set client rbd_cache …):rbd_cache(默认 true)、rbd_cache_size(32MiB)、rbd_cache_max_dirty(24MiB)、rbd_cache_target_dirty(16MiB)、rbd_cache_max_dirty_age、rbd_cache_writethrough_until_flush(true)。OpenStack 场景建议 Cinder/Nova/Glance 各建独立 Cephx 用户以定制不同缓存策略。
实验要点 · Guided Exercise(lab: rbd-block)
建 rbd 池(32 PG)+ application enable → rbd create rbd/test --size 10G → 拷 ceph.conf/keyring 到 clientb → rbd map → mkfs.xfs /dev/rbd0 → mount 写数据 → rbd showmapped/df 验证 → 配置 /etc/ceph/rbdmap + rbdmap map 验证持久映射 → finish。
6.2 Managing RBD Snapshots and Clones
快照(Snapshots)
- 快照=映像某一时刻的只读副本;创建时不占空间,随对象变化增长;支持增量快照。
- 写时复制(COW)在对象级发生:对带快照的映像写 1 字节,也会把受影响整对象原数据拷进快照区。
- ⚠️ 文件系统快照前必须
fsfreeze --freeze /mnt→ 快照 →fsfreeze --unfreeze,否则快照内文件系统损坏。
rbd snap create rbd/test@firstsnap
rbd snap ls rbd/test # SNAPID/NAME/SIZE/PROTECTED/TIMESTAMP
rbd snap rollback rbd/test@firstsnap # 映像回滚到快照(覆盖当前数据)
rbd snap rm rbd/test@secondsnap # 删单快照
rbd snap purge rbd/test # 删全部(有快照时 rbd rm 会被拒)- 只读挂载快照:
rbd map rbd/test@firstsnap→blockdev --getro /dev/rbdN验证只读 → 用后 unmap。
克隆(Clones)
- 克隆=以受保护(protected)快照为基的可读写子映像(瘦供给,COW 默认)。
- 三步:
snap create→snap protect(防删父快照)→rbd clone pool/image@snap pool/clone。 - COW 与 COR:
- COW(默认):写克隆前先把父数据拷进克隆再写;
- COR(copy-on-read,可选):
ceph config set global rbd_clone_copy_on_read true——首次读时把父对象拷入克隆;对父 OSD 延迟高时反而更慢;COR 关闭时克隆缺数据的读每次都要去父映像取。 - 两者都在对象级工作(读写 1 字节拷整对象)。
rbd flatten pool/clone:把父数据全部拷入克隆后切断父子引用,克隆变成独立映像(之后父快照可删)。- 管理命令:
rbd children pool/image@snap(列克隆)、rbd clone、rbd flatten、rbd snap unprotect。 - 删除映像一律走回收站:
rbd trash mv rbd/test→rbd trash rm rbd/test(允许把仍被克隆引用的活跃映像移入 trash 以后再删)。
实验要点 · Guided Exercise(lab: rbd-snapshot)
clienta mkfs.xfs /dev/rbd0 写文件 → fsfreeze 冻结 → rbd snap create …@firstsnap → unfreeze → clientb 把快照映射为只读、mount /mnt/snapshot 验证数据 → rbd clone …@firstsnap …clone1 → 挂克隆读写验证 COW → 删除/回滚流程 → finish。
6.3 Importing and Exporting RBD Images(导入导出)
- 用途:用真实数据量测试新版、QA、业务连续性演练、把备份与生产块设备解耦;支持整盘或两时点间增量。
rbd export rbd/test /tmp/test.dat # 导出(默认 --export-format 2)
rbd import [--export-format 1|2] [--object-size …] /tmp/test.dat rbd/test # 导入(可同时升格式)
# 增量:起点=创建时刻或指定快照;终点=当前映像或指定快照
rbd export-diff [--from-snap firstsnap] rbd/test@secondsnap /tmp/diff.dat
rbd import-diff /tmp/diff.dat rbd/test
# 管道流式复制('-'=stdout/stdin)与合并多段增量
rbd export rbd/img1 - | rbd import - bup/img1
rbd merge-diff first second merged # 只支持 stripe_count=1
rbd merge-diff first second - | rbd merge-diff - third merged # >2 段连续增量--export-format在 export/import 两侧必须一致;format 2 导入时可用--stripe-unit/--stripe-count/--object-size/--image-feature重建映像参数。- import-diff 校验:起点快照必须在目标映像存在;终点快照会在导入后同名创建。
- 增量段拼接要求:前一段终点快照 = 后一段起点快照。
实验要点 · Guided Exercise + Lab(lab: block-review)
主集群建 rbd 池(32PG)+enable → 建 rbd/test 写入数据 → rbd export rbd/test /mnt/export.dat 拷到第二集群 → 副集群 rbd import + 映射验证 → 主集群再写数据并 rbd export-diff --from-snap … 增量同步到副集群。Lab:建 rbd260 池(32 PG)+enable → mkfs.xfs /dev/rbd0 → 把本机 /root/prod260.xfs(128M) 用 rbd import 导入为 rbd/img260 → 映射挂载验证 → 配 rbdmap 服务并重启 clienta 验证持久挂载 → lab grade block-review。
命令速查表(本章)
| 命令 | 作用 | | rbd create POOL/IMG --size N [--object-size] | 建映像 | | rbd info/ls/resize/rm POOL/IMG | 查详情/列/改大小/删 | | rbd map / unmap / showmapped | krbd 映射/取消/列出 | | systemctl enable --now rbdmap + /etc/ceph/rbdmap | 持久映射 | | fsfreeze --freeze|--unfreeze /mnt | 快照前冻结/解冻文件系统 | | rbd snap create/ls/rollback/rm/purge | 快照管理 | | rbd snap protect / unprotect | 保护/解除快照(克隆前提) | | rbd clone PARENT@snap CHILD | 建克隆 | | rbd flatten CHILD | 展平克隆(脱离父快照) | | rbd children PARENT@snap | 列某快照的克隆 | | rbd trash mv/rm/ls | 回收站管理 | | rbd export/import [--export-format 1|2] | 整盘导入导出 | | rbd export-diff / import-diff [--from-snap] | 增量备份/恢复 | | rbd merge-diff A B OUT | 合并两段增量(stripe_count=1) |
词汇表(本章)
| 英文术语 | 中文 | 一句话速记 |
|---|---|---|
| RBD | RADOS 块设备 | 集群里的虚拟块盘(rbd 池存映像) |
| krbd | 内核 RBD 客户端 | 内核模块映射 /dev/rbdN |
| librbd | 用户态 RBD 库 | QEMU/OpenStack 走 librbd |
| image order | 对象尺寸指数 | 1<<order,默认 22=4MiB |
| stripe_unit/count | 条带单元/数 | 相乘=object_size;>1 提升大块吞吐 |
| format 1/2 | 映像格式 | 2 才支持克隆/镜像/快照高级特性 |
| block_name_prefix | 对象名前缀 | rbd_data.<id> 后接 12 位十六进制序号 |
| rbdmap service | 持久映射服务 | 开机 map、关机 unmap(读 /etc/ceph/rbdmap) |
| snapshot | 快照 | 只读时间点副本,COW、增量式、可回滚 |
| fsfreeze | 冻结文件系统 | 快照前必须冻结否则损坏 |
| protect | 保护快照 | 防删(克隆依赖它) |
| clone | 克隆 | 基于保护快照的 COW 可写子映像 |
| COW / COR | 写时复制/读时复制 | 克隆与父快照的数据策略(对象级) |
| flatten | 展平 | 拷全父数据、断开父子链 |
| trash | 回收站 | rbd trash mv/rm 删除映像的唯一正道 |
| export-diff | 增量导出 | 两时点间变更(可 --from-snap) |
| merge-diff | 增量合并 | 合并连续 diff(stripe_count=1 限制) |
自测
- krbd 与 librbd 的使用场景差异;为何 XFS 盘禁止两客户端同时挂?
- 建 RBD 池的三件套命令?rbd pool init 建了哪些元数据对象?
- order=22 对应多大对象?对象名结构(prefix.编号)?stripe 三参数等式?
- rbdmap 持久化的三要素(rbdmap 文件、fstab、systemd)?客户端要拷哪两个文件?
- 快照为什么创建时几乎不占空间?对象级 COW 意味着什么(写 1 字节会发生什么)?
- 为什么文件系统快照前必须 fsfreeze?rollback 与 mount 快照读旧数据的区别?
- 克隆为什么必须先 protect 快照?flatten 前后克隆与父快照的关系变化?
- COW 与 COR 的触发时机与代价?什么情况下开 COR 反而变慢?
- rbd rm 被拒(有快照)怎么办?删除在用映像的正确姿势(trash mv)?
- 写出“以 firstsnap 为起点、导 secondsnap 到文件再导入对端集群”的命令对;merge-diff 的限制是什么?
