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