在上传时提供设置镜像大小的选项

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 的使用

参考资料