LocalStorageVolume
| |
旧设计页面
此页面曾用于帮助设计 OpenStack 的先前版本中的一项功能。该功能可能已经或尚未实现。因此,此页面可能不会更新,并且可能包含过时的信息。上次更新时间为 2014-11-02 |
- Launchpad Cinder 蓝图: local-storage-volume
- 创建: 2012 年 9 月 19 日
- 上次更新: 2012 年 10 月 9 日
- 起草人: Rongze Zhu Hui Cheng
- 贡献者: Rongze Zhu Hui Cheng
目录
术语表
Qcow2: QCOW2 镜像格式是 QEMU 处理器模拟器支持的磁盘镜像格式之一。
增量快照: 这些快照是增量备份,意味着自上次快照以来设备上更改的块才会被保存。
指针表: 表中的指针指向一个数据块。指针表用于增量快照的实现。
总结
此蓝图的目标是为 cinder 实现一个插件。这将允许在本地存储中创建卷,并将数据的某个时间点的快照备份到 Swift 以进行持久恢复。这些快照是增量备份,这意味着自上次快照以来卷上更改的块才会被保存。
即使快照是增量保存的,当您删除快照时,只有其他快照不需要的数据才会被删除。因此,无论删除了哪些先前的快照,所有活动快照都将包含恢复卷所需的所有信息。此外,恢复卷的时间与所有快照相同,既能提供完整备份的恢复时间,又能节省增量备份的空间。
总而言之,我们的解决方案是本地存储 + qcow2 镜像 + 依赖快照 + swift。这类似于 cloudstack:local storage for data volumes,但我们拥有比 cloundstack 更增量的快照。
插件的名称是 island。
原理
- 本地磁盘 I/O 的高速和低延迟
- 某个时间点的快照
- 增量快照
- 使用廉价本地磁盘降低成本
- 本地存储中的 raid 10 具有更好的可靠性。
- 用户在 A 区域创建快照,可以在 B 区域从快照创建卷。
- 卷的 qcow2 镜像只有在卷附加时才会真正创建。
用例
用例 1:创建卷
- cinder-api 创建一个新的卷数据库条目;
- island 什么也不做。
注意: 它在卷附加时创建卷的 qcow2 镜像。
用例 2:从快照创建卷
- cinder-api 创建一个新的卷数据库条目并设置 volume['snapshot_id'];
- island 什么也不做。
用例 3:删除卷
- island 检查卷的快照状态。
- cinder-api 销毁卷数据库条目。
用例 4:创建快照
- island 使用 qemu 监控命令在镜像中创建快照;
- island 将增量快照上传到 swift;
- island 删除镜像中的旧快照。
注意: 快照可以在卷状态为附加时创建。当卷分离时,卷中没有更改,因此不需要创建快照。
用例 5:删除快照
- island 删除 swift 中的快照。
用例 6:附加卷
- island 创建卷的 qcow2 镜像。
- 如果卷是新卷,则转到 (5);
- 如果卷是从快照创建的新卷,则下载快照并将其写入 qcow2 镜像,转到 (5);
- 如果卷是旧卷,则下载最新的快照并将其写入 qcow2 镜像;
- 将 volume['host'] 更新为实例旁边的新的主机。卷已附加到实例。
用例 7:分离卷
- island 创建一个新的快照数据库条目,将 snapshot['volume_id'] 设置为卷。
- island 使用 qemu 监控命令在镜像中创建快照;
- island 将增量快照上传到 swift;
- island 删除卷的 qcow2 镜像;
需求
R1. 支持 qcow2 镜像。
R2. 修改 qemu-kvm,添加两个新的监控命令以支持在卷附加时创建某个时间点的快照。
R3. 安装 swift,将 qcow2 镜像中的快照上传到 swift。
R4. 修改 attach_volume API,添加 host 参数。
设计思路
Qcow2 镜像格式可以将所有增量快照存储在一个镜像中。其实现细节在 The QCOW2 Image Format 中。我们复制 设计思路 并使用 该思路 将卷的所有增量快照存储在 swift 中。所有活动快照都将包含恢复卷所需的所有信息。
我们的设计如下所示。
