组快照

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

其他贡献者

工作项

  1. 新的组快照 API

    • 创建组快照

    • 删除组快照

    • 列出组快照

    • 显示组快照

  2. 新的克隆组 API

    • 从源快照或源组创建组

  3. 新的卷驱动程序 API 更改

    • 创建组快照

    • 删除组快照

    • 从源创建组

  4. 新的数据库模式更改

  5. 在 LVM 驱动程序中实现方法。

  6. 确保新旧 API 都能工作。 详情请参见“提议的更改”部分。

依赖项

测试

将添加新的单元测试来测试更改后的代码。 应该添加 Tempest 测试。 如有需要,可以添加功能测试。

文档影响

需要进行文档更改。

参考资料

[1] 通用卷组规范

https://review.openstack.org/#/c/303893/