使用S3作为数据库还是数据库(例如MongoDB)

Sim*_*iel 5 amazon-s3 mongodb amazon-web-services

由于设置简单且成本低廉,我正在考虑使用AWS S3存储桶而非NoSQL数据库将简单的用户设置保存为JSON(约30个文档)。

我研究了以下不使用数据库的缺点,这些缺点与我的用例无关:

  • 列出存储桶/文件将花费您的钱。
  • 没有更新-您无法更新文件,只能替换它。
  • 没有索引。
  • 版本控制将花费您$$。
  • 没有搜寻
  • 没有交易
  • 没有查询API(SQL或NoSQL)

使用S3存储桶而不使用数据库是否还有其他缺点?

tho*_*ace 29

背景:我们使用S3一些“数据库”(键/值结构化存储)。

应该注意的是,S3 实际上确实具有搜索功能,并且根据您的数据结构,以S3 Select的形式进行查询(如果您有时间:Athena)。

然而,最大的缺点/架构挑战是 S3 最终是一致的(这实际上是您无法“更新”文件的原因)。这体现在您的架构需要容忍的一些行为中:

  • 操作由键缓存,因此如果您尝试获取不存在的对象,然后创建它 - 在一段时间内*对该对象的任何获取都将返回它不存在。
  • 没有全局缓存,因此您可以在覆盖后的一段时间内获得同一对象的两个不同版本*。
  • 列表操作提供了一个半不稳定的迭代器。如果您要列出正在更新的存储桶中的大量对象,那么您很可能不会在迭代器结束时访问所有对象。

* AWS 故意未定义时间段,但是,从观察来看,它很少超过一分钟。

  • 此问题已得到解决 https://aws.amazon.com/blogs/aws/amazon-s3-update-strong-read-after-write-consistency/ (6认同)
  • “没有全局缓存,因此在被覆盖后,您可以在一段时间内*获得同一对象的两个不同版本。”是什么意思?如果它最终一致,这不应该是可能的吗? (2认同)

Joh*_*ein 8

您正在“考虑使用AWS S3存储桶而不是NoSQL数据库”,但事实是Amazon S3实际上 NoSQL数据库。

这是一个非常大的键值存储。键是文件名,值是文件的内容。

如果您的需求只是“使用此键存储值”和“使用此键检索值”,那么它将很好用!

实际上,由于Amazon.com上的旧订单(已有一年以上)是只读的(无退货,无更改),因此显然已存档到Amazon S3。

尽管比DynamoDB慢,但Amazon S3的存储成本肯定要低得多!

  • 对于像我这样的后期读者,我只想指出成本优势很大程度上取决于有效负载的大小。这是因为 S3 的成本随请求而变化,而 Dynamo 的成本随吞吐量变化。在我自己的场景中(包括点播),对于 4kb 或更少的小有效负载,Dynamo 实际上可以更便宜。您可以使用 https://calculator.aws/#/ 轻松检查这一点 (10认同)