3.3. 分层


Ceph 支持创建许多块设备快照的写时复制 (COW) 或读时复制 (COR) 克隆。快照分层使得 Ceph 块设备客户端能够非常快速地创建镜像。例如,您可以使用写入它的 Linux 虚拟机创建块设备镜像;然后,快照,保护快照,并创建尽可能多的克隆。快照是只读的,因此克隆快照可以简化语义-使快速创建克隆成为可能。

diag 967b328072067089c89ce979bb26daff
注意

术语 parentchild 表示 Ceph 块设备快照(父),以及从快照克隆的对应镜像(子级)。这些术语对于以下命令行用法非常重要。

每个克隆的镜像(子级)存储对其父镜像的引用,这使得克隆的镜像能够打开父快照并读取它。当克隆扁平化时,当快照中的信息完全复制到克隆时,会删除此引用。有关 扁平化 的详情,请参考 第 3.3.6 节 “扁平化克隆的镜像”

快照克隆的行为与任何其他 Ceph 块设备镜像完全相同。您可以读取、写入、克隆和调整克隆的镜像大小。克隆的镜像没有特殊限制。但是,快照的克隆会指向快照,因此在克隆快照前,必须会对其进行保护。

快照的克隆可以是写时复制 (COW) 或读时复制 (COR) 克隆。在必须显式启用读取时复制 (COR) 时,始终为克隆启用写时复制 (COW)。当数据写入到克隆中的未分配对象时,写时复制 (COW) 将数据从父项复制到克隆。当父进程从克隆中未分配的对象读取时,从父进程复制数据到克隆。如果克隆中尚不存在对象,则仅从父项读取数据。RADOS 块设备将大型镜像分成多个对象(默认为 4 MB),所有写时复制(COW)和写时复制(COR)操作发生在完整对象(即向克隆写入 1 字节)操作,如果之前的 COW/COR 操作中不存在目标对象,则会导致从父对象读取 4 MB 对象并写入克隆。

是否启用读取时复制 (COR),任何通过从克隆读取底层对象无法满足的读取都将重新路由到父对象。由于父数量实际上没有限制(这意味着您可以克隆克隆),因此这个重新路由将继续,直到找到对象或您到达基础父镜像。如果启用了读取时复制 (COR),克隆中任何未直接满足的读取会导致从父项读取完整的对象并将该数据写入克隆,以便克隆本身可以满足相同的扩展读取,而无需从父级读取。

这基本上是一个按需、按对象扁平化的操作。当克隆位于来自它的父级(在另一个地理位置的不同池中)的高延迟连接中时,这特别有用。读时复制 (COR) 可降低读分化延迟。前几个读取具有高延迟,因为它将导致从父项读取额外的数据(例如,您从克隆中读取 1 字节,但现在 4 MB 需要从父项读取并写入克隆),但将来的所有读取都将从克隆本身提供。

要从快照创建写时复制(COR)克隆,您必须通过在 ceph.conf 文件的 [global][client] 部分下添加 rbd_clone_copy_on_read = true 来显式启用此功能。

3.3.1. 分层入门

Ceph 块设备分层是一个简单的过程。您必须有一个镜像。您必须创建镜像的快照。您必须保护快照。执行这些步骤后,您可以开始克隆快照。

diag ac00bea462a56481a9db915ac61f1523

克隆的镜像具有对父快照的引用,并包含池 ID、镜像 ID 和快照 ID。包含池 ID 意味着您可以将快照从一个池克隆到另一个池中的镜像。

  1. 镜像模板: 块设备分层的常见用例是创建一个 master 镜像和作为克隆的模板的快照。例如,用户可以为 RHEL7 发行版创建镜像,并为其创建快照。用户可以定期更新镜像并创建新快照(如 yum updateyum upgrade,后跟 rbd snap create)。随着镜像竞争,用户可以克隆任何一个快照。
  2. 扩展模板: 更高级的用例包括扩展模板镜像,其提供比基础镜像更多的信息。例如,用户可以克隆镜像(如虚拟机模板),并安装其他软件(如数据库、内容管理系统、分析系统等),然后对扩展的镜像进行快照,就像基础镜像一样更新。
  3. 模板池: 一种使用块设备分层的方法是创建一个池,其中包含用作模板的主镜像,以及这些模板的快照。然后,您可以为用户扩展只读权限,以便他们可以克隆快照,而无需在池中写入或执行。
  4. 镜像迁移/恢复: 一种使用块设备分层的方法是将数据从一个池中迁移或恢复到另一个池中。

3.3.2. 保护快照

克隆访问父快照。如果用户意外删除父快照,则所有克隆都会中断。为防止数据丢失,您必须在 克隆快照 前保护快照。要做到这一点,请运行以下命令:

[root@rbd-client ~]# rbd --pool {pool-name} snap protect --image {image-name} --snap {snapshot-name}
[root@rbd-client ~]# rbd snap protect {pool-name}/{image-name}@{snapshot-name}

例如:

[root@rbd-client ~]# rbd --pool rbd snap protect --image my-image --snap my-snapshot
[root@rbd-client ~]# rbd snap protect rbd/my-image@my-snapshot
注意

您无法删除受保护的快照。

3.3.3. 克隆快照

要克隆快照,您需要指定父池、镜像和快照;以及子池和镜像名称。您必须保护快照,然后才能克隆快照。要做到这一点,请运行以下命令:

[root@rbd-client ~]# rbd --pool {pool-name} --image {parent-image} --snap {snap-name} --dest-pool {pool-name} --dest {child-image}

[root@rbd-client ~]# rbd clone {pool-name}/{parent-image}@{snap-name}  {pool-name}/{child-image-name}

例如:

[root@rbd-client ~]# rbd clone rbd/my-image@my-snapshot rbd/new-image
注意

您可以将一个池的快照克隆到另一个池中的镜像。例如,您可以将只读镜像和快照维护为一个池中的模板,并在另一个池中维护可写克隆。

3.3.4. 取消保护快照

您必须先取消保护快照,然后才能删除快照。此外,您不得删除从克隆引用的快照。您必须扁平化快照的每个克隆,然后才能删除快照。要做到这一点,请运行以下命令:

[root@rbd-client ~]#rbd --pool {pool-name} snap unprotect --image {image-name} --snap {snapshot-name}

[root@rbd-client ~]# rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}

例如:

[root@rbd-client ~]# rbd --pool rbd snap unprotect --image my-image --snap my-snapshot

[root@rbd-client ~]# rbd snap unprotect rbd/my-image@my-snapshot

3.3.5. 列出快照的 Children

要列出快照的子项,请执行以下操作:

rbd --pool {pool-name} children --image {image-name} --snap {snap-name}
rbd children {pool-name}/{image-name}@{snapshot-name}

例如:

rbd --pool rbd children --image my-image --snap my-snapshot
rbd children rbd/my-image@my-snapshot

3.3.6. 扁平化克隆的镜像

克隆的镜像保留对父快照的引用。当您从子克隆中删除引用到父快照时,您有效地通过将信息从快照复制到克隆来"扁平化"镜像。克隆所需的时间随着快照的大小而增加。

要删除与子镜像关联的父镜像快照,您必须首先扁平化子镜像:

[root@rbd-client ~]# rbd --pool <pool-name> flatten --image <image-name>
[root@rbd-client ~]# rbd flatten <pool-name>/<image-name>

例如:

[root@rbd-client ~]# rbd --pool rbd flatten --image my-image
[root@rbd-client ~]# rbd flatten rbd/my-image

由于扁平化的镜像包含快照的所有信息,因此扁平化的镜像将占用比分层克隆更多的存储空间。

注意

如果镜像上启用 深度扁平化(deep flatten)功能,则默认情况下镜像克隆与其父级解除关联。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.