显示卷详情中的迁移进度

https://blueprints.launchpad.net/cinder/+spec/migration-progress-in-volume-details

本规范建议在卷迁移时,向卷详情 API 响应中添加一个 migration_progress 字段。

问题描述

卷迁移可能由后端驱动程序促进,但通常需要 cinder 或 nova 从源卷复制数据到新卷。对于大容量卷,这可能需要很长时间才能完成(数小时,甚至几天)。目前,没有办法跟踪复制操作的进度,这使得很难预测迁移何时完成。

用例

  • 作为正在迁移卷的云管理员,我需要知道它是否需要花费太多的时间才能完成,以免我担心操作卡住了。

  • 作为正在迁移卷的云管理员,我希望能够跟踪迁移进度,以便评估操作完成可能还需要多长时间。

提议的变更

显示卷详情的 API 代码将使用一个微版本来选择性地包含一个 migration_progress 字段。该字段仅在卷正在迁移且微版本允许时才包含在 API 响应中。由于现有的 migration_status 字段仅供管理员使用,因此新字段也将仅供管理员使用。

该值将通过 RPC 获取,该 RPC 从与卷关联的卷服务或从 nova 获取响应(当卷已附加并且 nova 正在复制数据时)。请参阅参考资料中的 nova 功能建议。只有在满足以下条件时,才会执行到卷服务或 nova 的 RPC

  • 上下文是管理员

  • 卷的 migration_status 是“migrating”(迁移中)

  • API 请求满足新的微版本

处理 RPC 的卷服务将确定卷的迁移方式,以便提供适当的响应。

  • 当迁移需要 cinder 复制数据时,RPC 响应将是一个字符串,表示完成百分比(例如,“42”表示完成 42%)。这与 nova 在交换卷附加时提供的 swap_progress 响应相同。

  • 当迁移由卷的驱动程序处理时,RPC 响应将是一个待定 (TBD) 字符串,以指示迁移是驱动程序辅助的。支持驱动程序辅助迁移的 cinder 驱动程序的子集不公开用于报告迁移进度的 API,并且期望驱动程序完成迁移的速度足够快,以提供令人满意的用户体验(即,涵盖了用例)。

  • 如果迁移在收到 RPC 时已完成,则响应将为 None

在 API 层,migration_progress 字段仅在 RPC 响应是非空字符串时才包含在卷详情响应中。对于已附加的卷,nova 的 swap_progress 将报告为卷的 migration_status

备选方案

一个早期的想法是增强 cinder,使其尝试在已附加的卷上使用“驱动程序辅助卷迁移”。希望 cinder 驱动程序能够足够快地迁移数据,以减轻对过程花费时间过长的担忧。由于多种原因,这个想法被拒绝了

  • 并非所有 cinder 驱动程序都支持驱动程序辅助迁移,并且大多数驱动程序明确禁止迁移已附加的卷。

  • cinder 和 nova 之间的交互会很复杂。cinder 需要告诉 nova 在迁移卷之前暂停 IO,然后在迁移完成后取消暂停。

数据模型影响

待定 (TBD),但希望没有。可能需要添加一个数据库字段来方便获取适当的 RPC 响应。这将在设计阶段仔细考虑,目标是最大限度地减少对数据库的影响。

REST API 影响

GET /v3/volumes/{volume_id} API 添加一个新的微版本,以便在 migration_status 字段为 migrating 并且 API 上下文是管理员时,在响应中包含一个可选的 migration_progress 字段。

{
    "volume": {
        "attachments": [],
        "availability_zone": "nova",
        "bootable": "false",
        "consistencygroup_id": null,
        "created_at": "2018-11-29T06:50:07.770785",
        "description": null,
        "encrypted": false,
        "id": "f7223234-1afc-4d19-bfa3-d19deb6235ef",
        "links": [
            {
                "href": "http://127.0.0.1:45839/v3/89afd400-b646-4bbc-b12b-c0a4d63e5bd3/volumes/f7223234-1afc-4d19-bfa3-d19deb6235ef",
                "rel": "self"
            },
            {
                "href": "http://127.0.0.1:45839/89afd400-b646-4bbc-b12b-c0a4d63e5bd3/volumes/f7223234-1afc-4d19-bfa3-d19deb6235ef",
                "rel": "bookmark"
            }
        ],
        "metadata": {},
        "migration_status": "migrating",
        "multiattach": false,
        "name": null,
        "os-vol-host-attr:host": null,
        "os-vol-mig-status-attr:migstat": null,
        "os-vol-mig-status-attr:name_id": null,
        "os-vol-tenant-attr:tenant_id": "89afd400-b646-4bbc-b12b-c0a4d63e5bd3",
        "replication_status": null,
        "size": 10,
        "snapshot_id": null,
        "source_volid": null,
        "status": "creating",
        "updated_at": null,
        "user_id": "c853ca26-e8ea-4797-8a52-ee124a013d0e",
        "volume_type": "__DEFAULT__",
        "provider_id": null,
        "group_id": null,
        "service_uuid": null,
        "shared_targets": true,
        "cluster_name": null,
        "volume_type_id": "5fed9d7c-401d-46e2-8e80-f30c70cb7e1d",
        "consumes_quota": true,
        "migration_progress": "42"
   }
}

安全影响

无。 migration_progress 将仅供管理员使用。

Active/Active HA 影响

没有,我想。

通知影响

无。

其他最终用户影响

如果 API 响应中存在,openstack 和 cinder cli 都将自动显示新的 migration_progress 字段。

性能影响

除非卷正在迁移,否则不会有性能影响。当它正在迁移时,需要一个 RPC 来获取迁移进度数据,要么从 nova(当卷已附加时),要么从卷服务。

其他部署者影响

无。

开发人员影响

无。

升级影响

无。

实现

负责人

主要负责人

<abishop@redhat.com>

工作项

  • 在 cinder 中添加一个新的微版本,并在 python-cinderclient 中增加 MAX

  • 在新微版本中向卷详情响应添加一个新字段

  • 添加一个 RPC 以从卷服务获取迁移进度

  • 更新 API 代码以调用适当的(cinder 或 nova)RPC

  • 扩展现有的单元和功能测试

  • 更新 API 文档

依赖项

跟踪已附加卷的迁移进度需要 nova 功能。请参阅 nova 功能规范中的参考资料。

测试

待定 (TBD)。将某些内容合并到 tempest 测试中的棘手之处在于捕获卷迁移操作,在复制卷数据的期间,因为只有那时 migration_progress 字段才会出现在卷详情响应中。

文档影响

块存储 API 参考文档需要更新,但对其他用户或管理员面临的文档没有影响。

参考资料