一致性组

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