【问题标题】:Amazon S3 - Store timebased filesAmazon S3 - 存储基于时间的文件
【发布时间】:2016-10-31 15:30:01
【问题描述】:

我想使用 S3 对象存储来存储基于时间的数据,每分钟 1 个文件。
目前,这存储在 EBS 上,其中包含年、月、日的文件夹,以及一天中每一分钟的数据文件夹下的文件。
我认为文件系统没有问题,要将文件存储在对象存储上,问题是我是否想“查询”S3 以检索特定的时间间隔,这可能吗?
如果不是,在顶部实现“搜索”功能的最佳方法是什么?
有一个简单的数据库,做精确的文件匹配等吗? 有人有这方面的经验吗?

我将使用 PHP SDK for S3。

【问题讨论】:

    标签: php amazon-web-services amazon-s3 storage


    【解决方案1】:

    Amazon S3 没有“查询”语言。你能做的最好的就是将文件组织成前缀并以此为基础限制结果。

    例如,如果您在 S3 中的对象是:

    年-月-日-时-分-秒.txt

    然后您可以通过以下方式列出对象:

    • 某年:2016-
    • 某月:2016-10-
    • 某一天:2016-10-31-

    使用前缀等等。

    但是您不能在 S3 中执行非常具体的时间范围。如果要根据特定时间范围进行查询,则需要自己收集每日/每月/每年的结果,然后修剪掉要排除的内容。

    例如,如果您想在 10 月 29 日中午 12:01 到 10 月 31 日中午 12:01 之间查询对象,那么您可以从以下前缀收集对象:

    • 2016-10-29-
    • 2016-10-30-
    • 2916-10-31-

    并在您想要的时间范围之前和之后手动删除项目。

    如果您想进行更好的查询,那么您最好使用专为查询设计的数据库。 SimpleDB 可能会工作。 DynamoDB 和 SQL 将起作用。您可以将文件转储到 S3 中,然后在数据库中记录它的对象键和时间戳。

    查询时,从数据库中选择,然后根据需要从 S3 中检索文件。

    更新:使用前缀的示例

    假设您有一堆这样的详细文件:

    2016-10-29-00-00.txt 2016-10-29-00-01.txt 2016-10-29-00-02.txt ... 2016-10-30-00-00.txt 2016-10-30-00-01.txt ... 2016-10-31-00-00.txt ... 2016-11-01-00-00.txt

    等等。

    然后您可以使用前缀进行以下搜索:

    • 要获取 2016 年的所有文件:prefix = "2016-"
    • 要获取 2016 年 10 月以来的所有文件:前缀 = "2016-10-"
    • 要获取 2016 年 10 月 30 日以后的所有文件:prefix = "2016-10-30-"
    • 要获取 2016 年 10 月 30 日 00:00 到 00:59 的所有文件:prefix = "2016-10-30-00"
    • 要获取 2016 年 10 月 30 日 00:05 分钟的所有文件:prefix = "2016-10-30-00-05"

    S3不能做范围搜索,比如:

    • 2016 年 10 月 29 日 12:00 至 2016 年 10 月 31 日 11:59 之间的文件

    相反,您有 2 个选择:

    选项 1:使用前缀从 S3 检索您日期范围内每一天的对象:

    • “2016-10-29-”
    • “2016-10-30-”
    • “2016-10-31-”

    获得该列表后,您可以将它们组合起来,并从您想要的时间范围之前和之后删除文件。

    选项 2:使用前缀从 S3 检索您日期范围内每个月的对象:

    • “2016-10-”

    同样,一旦您有了该列表,您就可以将它们组合起来,并从您想要的时间范围之前和之后删除文件。

    您选择哪个取决于您需要检索的不同天数与按月搜索返回的对象数相比。

    这样做的逻辑会变得相当复杂。一个合适的可搜索数据库可能是值得的。

    【讨论】:

    • 我看到 PHP SDK 在调用 get_object_list() 时有一个 PRCE-String 字段:docs.aws.amazon.com/AWSSDKforPHP/latest/index.html#m=AmazonS3/… 不能用于搜索吗?
    • 没有。 prce 是一个正则表达式,用于过滤从 S3 返回的结果。这不是“搜索”。这是字符串比较。它不会做时间比较。
    • 因此,如果我不为此服务创建单独的“查询”数据库,我需要绝对列出所有对象,然后通过我的应用程序过滤结果?
    • 不是 100% 的所有对象。如果您的“搜索”是针对某个年、月、日、小时等,那么您可以使用前缀来执行此操作(正如我所提到的)。但是如果你想做一个“时间范围”搜索,你需要对get_object_list进行多次前缀调用并自己聚合它们。
    • 如果我在桶中为年月日创建文件夹会怎样?
    猜你喜欢
    • 2021-12-02
    • 2010-12-18
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多