跳转到: 导航, 搜索

LocalStorageVolume

Warning.svg 旧设计页面

此页面曾用于帮助设计 OpenStack 的先前版本中的一项功能。该功能可能已经或尚未实现。因此,此页面可能不会更新,并且可能包含过时的信息。上次更新时间为 2014-11-02


术语表

Qcow2: QCOW2 镜像格式是 QEMU 处理器模拟器支持的磁盘镜像格式之一。

增量快照: 这些快照是增量备份,意味着自上次快照以来设备上更改的块才会被保存。

指针表: 表中的指针指向一个数据块。指针表用于增量快照的实现。

总结

此蓝图的目标是为 cinder 实现一个插件。这将允许在本地存储中创建卷,并将数据的某个时间点的快照备份到 Swift 以进行持久恢复。这些快照是增量备份,这意味着自上次快照以来卷上更改的块才会被保存。

即使快照是增量保存的,当您删除快照时,只有其他快照不需要的数据才会被删除。因此,无论删除了哪些先前的快照,所有活动快照都将包含恢复卷所需的所有信息。此外,恢复卷的时间与所有快照相同,既能提供完整备份的恢复时间,又能节省增量备份的空间。

总而言之,我们的解决方案是本地存储 + qcow2 镜像 + 依赖快照 + swift。这类似于 cloudstack:local storage for data volumes,但我们拥有比 cloundstack 更增量的快照。

插件的名称是 island

原理

  • 本地磁盘 I/O 的高速和低延迟
  • 某个时间点的快照
  • 增量快照
  • 使用廉价本地磁盘降低成本
  • 本地存储中的 raid 10 具有更好的可靠性。
  • 用户在 A 区域创建快照,可以在 B 区域从快照创建卷。
  • 卷的 qcow2 镜像只有在卷附加时才会真正创建。

用例

用例 1:创建卷

  1. cinder-api 创建一个新的卷数据库条目;
  2. island 什么也不做。

注意: 它在卷附加时创建卷的 qcow2 镜像。

用例 2:从快照创建卷

  1. cinder-api 创建一个新的卷数据库条目并设置 volume['snapshot_id'];
  2. island 什么也不做。

用例 3:删除卷

  1. island 检查卷的快照状态。
  2. cinder-api 销毁卷数据库条目。

用例 4:创建快照

  1. island 使用 qemu 监控命令在镜像中创建快照;
  2. island 将增量快照上传到 swift;
  3. island 删除镜像中的旧快照。

注意: 快照可以在卷状态为附加时创建。当卷分离时,卷中没有更改,因此不需要创建快照。

用例 5:删除快照

  1. island 删除 swift 中的快照。

用例 6:附加卷

  1. island 创建卷的 qcow2 镜像。
  2. 如果卷是新卷,则转到 (5);
  3. 如果卷是从快照创建的新卷,则下载快照并将其写入 qcow2 镜像,转到 (5);
  4. 如果卷是旧卷,则下载最新的快照并将其写入 qcow2 镜像;
  5. 将 volume['host'] 更新为实例旁边的新的主机。卷已附加到实例。

用例 7:分离卷

  1. island 创建一个新的快照数据库条目,将 snapshot['volume_id'] 设置为卷。
  2. island 使用 qemu 监控命令在镜像中创建快照;
  3. island 将增量快照上传到 swift;
  4. island 删除卷的 qcow2 镜像;

需求

R1. 支持 qcow2 镜像。

R2. 修改 qemu-kvm,添加两个新的监控命令以支持在卷附加时创建某个时间点的快照。

R3. 安装 swift,将 qcow2 镜像中的快照上传到 swift。

R4. 修改 attach_volume API,添加 host 参数。

设计思路

Qcow2 镜像格式可以将所有增量快照存储在一个镜像中。其实现细节在 The QCOW2 Image Format 中。我们复制 设计思路 并使用 该思路 将卷的所有增量快照存储在 swift 中。所有活动快照都将包含恢复卷所需的所有信息。

我们的设计如下所示。

03-ebs snapshot2.gif

先决条件

开发资源

正在进行的工作

讨论