Amazon S3 - 存储基于时间的文件

时间:2016-10-31 15:30:01

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

我想使用S3对象存储来存储基于时间的数据,每分钟1个文件 目前,它存储在EBS上,每天的每一分钟都有一个年,月,日和文件夹下的文件夹。
我认为没有问题文件系统明智,将文件存储在对象存储上,问题是我是否想要查询" S3检索特定的时间间隔,是否可能?
如果不是,那么实施"搜索"的最佳方法是什么?功能在顶部?
有一个simpledb,做精确的文件匹配等? 有没有人有这方面的经验?

我将使用PHP SDK for S3。

1 个答案:

答案 0 :(得分:2)

Amazon S3没有“查询”语言。您可以做的最好的事情是将文件组织成前缀并基于此限制结果。

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

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

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

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

等等使用前缀。

但是你不能在S3内做非常具体的时间范围。如果您想根据特定的时间范围进行查询,那么您需要自己收集每日/每月/每年的结果,然后删除您要排除的内容。

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

  • 2016年10月29日 -
  • 二〇一六年十月三十〇日 -
  • 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月以来的所有文件:prefix =“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之间的文件

相反,您有两个选择:

选项1:使用前缀

在日期范围内的每一天从S3中检索对象
  • “2016年10月29日 - ”
  • “2016年10月30日 - ”
  • “2016年10月31日 - ”

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

选项2:使用前缀

从日期范围内的每个月检索S3中的对象
  • “2016-10 - ”

同样,一旦你有了这个列表,你就可以将它们组合起来,并从你想要的时间范围之前和之后拿走文件。

您选择的内容取决于您需要检索的天数与每月搜索返回的对象数量相比。

这种逻辑会变得非常复杂。一个适当的可搜索数据库可能是值得的。