我需要在AWS S3中存储数百万个小JSON对象(每个大约2,500个字节),我需要能够以三种不同的方式检索它们:
对象键将按时间戳组织,因此按时间戳范围检索对象将非常快。此外,共享相同时间戳(例如,相同分钟)的对象可以连接成每行包含一个JSON对象的单个S3对象。组合可以提高写入性能,并且可以与EMR和Athena很好地配合使用。
然而,通过ID检索将是非常慢的。我需要一种相对快速地检索大量ID的方法,例如检索100,000个对象的时间戳(给定100,000个ID的列表),而不扫描整个数据集的有效负载。
在这种情况下,哪种AWS服务可以提供索引S3内容的最佳方法?
答案 0 :(得分:1)
问题肯定是基于意见的边缘。我不会冒险宣称这是最佳解决方案,但它是问题的“哪个AWS服务”方面的范围内的可行的解决方案:RDS for MariaDB是我用于这个目的的确切目的,S3> SNS> Lambda事件在RDS上维护索引,包括从S3查找对象元数据并存储,正确规范化和索引。
原因S3> SNS> Lambda而不仅仅是S3> Lambda是我将SNS主题展示给Lambda和SQS队列,该队列由“第二次查看”审核过程读取,该过程验证所有内容都已正确捕获。
这仍然是有限的生产用途,所以我的大部分存储桶还没有配置......但到目前为止,我在t2.micro RDS机器上索引了11,803,039个对象,到目前为止它没有任何问题......所以它非常可敬而且不贵。
答案 1 :(得分:1)
在发布此问题后的10个月内,我尝试使用DynamoDB,并在基于MySQL的解决方案上挣扎了一段时间,该解决方案甚至投入生产但存在稳定性问题。最后我有时间重构并得出了一个我最初没有考虑过的解决方案:将索引存储为S3本身的gzip' d JSON文件,并将它们缓存在需要使用的客户端中查询索引。显然,需要考虑数据延迟等方面的一些要求,但一般来说,我发现这种方法在原始问题中描述的用例中是最简单的,具有合理的性能。
答案 2 :(得分:0)
任何数据库都适用于此。亚马逊的DynamoDB数据库可以很好地工作,因为您不必管理服务器。只要将新文件添加到存储桶,您就可以让S3向AWS Lambda函数发送事件通知。然后,Lambda函数可以解析文件以获取需要在DB中存储和索引的信息,然后将其插入到DynamoDB表中。从那里,只要您需要从S3检索文件,就可以通过ID或时间戳范围查询DynamoDB表。