【Ceph RADOS】RBD:image 到对象的映射、krbd 与 librbd、快照与克隆边界

💡 原文中文,约10600字,阅读约需26分钟。
📝

内容提要

RBD将块设备映射为RADOS对象,默认4MiB大小,通过偏移计算对象序号。krbd走内核路径,librbd走用户态,均依赖Exclusive Lock保证写互斥。快照采用COW机制,首次覆盖写触发复制;克隆形成父子链,flatten需复制共享数据。Object map可跳过空读,但增加写开销。

🔎

延伸解读

对象映射的排障要点

RBD 数据对象命名由 block_name_prefix 和 16 位十六进制对象序号组成,序号从 0 开始。偏移换算公式为 obj_seq = floor(off / S),S 为对象大小(默认 4MiB)。排障时务必以 rbd info 输出的 block_name_prefix 为准,手工拼写或漏补零会导致静默空洞,而非明确报错。

krbd 与 librbd 的适用边界

krbd 适合需要 /dev/ 块设备接口且依赖 OS page cache 的场景,但受内核支持的特性限制;librbd 适合 QEMU 等用户态应用,支持深度队列和写回缓存。两者都依赖 Exclusive Lock 保证写互斥,多客户端写需接受协作转移语义,或显式 --exclusive 独占。

快照与克隆的代价模型

快照采用 COW,首次覆盖写触发复制,增加尾延迟;克隆形成父子链,读路径沿 parent 指针向上查找,每层增加一次往返。flatten 需复制共享数据,耗时随父快照可见数据量增加,期间占带宽。生产上建议模板池只读 snap + 实例 clone,迁移前强制 flatten。

特性依赖与兼容性

RBD 特性存在依赖关系:exclusive-lock 依赖 layering,object-map 和 fast-diff 依赖 exclusive-lock,journaling 依赖 exclusive-lock。较旧内核 krbd 可能不支持部分特性,需用 rbd feature disable 降级。新建 image 默认特性集可通过 rbd_default_features 调节。

Q&A

RBD image 中的对象大小默认是多少?如何计算一个偏移对应的对象序号和对象内偏移?

RBD image 的默认对象大小是 4MiB(由 order=22 决定,即 2^22 字节)。给定写入偏移 off 和对象大小 S,对象序号 obj_seq = floor(off / S),对象内偏移 obj_off = off mod S。

krbd 和 librbd 在实现路径上有什么区别?

krbd 是 Linux 内核驱动(drivers/block/rbd.c),通过 libceph 与 OSD 通信,提供 /dev/rbdN 块设备接口,依赖内核块层和页缓存。librbd 是用户态库,直接调用 librados API,不经过内核块层,常用于 QEMU 等虚拟化场景,支持更灵活的缓存和并发控制。

RBD 的 Exclusive Lock 有什么作用?它如何保证多客户端写互斥?

Exclusive Lock 是 RBD 层的客户端互斥机制,保证同一时刻只有一个客户端写 image,从而保护 object-map、journal 等内部结构。默认采用协作转移模式:写方先抢锁,若锁被其他客户端持有,则请求对方停写并释放锁。非优雅退出时,新写方需与 Monitor 协商将旧客户端 blocklist 后才能破锁。

RBD 快照的 COW 机制是如何触发的?

RBD 快照创建时几乎不复制数据,只记录元数据。真正的复制发生在快照创建后第一次覆盖写某个对象时,由 OSD 的 PrimaryLogPG 在写路径上执行 copy-on-write:先保留快照可见的旧数据,再写入新数据。同一对象后续的写不再触发 COW。

RBD 克隆的父子链是如何工作的?flatten 操作有什么代价?

克隆创建的子 image 初始没有自己的数据对象,读取时若子 image 无对象,则沿 parent 指针从父快照读取。写入时触发 COW,将父对象复制到子 image。多级克隆形成链,读路径每层增加一次往返。flatten 操作将共享数据全部复制到子 image,切断 parent 引用,耗时随父快照可见数据量增加,期间占用带宽,但子 image 仍可读写。

RBD 的 object map 特性有什么优缺点?

object map 是一个位图,标记哪些数据对象已存在。优点:读取时若对象标记为不存在,可直接返回全零,避免发送 RADOS 读请求,减少读放大。缺点:每次首次写入新对象时需额外更新位图(一次 RADOS OMAP 操作),增加写开销,尤其对随机小写有影响。

RBD 的 features 标志之间有哪些依赖关系?

常见依赖:exclusive-lock 依赖 layering;object-map 和 fast-diff 依赖 exclusive-lock;journaling 依赖 exclusive-lock。较旧内核可能不支持部分 features,需用 rbd feature disable 降级。

🏷️

标签

➡️

继续阅读