组快照¶
https://blueprints.launchpad.net/cinder/+spec/generic-volume-group
此规范依赖于通用卷组规范 [1]。 提出此规范的目的是将现有的 consistency groups 支持迁移到使用通用卷组结构,并为所有存储后端提供一个通用的组快照 API。
问题描述¶
在 Juno 中,我们向 cinder 引入了 consistency groups (CG) 支持。 cinder 中现有的 CG 支持仅支持 CG 快照。
现有的 CG 支持仅包含以下用于 CG 的表:* consistencygroups * cgsnapshot
现有的 CG 支持提供以下 API:* 创建 CG * 删除 CG * 更新 CG * 从源(CG 或 CG 快照)创建 CG * 列出 CG * 显示 CG * 创建 CG 快照 * 创建 CG 快照 * 列出 CG 快照 * 显示 CG 快照
通用卷组规范引入了一个 groups 表,它对应于现有的 consistencygroups 表。
通用卷组规范引入了以下 API,它们对应于一些现有的 CG API:* 创建组 * 删除组 * 更新组 * 列出组 * 显示组
要使用通用构造支持现有的 CG 功能,缺失的部分如下:
一个 group_snapshots 表(用于 cgsnapshots 表)
创建组快照 API(用于创建 cgsnapshot)
删除组快照 API(用于删除 cgsnapshot)
列出组快照 API(用于列出 cgsnapshots)
显示组快照 API(用于显示 cgsnapshot)
从源组或源组快照创建组 API(用于从 cgsnapshot 或源 CG 创建 CG)
因此,我们建议在此规范中添加缺失的部分,并提供一种将数据从 CG 和 CGSnapshot 表迁移到 group 和 group snapshots 表的方法,同时保持滚动升级的支持。
现有的 CG 和 CG 快照 API 只能由 cinder 中的一部分存储后端支持。 在此规范中,我们建议提供可以由所有存储后端支持的组快照 API。
用例¶
组快照支持两种能力,即 consistent_group_snapshot_enabled 和 group_snapshot_enabled。 将 consistent_group_snapshot_enabled 规范设置为 True 的组快照等效于 Cinder 中今天存在的 cgsnapshot,并且可以在存储级别保证某一时间点的一致性。 将 group_snapshot_enabled 规范设置为 True 的组快照是一组快照,不保证存储级别的一致性。
构建在 cinder、nova、neutron、glance 等之上的数据保护产品希望保护所有 OpenStack 资源。 它们可以使用组快照 API 在其解决方案中拍摄快照。 如果没有组快照 API,数据保护产品将不得不为每个卷单独拍摄快照。
提议的变更¶
创建组快照
添加一个允许租户创建组快照的 API。
相应地添加卷驱动程序 API。
删除组快照
添加一个允许租户删除组快照的 API。
相应地添加卷驱动程序 API。
列出组快照
添加一个列出组快照的 API。
显示组快照
添加一个显示组快照的 API。
从源组或源组快照创建组
添加一个从源组或源组快照创建组的 API。
相应地添加卷驱动程序 API。
数据库模式更改
将创建一个新的 group_snapshots 表,其中包含以下内容:* group_snapshot 的 uuid * 名称 * 描述 * 原始组的 uuid 作为外键
将在 snapshots 表中添加一个 group_snapshot_id 列。
将在 groups 表中添加两个新列 group_snapshot_id 和 source_group_id。
将进行更改以确保通用卷组和组快照可以支持 CG 和 CG 快照。
创建一个默认组类型,并仅将其用于现有的 CG。
编写一个迁移脚本,将数据从 consistencygroups 复制到 groups,从 cgsnapshots 复制到 group_snapshots 表。 移动到 groups 的所有现有 consistencygroups 将使用默认组类型。
在未来(例如,Ocata),我们可以提供一个 cinder manage 命令,允许管理员更改组类型。
在 Newton 中,为了支持滚动升级,所有现有的 CG 和 CG 快照 API 将继续工作,并且它们将写入现有和新表。 读取将从现有表中进行。 因此,list 和 show 将从现有表中检索数据。
在 Ocata 版本中,使用旧的 CG API 仍然有效,数据将写入新旧表。 读取将从新表中进行。 因此,list 和 show 将从新表中检索数据。
在“P”版本中,使用旧的 CG API 仍然有效,写入和读取都将使用新表。 旧表将在“P”版本中删除。
使用新 API 将仅写入和读取新表。 这意味着 list groups 将列出新表中所有组,包括使用 CG API 创建的组。 组快照也是如此。 通过检查组的类型,您可以判断它是什么类型的组。
在使用新 API 创建组时,如果组类型规范中包含以下内容,管理器将首先调用驱动程序中的 create_group,如果未实现 create_group,则调用驱动程序中的 create_consistencygroup。
{'consistent_group_snapshot_enabled': <is> True}
同样适用于 delete_group、update_group、create_group_snapshot、delete_group_snapshot 和 create_group_from_src。 这样,新的 API 将与现有驱动程序实现的 CG 函数一起工作。
在“P”版本期间,我们可以决定是否保留 CG 和 CG 快照 API 或在“Q”版本中弃用它们。
备选方案¶
我们可以继续使用现有的 CG 和 CG 快照 API。
数据模型影响¶
数据库模式更改
将创建一个新的 group_snapshots 表,其中包含以下内容。
group_snapshot 的 uuid
name
description
原始组的 uuid 作为外键
将在 snapshots 表中添加一个 group_snapshot_id 列。
将在 groups 表中添加两个新列 group_snapshot_id 和 source_group_id。
REST API 影响¶
新的组快照 API
创建组快照
V3/<tenant id>/group_snapshots
方法:POST
V3 的 JSON 模式定义
{ "group_snapshot": { "name": "my_group_snapshot", "description": "My group snapshot", "group_id": group_uuid, "user_id": user_id, "project_id": project_id, } }
删除组快照
V3/<tenant id>/group_snapshots/<group snapshot uuid>
方法:DELETE
此 API 没有正文
列出组快照
V3/<tenant id>/group_snapshots
此 API 列出所有组快照的摘要信息。
方法:GET
此 API 没有正文。
列出组快照(详细)
V3/<tenant id>/group_snapshots/detail
此 API 列出所有组快照的详细信息。
方法:GET
此 API 没有正文。
显示组快照
V3/<tenant id>/group_snapshots/<group snapshot uuid>
方法:GET
此 API 没有正文。
从源创建组
V3/<tenant id>/groups/action
方法:POST
V3 的 JSON 模式定义
{ "create-from-src": { "name": "my_group", "description": "My group", "group_snapshot_id": group_snapshot_uuid, "source_group_id": source_group_uuid, "user_id": user_id, "project_id": project_id, } }
更改创建快照 API
将在请求正文中添加一个新字段“group_snapshot_id”(组快照的 uuid)。
Cinder 卷驱动程序 API
将添加以下新的卷驱动程序 API
def create_group_snapshot(self, context, group_snapshot, snapshots)
def delete_group_snapshot(self, context, group_snapshot, snapshots)
- def create_group_from_src(self, context, group, volumes,
group_snapshot=None, snapshots=None, source_group=None, source_vols=None)
安全影响¶
无。
通知影响¶
将添加用于创建和删除组快照以及从源创建组的通知。
其他最终用户影响¶
需要更改 python-cinderclient 以支持新的 API。
创建组快照
cinder group-snapshot-create –name <name> –description <description> <group uuid>
删除组快照
cinder group-snapshot-delete <group snapshot uuid> [<group snapshot uuid> …]
列出组快照
cinder group-snapshot-list
显示组快照
cinder group-snapshot-show <group snapshot uuid>
从源创建组 cinder group-create-from-src –group-snapshot <group snapshot uuid> –source-group <source group uuid> –name <name> –description <description>
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
驱动程序开发人员可以实施新的驱动程序 API。
实现¶
负责人¶
- 主要负责人
xing-yang
其他贡献者
工作项¶
新的组快照 API
创建组快照
删除组快照
列出组快照
显示组快照
新的克隆组 API
从源快照或源组创建组
新的卷驱动程序 API 更改
创建组快照
删除组快照
从源创建组
新的数据库模式更改
在 LVM 驱动程序中实现方法。
确保新旧 API 都能工作。 详情请参见“提议的更改”部分。
依赖项¶
测试¶
将添加新的单元测试来测试更改后的代码。 应该添加 Tempest 测试。 如有需要,可以添加功能测试。
文档影响¶
需要进行文档更改。
参考资料¶
[1] 通用卷组规范