显示卷详情中的迁移进度¶
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(当卷已附加时),要么从卷服务。
其他部署者影响¶
无。
开发人员影响¶
无。
升级影响¶
无。
实现¶
负责人¶
- 主要负责人
工作项¶
在 cinder 中添加一个新的微版本,并在 python-cinderclient 中增加 MAX
在新微版本中向卷详情响应添加一个新字段
添加一个 RPC 以从卷服务获取迁移进度
更新 API 代码以调用适当的(cinder 或 nova)RPC
扩展现有的单元和功能测试
更新 API 文档
依赖项¶
跟踪已附加卷的迁移进度需要 nova 功能。请参阅 nova 功能规范中的参考资料。
测试¶
待定 (TBD)。将某些内容合并到 tempest 测试中的棘手之处在于捕获卷迁移操作,在复制卷数据的期间,因为只有那时 migration_progress 字段才会出现在卷详情响应中。
文档影响¶
块存储 API 参考文档需要更新,但对其他用户或管理员面临的文档没有影响。