注意

本文档适用于 Ceph 开发版本。

快照

快照是一个特定时间点(检查点)上图像的只读逻辑副本。Ceph 块设备的高级功能之一是您可以对图像创建快照以保留时间点状态历史记录。Ceph 还支持快照层叠,这允许您快速轻松地克隆图像(例如,虚拟机图像)。Ceph 块设备快照使用 `rbd` 命令和几个高级接口进行管理,rbd命令QEMU, libvirt, OpenStack, OpenNebulaCloudStack.

重要

要使用 RBD 快照,您必须有一个正在运行的 Ceph 集群。

Note

由于 RBD 不知道图像(卷)内的任何文件系统,因此除非在挂载(附加)的操作系统内进行协调,否则快照仅仅是碰撞一致性的。因此,我们建议您在创建快照之前暂停或停止 I/O。

如果卷包含文件系统,则在创建快照之前,文件系统应处于内部一致状态。未使用写静默创建的快照可能需要在重新挂载之前执行一次fsck操作。要使 I/O 静默,您可以使用fsfreeze命令。有关详细信息,请参阅fsfreeze(8)手册页。

对于虚拟机,qemu-guest-agent可以在创建快照时自动冻结文件系统。

Cephx 注意事项

cephx如果启用了身份验证(默认情况下已启用),则必须指定用户名或 ID 以及包含相应密钥的密钥环的路径。请参阅User Management for details.

rbd --id {user-ID} --keyring /path/to/secret [commands]
rbd --name {username} --keyring /path/to/secret [commands]

例如:

rbd --id admin --keyring /etc/ceph/ceph.keyring [commands]
rbd --name client.admin --keyring /etc/ceph/ceph.keyring [commands]

提示

将用户和密钥添加到CEPH_ARGS环境变量以避免重新输入这些参数。

快照基础

以下步骤演示了如何使用rbd command.

创建快照

要创建快照,请使用rbd snap create命令并指定池名称、图像名称和快照名称:

rbd snap create {pool-name}/{image-name}@{snap-name}

例如:

rbd snap create rbd/foo@snapname

列出快照

要列出图像的快照,请使用rbd snap ls命令并指定池名称和图像名称:

rbd snap ls {pool-name}/{image-name}

例如:

rbd snap ls rbd/foo

回滚快照

要回滚到快照,请使用rbd snap rollback命令并指定池名称、图像名称和快照名称:

rbd snap rollback {pool-name}/{image-name}@{snap-name}

例如:

rbd snap rollback rbd/foo@snapname

Note

将图像回滚到快照意味着用快照中的数据覆盖图像的当前版本。执行回滚所需的时间随着图像的大小而增加。与回滚图像到快照相比,从快照克隆更快。从快照克隆是恢复到现有状态的首选方法。than to roll back an image to a snapshot. Cloning from a snapshot is the preferred method of returning to a pre-existing state.

删除快照

要删除快照,请使用rbd snap rm命令并指定池名称、图像名称和快照名称:

rbd snap rm {pool-name}/{image-name}@{snap-name}

例如:

rbd snap rm rbd/foo@snapname

Note

Ceph OSDs 异步删除数据,因此删除快照不会立即释放底层 OSD 的容量。此过程称为“快照修剪”,在ceph status输出中看到相同的密钥。

清理快照

要删除所有快照,请使用rbd snap purge命令并指定池名称和图像名称:

rbd snap purge {pool-name}/{image-name}

例如:

rbd snap purge rbd/foo

层叠

Ceph 支持创建块设备快照的许多写时复制 (COW) 克隆。快照层叠使 Ceph 块设备客户端能够非常快速地创建图像。例如,您可以创建一个写入 Linux 虚拟机的块设备图像,对图像进行快照,保护快照,并根据需要创建任意数量的写时复制克隆。快照是只读的,因此克隆快照简化了语义,使得可以快速创建克隆。

Note

“父”和“子”术语指的是 Ceph 块设备快照(父)和从快照克隆的相应图像(子)。这些术语对于以下命令行用法很重要。

每个克隆的图像(子)都存储对其父图像的引用,这使克隆的图像能够打开父快照并读取它。

快照的写时复制克隆与任何其他 Ceph 块设备图像完全相同。您可以读取、写入、克隆和调整大小克隆的图像。克隆的图像没有特殊限制。但是,快照的写时复制克隆依赖于快照,因此您必须在克隆之前保护快照。下图描绘了此过程。

Note

Ceph 仅支持克隆“RBD 格式 2”图像(即,未指定--image-format 1的图像)。Linux 内核客户端从 3.10 版本开始支持克隆的图像。

快照层叠入门

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

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

  1. 图像模板:块设备层叠的常见用例是创建一个基础图像和一个用作克隆模板的快照。例如:用户可以创建一个用于 Linux 发行版的图像(例如,Ubuntu 22.04)并对其创建快照。用户可以偶尔更新图像并创建新的快照(使用诸如sudo apt-get update, sudo apt-get upgradesudo apt-get dist-upgraderbd snap create等命令)。随着图像的成熟,用户可以克隆其中的任何一个快照。

  2. 扩展模板:更高级的用例包括扩展模板图像以提供比基础图像更多信息。例如,用户可以克隆一个图像(例如,虚拟机模板)并安装其他软件(例如,数据库、内容管理系统、分析系统),然后对扩展的图像进行快照,该快照本身可能与基础图像一样进行更新。

  3. 模板池:使用块设备层叠的一种方法是为包含(1)作为模板的基础图像和(2)这些模板的快照的池创建一个池。然后,您可以扩展只读权限以使用户能够克隆快照,即使他们没有允许他们在池内写入或执行的权限。

  4. 图像迁移/恢复:使用块设备层叠的一种方法是从一个池迁移或恢复数据到另一个池。

保护快照

克隆会访问父快照。如果用户意外删除了父快照,所有克隆都会失效。为了防止数据丢失,您必须在克隆之前保护快照:

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

例如:

rbd snap protect rbd/foo@snapname

Note

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

克隆快照

要克隆快照,请指定父池、父图像和父快照;以及子池和图像名称。您必须在克隆之前保护快照:

rbd clone {pool-name}/{parent-image-name}@{snap-name} {pool-name}/{child-image-name}

例如:

rbd clone rbd/foo@snapname rbd/bar

Note

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

取消保护快照

在删除快照之前,您必须首先取消保护它。此外,您可以不好的主意。删除来自克隆的引用的快照。您必须在取消保护快照之前扁平化或删除快照的每个克隆:

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

例如:

rbd snap unprotect rbd/foo@snapname

列出快照的子项

要列出快照的子项,请使用rbd children命令并指定池名称、图像名称和快照名称:

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

例如:

rbd children rbd/foo@snapname

扁平化克隆图像

克隆的图像保留对父快照的引用。当您从克隆中删除对父快照的引用时,您实际上是通过将快照中存储的数据复制到克隆来“扁平化”克隆。扁平化克隆所需的时间随着快照的大小而增加。要删除快照,您必须首先扁平化子图像(或删除它们):

rbd flatten {pool-name}/{image-name}

例如:

rbd flatten rbd/bar

Note

由于扁平化图像包含快照中存储的所有数据,因此扁平化图像比层叠克隆占用更多的存储空间。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.