3.5. Ceph 客户端对象映射
对象映射是一项在客户端写入 rbd 镜像时跟踪后备 RADOS 对象是否存在的功能。发生写入时,这种写入将转换为后备 RADOS 对象内的偏移。启用对象映射功能后,会跟踪这些 RADOS 对象的存在。因此,我们可以知道对象是否存在。对象映射保存在 librbd 客户端上的内存中,这样它可以避免在 OSD 中查询它所知道不存在的对象。换句话说,对象映射是实际存在的对象的索引。
对象映射对于某些操作很有用,viz:
- 调整大小
- export
- Copy
- flatten
- 删除
- 读
缩小调整大小的操作就像删除尾随对象的部分删除一样。
导出操作知道要从 RADOS 请求哪些对象。
复制操作知道存在哪些对象,需要复制。它不必迭代潜在的数百个可能的对象。
flatten 操作为所有父对象执行复制操作到克隆,以便克隆可以与父级分离,即,可以删除从子克隆到父快照的引用。因此,仅针对存在的对象执行复制,而不是所有潜在的对象。
删除操作仅删除镜像中存在的对象。
读取操作会跳过它已知不存在的对象的读取。
因此,对于调整大小、仅缩小、导出、复制、扁平和删除等操作,这些操作将需要对所有潜在受影响的 RADOS 对象发出操作,无论它们是否存在。启用对象映射后,如果对象不存在,则不需要发布该操作。
例如,如果有一个 1 TB 稀疏 RBD 镜像,它可以有数百个和数千个后备 RADOS 对象。如果没有启用对象映射的删除操作,则需要对镜像中的每个潜在对象发出 remove object
操作。但是,如果启用了对象映射,它只需要为存在的对象发出 remove object
操作。
对象映射对没有实际对象但从父对象获取对象的克隆而言具有价值。存在克隆的映像时,克隆最初没有对象,并且所有读取都将重定向到父映像。因此,对象映射可以像没有对象映射一样提高读取,首先需要为克隆向 OSD 发出读取操作;出现故障时,它会向父级发出另一个读取 - 启用对象映射。它跳过了它不知道不存在的对象的读取。
默认情况下不启用对象映射。在创建镜像时,您必须使用 --image-features
参数显式启用它。另外,Mandatory Exclusive Locks
是 object map
的先决条件。如果没有启用专用锁定支持,则无法启用对象映射支持。要在创建镜像时启用对象映射支持,请执行:
[root@mon ~]# rbd -p mypool create myimage --size 102400 --image-features 13
在这里,数字 13
是 1
、4
和 8
的总结,其中 1
启用分层支持,4
支持专用锁定支持,8
支持对象映射支持。因此,上述命令将创建一个 100 GB rbd 镜像,启用分层、专用锁定和对象映射。