一致性组¶
https://blueprints.launchpad.net/cinder/+spec/consistency-groups
目前在 Cinder 中,所有操作都发生在卷级别。一致性组 (CGs) 对于数据保护(快照和备份)和灾难恢复(远程复制)是必需的。本蓝图将引入一致性组,并讨论如何将其应用于快照。
远程复制在另一个蓝图中介绍,此处不再讨论。 https://blueprints.launchpad.net/cinder/+spec/volume-replication
问题描述¶
一致性组对快照的支持将在阶段 1 (Juno) 中添加。
未来
在一致性组被引入并实现用于快照之后,它可能会应用于备份。这将在阶段 1 之后进行。
修改一致性组(在创建后将现有卷添加到 CG 以及从 CG 中删除卷)将在阶段 1 之后支持。
假设
Cinder 提供可以被编排层使用的 API。
编排层知道应该将哪些卷分组在一起。
CG 中的卷属于同一个后端。
CG 中的卷可以具有不同的卷类型。
3 级静默
应用程序级别:不在 Cinder 的控制范围内
文件系统级别:Cinder 可以调用新提出的 Nova 管理静默 API,该 API 使用 QEMU guest agent 在获取 CG 快照之前冻结 guest 文件系统,并在之后解冻。但是,QEMU guest agent 中的此冻结功能最近才添加到 libvirt 中,因此我们目前还不能依赖它。
存储级别:阵列可以在获取 CG 快照之前冻结 IO。由于上述冻结功能尚未准备好,因此我们只能在阶段 1 中依赖存储级别静默。
用例¶
提议的变更¶
一致性组工作流程
创建一个 CG,指定此 CG 可以支持的卷类型。
调度器将确定可以处理这些卷类型的后端。后端(主机)将保存在 db 中的 CG 表中。
创建一个卷并指定 CG。
此步骤将重复,直到为 CG 创建所有卷为止。
创建 CG 的快照。
Cinder API 创建 cgsnapshot 和 db 中的单个快照条目,并将请求发送到 Cinder volume 节点。
Cinder 管理器调用 novaclient,然后调用新的 Nova 管理 API “quiesce”,该 API 使用 QEMU guest agent 冻结 guest 文件系统。可以利用这项工作: https://wiki.openstack.org/wiki/Cinder/QuiescedSnapshotWithQemuGuestAgent(注意:此步骤现在将搁置,因为冻结功能尚不可靠。)
Cinder 管理器调用 Cinder 驱动程序。
Cinder 驱动程序与后端阵列通信,以创建 CG 的某个时间点一致性快照。
Cinder 管理器调用 novaclient,然后调用新的 Nova 管理 API “unquiesce”,该 API 使用 QEMU guest agent 解冻 guest 文件系统。(注意:此步骤现在将搁置。)
备选方案¶
一种替代方案是不在 Cinder 中实现 CG,而是在编排层实现它。但是,在这种情况下,Cinder 将不知道哪些卷属于 CG。因此,用户可以使用 Cinder CLI 或 Horizon 删除属于 CG 的卷,而不知道后果。
另一种替代方案是不完全实现 CG。用户将能够以单个卷级别进行操作,但无法为同一应用程序中的多个卷提供崩溃一致的数据保护。
数据模型影响¶
数据库模式更改
将创建一个新的 consistencygroups 表。
将创建一个新的 cgsnapshots 表。
volumes 表中的卷条目将具有指向其所属 consistencygroup uuid 的外键。
cgsnapshots 表中的 cgsnapshot 条目将具有指向 consistencygroup uuid 的外键。
snapshots 表中的快照条目将具有指向 cgsnapshot uuid 的外键。
mysql> desc cgsnapshots;
+---------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+-------+
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| deleted_at | datetime | YES | | NULL | |
| deleted | tinyint(1) | YES | | NULL | |
| id | varchar(36) | NO | PRI | NULL | |
| consistencygroup_id | varchar(36) | YES | | NULL | |
| user_id | varchar(255) | YES | | NULL | |
| project_id | varchar(255) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| status | varchar(255) | YES | | NULL | |
+---------------------+--------------+------+-----+---------+-------+
11 rows in set (0.00 sec)
mysql> desc consistencygroups;
+-------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
| deleted_at | datetime | YES | | NULL | |
| deleted | tinyint(1) | YES | | NULL | |
| id | varchar(36) | NO | PRI | NULL | |
| user_id | varchar(255) | YES | | NULL | |
| project_id | varchar(255) | YES | | NULL | |
| host | varchar(255) | YES | | NULL | |
| availability_zone | varchar(255) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| status | varchar(255) | YES | | NULL | |
+-------------------+--------------+------+-----+---------+-------+
12 rows in set (0.00 sec)
备选方案
与其添加 cgsnapshots 表,不如向快照添加一个标签。该标签将是 cgsnapshot 名称。这意味着我们需要确保在创建 CG 的快照时提供名称,并且它必须是唯一的。
REST API 影响¶
一致性组
添加 V2 API 扩展 consistencygroups
创建一致性组 API
创建一个一致性组。
方法类型:POST
正常响应代码:202
预期的 http 响应代码:TBD * 404:未找到类型组
V2/<tenant id>/consistencygroups
V2 的 JSON 模式定义
{ "consistencygroup": { "name": "my_cg", "description": "My consistency group", "volume_types": [type1, type2, ...], "availability_zone": "zone1:host1" } }
删除一致性组 API
删除一个一致性组。
方法类型: DELETE
正常响应代码:202
预期的 http 响应代码:* 404:未找到一致性组 * 403:一致性组正在使用
V2/<tenant id>/consistencygroups/<cg uuid>
此 API 没有正文。
列出一致性组 API
此 API 列出所有一致性组的摘要信息。
方法类型:GET
正常响应代码:200
预期的 http 响应代码:TBD
V2/<tenant id>/consistencygroups
此 API 没有正文。
列出一致性组(详细)API
此 API 列出所有一致性组的详细信息。
方法类型:GET
正常响应代码:200
预期的 http 响应代码:TBD
V2/<tenant id>/consistencygroups/detail
此 API 没有正文。
显示一致性组 API
此 API 显示指定一致性组的信息。
方法类型:GET
正常响应代码:200
预期的 http 响应代码 * 404:未找到一致性组
V2/<tenant id>/consistencygroups/<cg uuid>
此 API 没有正文。
修改一致性组 API(将现有卷添加到或从 CG 中删除卷)将在阶段 1 之后解决。
创建卷 API 将添加“consistencygroup_id”
{ "volume": { ........ ........ "consistencygroup_id": "consistency group uuid", ........ ........ } }
快照
添加 V2 API 扩展,用于一致性组的快照
创建快照 API
创建一个一致性组。
方法类型:POST
正常响应代码:202
预期的 http 响应代码:TBD * 404:未找到快照
V2/<tenant id>/consistencygroups/<cg uuid>/snapshots
V2 的 JSON 模式定义
{ "snapshot": { "name": "my_cg_snapshot" "description": "Snapshot of my consistency group" } }
删除快照 API
删除一致性组的快照。
方法类型: DELETE
正常响应代码:202
预期的 http 响应代码 * 404:未找到快照
V2/<tenant id>/consistencygroups/<cg uuid>/snapshots/<snapshot id>
V2 的 JSON schema 定义:None
如果属于一致性组,则不应能够删除单个卷快照。
列出快照 API
此 API 列出一致性组的所有快照的摘要信息。
方法类型:GET
正常响应代码:200
预期的 http 响应代码:TBD
V2/<tenant id>/consistencygroups/<cg uuid>/snapshots
此 API 没有正文。
列出一致性组(详细)API
此 API 列出一致性组的所有快照的详细信息。
方法类型:GET
正常响应代码:200
预期的 http 响应代码:TBD
V2/<tenant id>/consistencygroups/<cg uuid>/snapshots/detail
此 API 没有正文。
显示快照 API
此 API 显示指定一致性组的快照的信息。
方法类型:GET
正常响应代码:200
预期的 http 响应代码 * 404:未找到一致性组的快照
V2/<tenant id>/consistencygroups/<cg uuid>/snapshots/<snapshot id>
此 API 没有正文。
驱动程序 API 添加
def create_consistencygroup(self, context, consistencygroup, volumes)
def delete_consistencygroup(self, context, consistencygroup)
def create_cgsnapshot(self, context, cgsnapshot)
def delete_cgsnapshot(self, context, cgsnapshot)
安全影响¶
无
通知影响¶
添加事件通知。
其他最终用户影响¶
添加每个租户的最大 CG 数量的配额。
python-cinderclient 需要更改以支持 CG。将添加以下 CLI。
- 列出所有一致性组
cinder consistencygroup-list
- 创建一个一致性组
cinder consistencygroup-create –name <name> –description <description> –volume_type <type1,type2,…>
- 示例
cinder consistencygroup-create –name mycg –description “My CG” –volume_type lvm-1,lvm-2
- 创建一个新卷并将其添加到一致性组
cinder create –volume_type <type> –consistencygroup <cg uuid 或 name> <size>
- 删除一个或多个一致性组
cinder consistencygroup-delete <cg uuid 或 name> [<cg uuid 或 name> …]
cinder consistencygroup-show <cg uuid 或 name>
python-cinderclient 需要更改以支持快照。
- 列出一致性组的快照
cinder consistencygroup-snapshot-list <cg uuid 或 name>
- 创建一个一致性组的快照
cinder consistencygroup-snapshot-create <cg uuid 或 name>
- 显示一致性组的快照
cinder consistencygroup-snapshot-show <cgsnapshot uuid 或 name>
- 删除一个或多个快照
cinder consistencygroup-snapshot-delete <cgsnapshot uuid 或 name> [<cgsnapshot uuid 或 name> …]
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
这将向 Cinder 添加 CG 支持。其他驱动程序可以实现建议的驱动程序 API 以支持此功能。这不是必需的。
实现¶
负责人¶
- 主要负责人
xing-yang (xing.yang@emc.com)
- 其他贡献者
无
工作项¶
添加 Cinder API。
进行数据库模式更改。
驱动程序 API 更改。
为 LVM 实现驱动程序更改。
Tempest 测试。
依赖项¶
无
测试¶
为了测试此功能,需要向 Tempest 添加测试以支持所有新的 API。
文档影响¶
需要记录新的 API。
参考资料¶
Juno 设计会话
https://etherpad.openstack.org/p/juno-cinder-cinder-consistency-groups