存储众多小文件(在S3上)?

9
我每天需要存储200-300GB的数据,这些数据包括2百万个压缩后的HTML文件(100-150KB)。其中,热数据(70-150百万个)会被定期访问,而其他老数据则很少被访问。标准存储的费用是每GB $0.023,而Glacier的费用为每GB $0.004。尽管Glacier很便宜,但它也有额外的费用,将2百万个文件直接放入Glacier不是一个好主意,因为它还需要涉及以下费用:PUT requests to Glacier $0.05 per 1,000 requestsLifecycle Transition Requests into Glacier $0.05 per 1,000 requests。是否有一种方法可以将这些文件粘合在一起,但仍然保持单个文件可访问的状态?

存储为单个ZIP文件以节省存储空间。访问时,解压缩ZIP并提供一个文件。 - Justinas
1
@Justinas 这意味着这些文件将无法单独访问。 - Buffalo
它将通过代理服务。 - Justinas
1
无论你最终做什么,如果你创建了一个大的归档文件,你最终需要从冰川中获取整个文件,然后你可以使用字节范围请求来拉取其中的部分。此外,从冰川中检索文件需要时间,在某些情况下需要数小时。个人建议考虑标准IA,并创建一个具有内容头的定制归档格式,以便您可以使用字节范围请求来读取头部,然后在确定数据位置后获取数据。也许将检索复杂性包装在Lambda中,这样客户端就不需要知道发生了什么。 - Anon Coward
冰川的费用是您所写的0.004美元。但是您不能使用深度存档,其费用要少4倍(0.00099美元)吗? - Marcin
3个回答

5

重要的一点是,如果你需要快速访问这些文件,那么Glacier可以在最多12小时内让你访问到该文件。因此,最好使用S3标准-不经常访问(每GB 0.0125美元,毫秒级访问),而不是S3标准。对于一些不常用的数据,也许可以使用Glacier。但这仍取决于您需要多快获取这些数据。

基于以上建议,我建议您:

  • 由于html(文本)文件具有很好的压缩水平,您可以将历史数据压缩为大型zip文件(每日、每周或每月),这样它们可以拥有更好的压缩效果;
  • 创建一些索引文件或数据库以知道每个html文件存储在哪里;
  • 从归档中仅读取所需的html文件,而无需解压整个zip文件。参见python示例了解如何实现此操作。

你说得完全正确,问题在于对这些文件进行索引。 - Buffalo
@Buffalo,现在您可以接受这个答案了。 - wowkin2
只要有人回答“是否有一种方法将文件粘合在一起,但仍然可以单独访问它们”,我就会立即回复。因为下载巨大的压缩包不是一个选择。 - Buffalo

3

在涉及到大量文件的情况下,Glacier非常注重成本。最好的方法是创建一个Lambda函数,为您处理zip、unzip操作。

考虑以下方法:

  • Lambda按小时创建当天的200万个文件的archive_date_hour.zip,通过创建24个巨大的归档文件来解决“每个对象”的成本问题。
  • s3存储桶上设置一个policy,将超过1天的已过期对象移动到Glacier。
  • 使用解压缩Lambda函数从zip文件中提取潜在的热门项目,并从Glacier存储桶中获取它们。
  • 将主要的s3存储桶用于高频访问的热文件,作为zip/unzip操作的工作目录,并收集新文件。

2

你的文件太小了。你可能需要将它们合并到 ETL 管道(如 Glue)中。你也可以使用 Range 头部,例如 -range bytes=1000-2000,以便在 S3 上下载对象的一部分。

如果这样做,你需要找出跟踪字节范围的最佳方式,例如在组合文件后记录每个文件的范围,并更改客户端以使用 range

然而,正确的方法取决于数据的访问方式和模式识别。如果查看 TinyFileA 的人也会查看 TinyFileB,那么你可以将它们合并在一起,并将它们与其他他们可能使用的文件一起发送。我建议找出有意义的文件逻辑分组,以减少消费者需要的请求数量,同时不发送太多无关的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接