DynamoDB与MongoDB NoSQL比较

195

我正在尝试找出未来项目可以使用什么,我们计划在第一年存储约 500k 条记录,可能在接下来的几年中还会有更多,这是一个垂直应用程序,因此无需为此使用数据库,这就是我决定选择 NoSQL 数据存储的原因。

我脑海中首先想到的选择是 MongoDB,因为它是一个非常成熟的产品,得到了社区的大力支持,但另一方面,我们也有一个全新的产品,提供了顶级性能的托管服务,我将开发这个应用程序,但暂时没有维护计划,所以我认为这将是一个巨大的优势,因为亚马逊提供了弹性扩展的方式。

我最担心的是查询结构,我还没有看过 DynamoDB 的查询功能,但由于它是一个 k/v 数据存储,我觉得它可能比 MongoDB 更加有限。

如果有人有从 MongoDB 迁移到 DynamoDB 的经验,请提供建议,将不胜感激。


4
如果你想获得关于查询结构的建议,我建议您提供一个模式的例子以及访问数据的用例。如果没有这些信息,很难做出判断是否适合。 - James Wahlin
实际上,您查询数据的方式可能会极大地影响后端数据库的选择。我的第一个问题是多层次的程度会如何。 - zanlok
3
我很惊讶这个问题还没有被 SO 的高级人员关闭。通常,寻求建议的问题会被关闭,因为它们并没有针对一个非常具体的问题寻求帮助。 - Mr. Lance E Sloan
7个回答

176

我知道这个问题很老了,但当你搜索比较时它仍然会出现。我们曾经使用Mongo,现在几乎完全转向Dynamo,它是我们的首选。不是因为它有更多功能,事实上它没有。Mongo有更好的查询语言,你可以在结构内进行索引,还有许多细节。 Dynamo的优越性在于OP在他的评论中所述:它很容易上手。你不必去管任何服务器。当你开始设置Mongo分片解决方案时,情况变得复杂。你可以去其中一个托管公司,但那也不便宜。对于Dynamo,如果你需要更高的吞吐量,你只需要点击一个按钮。你可以编写脚本自动扩展。当需要升级Dynamo时,它会为你完成。这样可以省下很多宝贵的精力和时间。如果没有专门的运维人员,Dynamo是非常好的选择。

所以我们现在默认使用Dynamo。如果数据结构足够复杂,可能会用到Mongo,但那样的话我们可能会回到SQL数据库。 Dynamo很难理解,你真的需要考虑如何去构建它,而且很可能你会使用Elasticcache中的Redis来处理复杂的内容。但是不必担心维护它,你只需要关注编码就可以了。


41
如果必须将数据库与数据库进行比较,那么必须只比较数据库功能。托管解决方案不是数据库功能。如果你正在寻找托管的MongoDB,可以选择MongoHQ,他们会处理所有你可能想要避免的繁琐工作,让你专注于核心工作。 - Kabeer
13
尽管我们最初进行的成本比较显示发电机是一个非常划算的选择,但这是真实的。另一个问题是,如果您需要调整发电机的规模,只需点击一下按钮即可完成。如果您需要添加磁盘或调整Mongo服务器的大小,则会涉及停机时间,无论是您自己还是其他人操作。 - CargoMeister
5
@Kabeer,从技术上讲我完全同意你的观点,但在现实世界中,整个方案都很重要,以做出商业决策。最终,这是一个商业决策。 - poitroae

65

有 50 万份文件,没有理由进行任何扩展。一台配备 SSD 和 8GB 内存的典型笔记本电脑可以轻松处理数千万条记录,因此如果选择是为了扩展,您的选择并不重要。我建议您选择您最喜欢的,并可能在哪里可以找到最多的在线支持。


是的,我的主要关注点是关于扩展和长期维护,老实说,我个人认为MongoDB可以胜任这项工作,我只是在考虑中长期维护方面。 - pedrommuller
11
德里克,规模中的另一个重要因素是利用率,不仅仅是文档数量或数据库大小。@jack 不要“感觉”,而是依赖测试,包括最终部署的平台和硬件;花一周时间将几个数据库变体填充数据并进行基准测试应该能够带来明智的决策,避免很多痛苦。 - zanlok
3
提供专业的产品/服务远不止于简单的“这个可以做那个”的解决方案。仅仅因为一个廉价的机器可以运行Linux、MongoDB和数百万条记录,几乎不需要花费任何费用,这并不等同于在实际世界中具有出色的性能表现。对于具有简单模式的500K条记录来说,DynamoDB可能是一个不错的选择,因为用户不需要支付维护成本(至少是硬件成本),而每月的费用可能远远低于购买一台服务器的成本,其持续时间可能为一两年。 - cbmeeks

23

3
谢谢提供链接!我以前没访问过db-engines.com,这是个不错的网站! - Tom Hert

16
简短回答:从SQL开始,只有在必要时才添加NoSQL。(除非您不需要超出非常简单的查询之外的任何内容)
个人经验:我没有使用MongoDB进行查询,但截至2015年4月,DynamoDB在除了最基本的键/值查询之外的任何事情上仍然非常受限。我喜欢它的基本功能,但如果您想要查询语言,那么请考虑使用真正的SQL数据库解决方案。
在DynamoDB中,您可以查询哈希或哈希和范围键,并且可以拥有多个辅助全局索引。我正在对一个具有4个可能过滤参数的单个表进行查询,并对结果进行排序,这是通过使用带有过滤表达式的全局辅助索引来支持的(勉强)。问题在于当您尝试获取与过滤器匹配的总结果时,您不能仅搜索与过滤器匹配的前10个项目,而是它检查10个项目,您可能会得到0个有效结果,迫使您不断重新扫描继续键——非常麻烦,并且消耗了您的表读取配额,适用于简单场景。
具体来说,关于查询中过滤器的限制问题,这是来自文档(http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#ScanQueryLimit)的内容:
在响应中,DynamoDB返回在Limit值范围内的所有匹配结果。例如,如果您发出带有Limit值为6且没有过滤表达式的查询或扫描请求,则操作将返回与请求参数匹配的表中的前六个项目。如果还提供了FilterExpression,则操作将返回表中前六个项目中符合过滤要求的项目。
我的结论是,涉及FilterExpressions的查询仅在非常罕见的情况下可用,并且不可扩展,因为每个查询都可以轻松读取大部分或全部表格,这会消耗过多的DynamoDB读取单位。一旦使用了太多的读取单位,您将被限制并看到性能不佳。
专家意见:在2015年4月9日的AWS峰会上,AWS解决方案架构经理Brett Hollman在他关于扩展到您的前1000万个用户的演讲中主张从SQL数据库开始,只有在必要时才使用NoSQL。因为迟早你可能需要在堆栈中某个地方使用SQL服务器。他的幻灯片在这里:http://www.slideshare.net/AmazonWebServices/deep-dive-scaling-up-to-your-first-10-million-users,请参见第28张幻灯片。

你真的应该看看如何轻松地将CloudSearch与DynamoDB Streams和Lambda集成,以实现全文或基于位置的查询。 - MrTJ
5
根据您的需求选择数据库。这不是在SQL和noSQL之间做出选择,而是在面向文档的数据库、面向图形的数据库、键值对数据库、关系型数据库等之间做出选择。没有一种完美的选择,SQL也不是。 - vcarel

15
我们选择使用Mongo/Dynamo的组合来开发医疗保健产品。基本上,Mongo允许更好地搜索,而托管的Dynamo非常出色,因为它符合HIPAA标准而无需额外工作。因此,我们在标准设置中托管Mongo部分,并允许亚马逊处理基础设施方面的HIPAA部分。我们可以从Mongo中查询特定项,这将带来具有可关联Dynamo文档指针(ID)的文档。
我们之所以选择使用Mongo来实现这一点,而不是在Dynamo上托管整个应用程序,原因有两个。首先,我们需要进行基于位置的搜索,而Mongo非常擅长,而当时的Dynamo却不太行,但现在他们有了这个选项。
其次,有些文档是非结构化的,而我们事先不知道数据会是什么样子,例如,用户a在“form”集合中输入了一个文档,如此{"username": "user1", "email": "me@me.com"}。另一个用户在同一集合中放置了这个{"phone": "813-555-3333", "location": [28.1234,-83.2342]}。使用Mongo,我们可以随时搜索任何这些动态和未知字段,而使用Dynamo,您可以做到这一点,但每次添加新的可搜索字段时都必须建立索引。因此,如果您以前从未在Dynamo文档中添加电话字段,然后突然有人添加它,它将完全无法搜索。
现在这又引出了另一个问题,就像您所提到的那样。有时选择正确的解决方案并不总是意味着选择最好的产品来完成工作。例如,您可能有一个客户需要使用您创建的系统10年以上。选择足以完成工作的SaaS/IaaS解决方案可能是更好的选择,因为您可以依赖亚马逊在长时间内保持和维护他们的系统。

12

我既用过MongoDB也用过DynamoDB。

但你需要了解什么时候使用哪个以及出于什么目的。

我认为全部转移到DynamoDB并不是一个好主意,因为DynamoDB查询除了主键和次键外很困难,索引有限且在DynamoDB中扫描非常痛苦。

我会选择一种混合类型的数据库,在其中包含应该使用MongoDB的广泛可查询数据,凭借其所有功能,您永远不会感到受到限制以提供增强或修改。

DynamoDB非常快速(比MongoDB更快),因此在可扩展的应用程序中,DynamoDB通常被用作会话的替代方案。 DynamoDB最佳实践还建议,如果有大量不常使用的数据,请将其移动到其他表中。

因此,假设您有文章或信息源。人们更有可能寻找上周或本月的内容。访问两年前的数据的机会非常罕见。为这些目的,DynamoDB更喜欢按月或年在不同表格中存储数据。

DynamoDB无需缝扩展,这是您必须在MongoDB中手动完成的操作。但是,如果不了解吞吐量分区和缩放背后的工作原理,您将损失DynamoDB的性能。

DynamoDB应该用于速度至关重要的地方,而MongoDB则具有太多的特点和功能,这是DynamoDB所缺乏的。

例如,您可以在MongoDB中拥有一个副本集,其中一个副本保存8(或其他)小时旧的数据实例。如果您在数据库中出了大问题并且想要获取之前的数据,则非常有用。

这就是我的意见。


1
Redis和MongoDB的组合?太棒了,我认为。 - ismaestro
我想是这样,虽然我没有Redis的实际经验,但它肯定因其性能而被广泛使用,基于内存的数据库几乎总是比基于磁盘的数据库表现更好。因此,我认为需要在巨大需求和高频率下访问的数据应该放入Redis中。另一方面,对于大型缓慢数据应该使用MongoDB。 - Rahul Kumar

7
请记住,我只是尝试过MongoDB...
根据我的阅读,DynamoDB 在功能方面已经取得了长足的进步。它曾经是一个超级基本的键值存储,具有极其有限的存储和查询能力。它现在已经发展壮大,支持 更大的文档大小+ JSON支持全局二级索引。随着时间的推移,DynamoDB 和 MongoDB 在功能上的差距越来越小。DynamoDB 的新功能在 这里 进行了扩展。
许多MongoDB与DynamoDB的比较已经过时,因为DynamoDB最近增加了一些功能。然而,这篇文章提供了一些其他令人信服的理由选择DynamoDB,即它简单、低维护,并且通常成本较低。另一个讨论数据库选择也很有趣,尽管有点陈旧。
我的结论是:如果你正在进行严格的数据库查询或使用DynamoDB不支持的语言,请使用MongoDB。否则,坚持使用DynamoDB。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接