迷你版。2021-06-14添加了一个“s3zip”扩展,允许从ZIP档案下载单个文件。我们将探讨与下载常规对象相比,这是一个优势的用例,并解释如何使用它。
我们之前已经描述过MinIO如何在内部优化小对象。然而,在内部存储单个对象仍然会带来文件系统限制,例如较慢的列表和最小块大小。
通过反馈,我们发现在某些情况下,能够在没有单个对象的完整特征集的情况下引用小数据段是可取的。为了让它尽可能容易使用,我们添加了ZIP文件索引。
此功能允许检索上载到MinIO的ZIP文件中的单个文件。使用此功能,可以上载包含数千个文件的单个ZIP文件。然后,MinIO索引工具可以确保访问ZIP文件中的文件的性能与访问单个对象的性能相同。所有这些都是透明的。
ZIP文件在大多数开发平台上都是众所周知的,并且得到了很好的支持,而且有成熟的可用工具。在大多数语言中,ZIP格式允许流式写入,因此创建归档文件时不需要将所有数据都存储在内存中。我们选择通用格式而不是定制格式,因为它提供了我们需要的功能。像TAR这样的其他格式不能满足这方面的要求,所以我们不希望实现其他格式。
我们这个功能的主要目标是允许快速上传许多不会改变的小数据块,并允许快速下载单个文件。由于所有数据都存储为单个文件,因此占用的空间也大大减少。
一个主要的使用示例可以是每周/每日/每小时报告,需要按每个用户访问这些报告。您可能有一个数据湖,在那里存储要分析的文件的ZIP存档。然后,文件名将是要在其上执行查找的ID。对于常规对象,这将为每个用户每个间隔创建一个对象。相反,可以上传给定时间间隔内的所有内容,并通过ID访问单个记录。
无法更新ZIP文件中的单个文件。因此,这应该只用于预期不会更改的数据。如果ZIP文件被覆盖,所有文件都会同时被原子地替换。如果您知道要修改ZIP文件的内容,那么不要使用ZIP文件,而是将文件保存为常规对象。
zip中的文件没有单独的元数据,只有名称和大小。修改时间从父ZIP对象继承。这意味着ILM规则和保留将作为一个整体应用于ZIP对象。
ZIP压缩是次要的,通常建议只对ZIP文件中的文件进行解压缩。这可以在压缩文件时设置。单个文件可以不压缩存储,也可以使用deflate或zstandard进行压缩。
归档文件的字节大小对检索单个文件的响应性几乎没有影响。为了保证每个请求的响应速度,建议将每个zip文件保持在100000个单独文件以下。如果你打算超越这一点,我们建议将你的输入分成几个文件,每个文件的目标是10000个文件。
基准测试显示,对于包含10000个文件的zip文件,每次访问大约需要1ms。这是线性扩展的,因此,假设CPU资源可用,对于100000个文件,每个操作应该额外需要10毫秒。
通过对现有S3API的扩展,可以使用索引ZIP文件。为了确保不会出现意外的副作用,所有的使用都由启用新功能必须存在的标题进行保护。要启用扩展,必须将标题x-minio-extract的值设置为true。
以下API请求类型支持s3zip扩展:HeadObject、GetObject和ListObjectsV2。这将允许在归档文件中列出文件并检索它们。
zip文件中的文件被引用为/prefix/file。zip/file中的zip/path。ext.Zip文件必须具有Zip扩展名,并且Zip文件中的路径用于引用每个文件。
例如,列出作为前缀/file上传的文件中的所有文件。zip发出一个带有前缀/file的GetObject。zip/。请注意,正斜杠是如何表示zip文件中的内容的。前缀、标记和分隔符作为常规ListObjectsV2调用运行。
上传文件是通过常规功能完成的。上传文件不需要特殊操作,但对象键必须以结尾。拉链
要在上传时触发即时索引,可以通过将x-minio-extract头设置为true来触发。如果没有设置,索引将由上面提到的第一个请求创建,该请求检索或列出zip中的文件。
Zip64(4GB以上的zip文件)完全受支持。不支持基于Zip加密的Zip文件。
支持Unicode名称,应使用UTF-8编码。然而,确实存在依赖本地代码页工作的不合规压缩器。如果您计划使用Unicode名称,请检查文件名的解码是否正确。通常建议遵循通用对象键命名准则。
要列出zip文件的内容,请发送包含zip文件的前缀作为前缀,并发送上述标题。例如前缀/文件。zip/将以键前缀/file列出zip文件的所有内容。拉链支持常规ListObjectV2参数,如附加前缀、标记和分隔符。
例如,使用prefix=prefix/file列出。zip/folder/,delimiter=/将只列出指定文件夹中的内容。
为了保持较低的复杂性,有几个限制:必须使用ListObjectV2。每次通话只能列出一个zip文件,并且只能列出zip文件的最新版本。
如上所述,访问单个文件需要一个头和一个路径来指示zip文件和其中的文件。要获取路径,可以使用ListObjectsV2。还可以通过手动将对象路径与zip文件内的路径组合来构造对象名。
单个文件作为单个请求处理。这将以与单独对象相同的速度生成单个文件。如果您需要访问存档中许多文件的内容,下载整个ZIP存档并在本地处理会更快。
mc发布。2022-02-16增加了对远程访问zip文件中文件的支持。具体来说,ls、cp和cat命令支持源为远程zip文件的操作。这些命令有一个“-zip”参数,表示您打算在zip文件上运行该操作。
这仅在远程服务器是以分布式模式运行的MinIO服务器时才起作用。
s3zip功能允许您以紧凑的方式存储许多小文件。这可以很好地替代许多单个对象,从而减少ILM和其他操作的存储开销和处理时间。
与任何扩展一样,通常的警告也适用。虽然从技术上讲,在没有任何服务器端支持的情况下实现本地索引并使用HTTP范围请求来提供类似的功能是可能的,但这需要付出相当大的努力,而且结果不会像我们使用扩展所实现的那样简化。
出于存档目的,此扩展为通过mc命令界面检索很少访问的存档数据提供了一种更节省空间和带宽的方法。这是一种有效的存储日志数据的方法,您只需要偶尔访问这些数据。它可以用于快速上传需要ID快速访问的多个数据段。
考虑使用USERID -GT的每日用户统计数据;json映射。使用常规对象时,可以将其实现为yyyy/mm/dd/user_id/文件。json对象命名。这需要每天为每个用户上传一个对象。
相反,每天可以创建一个zip文件,并且可以通过读取yyyy-mm-dd.zip/user_id.json来查找用户统计数据——这将更快地上传、维护并占用更少的空间——在数据湖中工作时,这一切都是好事。
如果有很多用户,使用确定性拆分方法,比如yyyy-mm-dd/user0-10000。zip/user_id.json将允许将其扩展到数十亿用户,减少5个数量级的对象。
下载MinIO,并利用从ZIP文件中列出和下载单个文件的功能。如果您有任何问题或想告诉我们您正在使用MinIO构建的优秀应用程序,请点击我们[email protected]或者加入Slack社区。