文章内容

2024/9/4 19:32:29,作 者: 黄兵

OpenStack Swift DLO 文件上传

下面这段代码使用的是 OpenStack Swift DLO (Dynamic Large Object) 方式上传:

 def upload_object_by_chunk(self, container_name, object_name, file, chunk_index, total_chunks):
        """
        上传分片到 OpenStack Swift
        """
        url = f'{self._request_url}/v1/AUTH_{self._username}/{container_name}/{object_name}'
        response = self._make_request('PUT', url, data=file.stream.read())

        if response.status_code not in (200, 201):
            raise ChunkUploadError(f"Failed to upload chunk {chunk_index}")

        # 如果是最后一个分片,拼接文件
        if int(chunk_index) + 1 == int(total_chunks):
            manifest_url = f'{self._request_url}/v1/AUTH_{self._username}/{container_name}/{file.filename}'
            manifest_headers = {
                'X-Auth-Token': self._credentials,
                'X-Object-Manifest': f'{container_name}/{file.filename}/'
            }
            manifest_response = self._make_request('PUT', manifest_url, headers=manifest_headers)
            if manifest_response.status_code not in (200, 201):
                raise FinalizeUploadError(f"Failed to finalize upload for {file.filename}")

        return True

关于 OpenStack Swift 大文件分片上传,分片上传(segmented upload)通常通过大对象支持(Large Object Support, LOS)机制实现。Swift 提供了两种处理大对象的方法:

  1. 静态大对象(SLO,Static Large Object): SLO 是通过一个清单(manifest)对象引用多个分片(segments)来组成大对象。清单文件本身是一个普通对象,包含了所有分片的引用。

  2. 动态大对象(DLO,Dynamic Large Object): DLO 使用前缀匹配来动态检索对象片段。DLO 的清单文件只是指向多个分片的前缀,而不是精确的列表。

上面的代码使用了 DLO 上传,主要原因为:

  • 代码中使用了 X-Object-Manifest 头来指向上传分片文件的前缀。
  • DLO(动态大对象)方式通过将对象分片上传至同一个容器中的不同对象,然后通过上传一个“清单”文件(manifest file)来表示对象。这是 DLO 的工作机制。
  • 在你代码的最后一步,上传了一个带有 X-Object-Manifest 头的文件,用来告诉 Swift 该对象的所有分片都具有相同的前缀。DLO 会自动将这些分片组合为一个完整的大对象。

  • DLO 的工作方式

    • 分片文件会按照一定的命名规则上传(如 file_name/part_1file_name/part_2 等)。
    • 最后一个请求会上传一个清单文件,并使用 X-Object-Manifest 头来指定这些分片的路径前缀。
    • Swift 在读取对象时,会动态地从这些分片中读取数据并组合成一个完整的对象。

    相比之下,SLO (Static Large Object) 则是通过提前上传每一个分片,并在最后上传一个 JSON 清单文件,列出所有分片及其具体的路径和顺序。SLO 在创建对象时是静态的,不同于 DLO 动态组合分片的方式。


    其它相关推荐:

    1、OpenStack Swift 中 ACL 认证是由那个中间件实现的

    2、OpenStack Swift 大文件分片

    3、OpenStack Swift 配置 Memcached

    4、如何卸载 OpenStack Swift

    5、OpenStack Swift 自定义认证中间件

    分享到:

    发表评论

    评论列表