MinIO 中的小文件归档

MinIO 中的小文件归档

MinIO RELEASE.2021-06-14 添加了一个“s3zip”扩展,允许从 ZIP 存档下载单个文件。我们将探讨与下载常规对象相比这有优势的用例,并解释如何使用它。

背景

我们之前已经描述了 MinIO 是如何在内部优化小对象的。但是,在内部存储单个对象仍然会施加文件系统限制,例如较慢的列表和最小块大小。

通过反馈,我们发现在某些情况下,希望能够在没有单个对象的完整特征集的情况下引用小数据段。为了使其尽可能易于使用,我们添加了 ZIP 文件索引。

此功能允许检索上传到 MinIO 的 ZIP 文件中的单个文件。使用此功能可以上传包含数千个文件的单个 ZIP 文件。然后, MinIO 索引工具确保可以以与单个对象相同的性能来访问 ZIP 文件中的文件。所有这些都是透明地完成的。

pasted image 0 - 2023-04-02T194311.454.png

ZIP 文件是众所周知的,并且在大多数开发平台上都得到了很好的支持,并且拥有完善的可用工具。在大多数语言中,ZIP 格式允许流式写入,因此在创建存档时不需要所有数据都在内存中。我们选择通用格式而不是自定义构建格式,因为它提供了我们需要的功能。TAR 等其他格式不满足此要求,因此我们不希望实施其他格式。

用例

我们此功能的主要目标是允许快速上传许多不变的小数据,并允许快速下载单个文件。这还有一个额外的好处,即占用更少的空间,因为所有数据都存储为一个文件。

一个主要的使用示例可能是需要按用户访问的每周/每日/每小时报告。您可能有一个数据湖,用于存储要分析的文件的 ZIP 存档。文件名将成为您要对其执行查找的 ID。对于常规对象,这将在每个时间间隔为每个用户创建一个对象。相反,可以上传给定时间间隔内的所有内容,并且可以通过 ID 访问各个记录。

无法更新 ZIP 文件中的单个文件。因此,这应该只用于预计不会更改的数据。如果 ZIP 文件被覆盖,所有文件将同时自动替换。如果您知道您将修改 ZIP 文件的内容,则不要使用 ZIP 文件,而是将文件另存为常规对象。

zip 中的文件没有单独的元数据,只有名称和大小。修改时间继承自父 ZIP 对象。这意味着ILM 规则保留将作为一个整体应用于 ZIP 对象。

ZIP 压缩是次要的,通常建议不压缩 ZIP 文件中的文件。这可以在压缩文件时设置。单个文件可以未压缩或使用 deflate 压缩存储。

存档的字节大小对检索单个文件的响应能力影响很小。为了保持单个请求的响应,建议将每个 zip 文件保持在 100,000 个以下的单个文件。如果您打算超越这个,我们建议将您的输入分成几个文件,每个文件的目标是 10,000 个文件。

基准测试表明,对于包含 10,000 个文件的 zip 文件,每次访问大约需要 1 毫秒。这是线性扩展的,因此对于 100,000 个文件,假设 CPU 资源可用,每个操作应该额外增加 10 毫秒。

基本用法

现有 S3 API 的扩展使得使用索引 ZIP 文件成为可能。为确保不会出现意外的副作用,所有使用都受到标头的保护,标头必须存在才能启用新功能。要启用扩展,标头x-minio-extract必须设置值true

以下 API 请求类型支持 s3zip 扩展:HeadObjectGetObjectListObjectsV2。这将允许在存档中列出文件并检索它们。

zip 文件中的文件被引用为/prefix/file.zip/path-in-zip/file.extZip 文件必须具有 zip 扩展名,zip 文件中的路径用于引用每个文件。

例如,要列出作为带有前缀的prefix/file.zip问题 a上传的文件中的所有文件请注意正斜杠如何指示 zip 文件中的内容。前缀、标记和分隔符作为常规 ListObjectsV2 调用运行。GetObjectprefix/file.zip/

pasted image 0 - 2023-04-02T194344.228.png

上传文件

上传文件是通过常规功能完成的。上传文件不需要特殊操作,除了对象键必须以.zip.

要在上传时立即触发索引,可以通过将   x-minio-extract标头设置为true如果未设置,索引将由上述第一个检索或列出 zip 文件的请求创建。

完全支持 Zip64(4GB 以上的 zip 文件)。不支持基于 zip 加密的 Zip 文件。

支持 Unicode 名称,并且应使用 UTF-8 编码。但是,确实存在依赖本地代码页工作的不兼容压缩器。如果您打算使用 Unicode 名称,请检查文件名是否已正确解码。通常建议遵循通用的对象键命名准则

pasted image 0 - 2023-04-02T194408.197.png

清单文件

常规列表操作会将 zip 文件作为常规对象返回。

要列出 zip 文件的内容,请发送包含 zip 文件作为前缀和上述标题的前缀。例如,prefix/file.zip/将列出带有键的 zip 文件的所有内容prefix/file.zip支持常规 ListObjectV2 参数,如附加前缀、标记和分隔符。

例如,带有前缀 = prefix/file.zip/folder/、定界符 =的列表/将仅列出指定文件夹中的内容。

为了保持较低的复杂性,存在一些限制:必须使用 ListObjectV2。每次调用只能列出一个 zip 文件,并且只能列出最新版本的 zip 文件。

pasted image 0 - 2023-04-02T194445.166.png

下载单个文件

如上所述,访问单个文件需要一个标题和一个路径来指示 zip 文件和其中的文件。要获取路径,可以使用 ListObjectsV2。也可以通过手动将对象路径与 zip 文件内的路径组合来构造对象名称。

查看有关如何下载文件的示例...

单个文件作为单个请求处理。这将以与单独对象相同的速度生成单个文件。如果您需要访问存档中许多文件的内容,下载整个 ZIP 存档并在本地处理它会更快。

pasted image 0 - 2023-04-02T194509.666.png

主控支持

mc RELEASE.2022-02-16 添加了对远程访问 zip 文件中文件的支持。具体来说,ls、cp 和 cat 命令支持源为远程 zip 文件的操作。这些命令有一个“--zip”参数,表明您打算在 zip 文件上运行操作。

要列出 zip 文件中的所有文件,请使用

λ mc ls --zip -–recursive play/test/test.zip/

这会将所有文件列为常规对象。也可以列出单个文件夹:

λ mc ls --zip play/test/test.zip/folder/

... 将列出文件夹中的所有文件和文件夹。

可以使用以下命令提取文件cp

λ mc cp --zip play/test/test.zip/file.txt

也可以使用常规语法递归地从文件夹中提取文件:

λ mc cp --zip —-recursive play/test/test.zip/folder/ ./extracted/

最后,可以显示 zip 文件中的单个文件:

λ mc cat --zip play/test/test.zip/file.txt

这仅在远程是在分布式或单驱动器单磁盘模式下运行的 MinIO 服务器时才有效。

结论

s3zip 功能允许您以紧凑的方式存储许多小的独立文件。这可以很好地替代许多单独的对象,从而减少 ILM 和其他操作的存储开销和处理时间。

与任何扩展一样,适用通常的警告。虽然在技术上可以实现本地索引并使用 HTTP 范围请求来提供类似的功能而无需任何服务器端支持,但这需要付出相当大的努力,并且结果不会像我们通过扩展所完成的那样精简。

出于存档目的,此扩展提供了一种空间和带宽效率更高的方法,用于通过 mc 命令界面检索很少访问的存档数据。这可能是存储您仅偶尔需要访问的日志数据的有效方法。可用于需要通过ID快速访问的多个数据段的快速上传。

考虑使用 userid -> json 映射的每日用户统计信息。当使用常规对象时,这可以作为对象命名来实现yyyy/mm/dd/user_id/file.json这将需要每天为每个用户上传一个对象。

相反,每天可以创建一个 zip 文件,并且可以通过阅读来查找用户统计信息yyyy-mm-dd.zip/user_id.json——这将更快地上传、维护和占用更少的空间——这在数据湖中工作时都是好事。

如果有很多用户,使用确定性拆分方法,yyyy-mm-dd/user0-10000.zip/user_id.json可以将其扩展到数十亿用户,对象数量减少 5 个数量级。

使用 MinIO 压缩 ZIP 文件

下载 MinIO并利用从 ZIP 文件中列出和下载单个文件的功能。如果您有任何问题或想告诉我们您正在使用 MinIO 构建的出色应用程序,请通过 sales@minio.org.cn 联系我们或加入Slack 社区


上一篇 下一篇