在上传时提供设置镜像大小的选项¶
https://blueprints.launchpad.net/glance/+spec/set-size-on-upload
历史上,python-glanceclient 包含了一个用于 image-upload 和 image-stage 命令的 --size 参数选项。然而,此功能当前未使用,仅为了向后兼容性而保留在代码库中。即使用户在执行上述命令时提供了此选项,它也不会转发到 Glance API。
问题描述¶
由于 python-glanceclient 在无需事先指定镜像大小的情况下上传镜像数据,因此其功能符合预期。但是,当 Glance 使用 Cinder、RBD 或 S3 作为其后端时,这可能会导致并发症。由于 Glance 预先不知道数据大小,它会进行迭代的“先调整大小再写入”过程,每次将 Cinder 卷扩展 1 GB,直到接收到所有镜像数据。这种方法提出了一个挑战,因为 Cinder 卷需要在每次迭代期间分离和重新连接,这会显著降低过程的速度。
在使用 Ceph (RBD) 作为后端时,也会出现相同的问题,其中会发生类似的“先调整大小再写入”操作,导致耗时的操作。
如果 Glance 配置为使用 S3 作为后端,则无法利用多部分上传功能,因为镜像大小事先未知。
提议的变更¶
我们建议启用 image-upload 和 image-stage 命令的 --size 选项的使用,并将其添加到 image-create 命令中。如果在上传或暂存操作期间检测到类似文件的对象,则镜像大小将自动计算。否则,用户可以通过 --size 命令行选项指定镜像大小。如果提供了 --size 选项,我们将不会在内部计算镜像大小,并且用户指定的大小将直接发送到 Glance API。我们将引入一个新的请求头 x-openstack-image-size,它将被传递到 API。
在 API 侧,我们将读取从 glanceclient 或任何请求源通过 header x-openstack-image-size 传递的大小,并将其传递给指定存储后端。这种方法将有助于防止 Cinder 和 RBD 后端的写入调整大小操作,并为 S3 后端启用多部分上传功能。glance_store 的每个后端将在数据管道中验证大小,以确定总数据大小是否超过用户指定限制。如果大小超过允许的限制,则上传将被拒绝,数据将被从后端删除,并向用户返回适当的错误消息。此外,在流程结束时,我们将比较实际镜像大小与用户提供的大小。如果实际大小和预期大小之间存在任何不匹配,数据将被从后端删除,上传将被拒绝,并记录警告,这与现有镜像磁盘格式和哈希检查一致。
如果请求头中未包含镜像大小,我们只能允许存储后端执行写入调整大小操作,或为 S3 后端利用单部分上传功能。
对于异步操作(导入 API),例如 glance-direct 和 web-download 导入方法,我们已经在将数据传输到后端之前将其收集在本地暂存区域中。我们将确保在开始导入操作之前设置镜像大小,以避免这些调整大小操作。
备选方案¶
Python Requests 库还通过使用“Content-Length: <文件大小>” header 发送分块数据来促进流式上传,而不是使用“Transfer-Encoding: chunked”。这种方法避免了分块传输,我们应该避免分块传输,因为它是一种更稳定的长期传输方法。由于 glanceclient 库的开发目前停滞不前,我们应该避免引入可能导致不稳定的更改。
数据模型影响¶
无
REST API 影响¶
PUT /v2/images/{image_id}/file 和 PUT /v2/images/{image_id}/stage API 将被修改为识别 x-openstack-image-size header。
如果用户提供的大小与实际镜像大小不匹配,将返回 HTTP 400 响应。
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
如果用户知道镜像大小,可以提前提供。
性能影响¶
这将改进 Glance 的 cinder、ceph (rbd) 和 s3 后端的上传/导入过程。
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
abhishekk
- 其他贡献者
abhishekk
工作项¶
将
--size命令行选项添加到 image-create 命令如果提供了类似文件的对象,则计算文件大小
确保上传和暂存命令将大小作为请求头传递给 API
在 openstack client 和 sdk 中进行类似的配置
在 Glance 侧从请求头读取大小并将其传递给后端
然后将提供的大小与实际大小进行比较
确保在导入操作开始之前设置镜像大小
需要功能、单元和 tempest 测试
记录新的行为
依赖项¶
测试¶
需要单元、功能和 tempest 测试
文档影响¶
记录 Glance 侧 --size 命令行选项和新的请求头 x-openstack-image-size 的使用