3.5. Ceph 客户端对象映射

对象映射是在客户端写入到 rbd 镜像时跟踪支持的 RADOS 对象存在的功能。发生写入时,该写入将转换为后备 RADOS 对象内的偏移值。启用对象映射功能后,会跟踪这些 RADOS 对象是否存在。因此,我们可以知道对象是否确实存在。对象映射在 librbd 客户端上保留在内存中,这样可以避免查询它知道不存在的对象的 OSD。换句话说,对象映射是实际存在的对象的索引。

对象映射对某些操作很有用,viz:

  • 调整大小
  • Export
  • Copy
  • Flatten
  • 删除

缩小大小操作就像是删除尾随对象所被删除的部分一样。

导出操作知道要从 RADOS 请求哪些对象。

复制操作知道哪些对象存在并需要复制。它不一定要迭代可能存在数百个和数千个可能的对象。

flatten 操作为所有父对象执行备份到克隆,以便克隆可以从父脱离,例如子克隆中到父快照的指代可以被删除。因此,只有存在的对象才能进行复制,而不是所有潜在的对象。

删除操作只删除镜像中存在的对象。

读取操作会跳过它所知的对象的读取操作。

因此,为了像调整大小、缩减、导出、复制、扁平化和删除等操作,这些操作需要针对所有可能影响的 RADOS 对象发出操作,无论它们是否存在。启用对象映射时,如果对象不存在,则不需要发出操作。

例如,如果我们有一个 1 TB 稀疏 RBD 镜像,它可以有数百个和数千个支持的 RADOS 对象。当删除操作没有启用对象映射时,则需要为镜像中的每个潜在对象发出一个 remove object 操作。但是,如果启用了对象映射,只需要为存在的对象发出删除对象操作。

对象映射对于没有实际对象但从父对象获取对象的克隆而言非常宝贵。当克隆的镜像存在时,克隆最初没有对象,所有读取都会被重定向到父镜像。因此,对象映射可以在没有对象映射的情况下提高读取操作,首先需要将读取操作向 OSD 发出克隆,当失败时,它会向父项发出另一个读取并启用了对象映射。它跳过它知道的对象的读取并不存在。

默认情况下不启用对象映射。在创建镜像时,您必须使用 --image-features 参数显式启用它。另外,Mandatory Exclusive Locks对象映射的先决条件。如果没有启用专用锁定支持,无法启用对象映射支持。要在创建镜像时启用对象映射支持,请执行:

[root@mon ~]# rbd -p mypool create myimage --size 102400 --image-features 13

此处,13148 的总和,其中 1 个启用分层支持,4 个启用了 exclusive locking 支持,8 个启用对象映射支持。因此,上述命令将创建一个 100 GB rbd 镜像,启用分层、专用锁定和对象映射。