MongoDB与Cassandra的比较


738

我正在评估什么是最好的迁移选项。

目前,我在分片的MySQL(水平分区)上,我的大部分数据存储在JSON Blob中。我没有任何复杂的SQL查询(自从对数据库进行分区以来,已经迁移了)。

现在,似乎MongoDB和Cassandra都是可能的选择。我的情况:

  • 每个查询中的读取次数很多,常规写入的次数更少
  • 不担心“大规模”的可扩展性
  • 更关注简单的设置,维护和代码
  • 最小化硬件/服务器成本

4
提供了官方的性能基准统计数据。Cassandra vs MongoDB vs HBase
Ravi

1
>在每个查询中读取很多,但不经常写入=>查找CQRS(将读取与写入分开,可能没有事件源,但请检查是否可以更新读取模型异步..同步是否也可以工作..这取决于您的使用-cases)
bodrin

2
实际上,这是一个很大的问题。我想知道是否有更新的版本吗?这个现在已经很老了
slashdottir '18

Answers:


584

每个查询中的读取次数很多,常规写入的次数更少

在热数据集适合内存的情况下,两个数据库在读取时均表现良好。两者都强调无连接数据模型(并鼓励使用非规范化),并且都提供文档的索引,尽管MongoDB的索引目前更灵活。

无论数据集有多大,Cassandra的存储引擎都可以提供恒定时间的写入。在MongoDB中,写入问题更多,部分原因是基于b树的存储引擎,而更多原因是由于其执行了多粒度锁定

对于分析,MongoDB提供了自定义的map / reduce实现;Cassandra提供了本地Hadoop支持,包括对Hive(基于Hadoop映射/减少构建的SQL数据仓库)和Pig(一种特定于Hadoop的分析语言,许多人认为比SQL更适合于映射/减少工作负载)的支持。Cassandra还支持使用Spark

不担心“大规模”的可扩展性

如果您正在查看单个服务器,则MongoDB可能更合适。对于那些更关心扩展的人来说,Cassandra的无单点故障体系结构将更易于设置且更可靠。(MongoDB的全局写锁定也将变得更加痛苦。)Cassandra还对复制的工作方式进行了更多控制,包括对多个数据中心的支持。

更关注简单的设置,维护和代码

两者都很容易设置,并且单个服务器具有合理的现成默认值。Cassandra在多服务器配置中更容易设置,因为不需要担心特殊角色节点。

如果您当前使用的是JSON Blob,则MongoDB非常适合您的用例,因为它使用BSON来存储数据。与现有数据库相比,您将拥有更多,更可查询的数据。这将是Mongo最重要的胜利。


86
完全不同,注释不够大,但是... Cassandra是线性可伸缩(摊销的恒定时间读写)dynamo / google bigtable混合函数,具有快速写入功能,而与数据大小无关。它的功能集非常简单,几乎没有有序键值存储的功能集。MongoDB是功能强大(且快速)的文档存储,其代价是耐用性并保证写入持续存在(因为它们不会立即写入磁盘)。他们是有着不同思想的不同野兽,MongoDB更接近于RDMS的替代者……
Michael 2010年

28
虽然Cassandra的级别较低,但允许进行超级缩放(请参阅Twitter / Digg / Facebook),但是由于不允许灵活的查询,因此您将必须谨慎地布局数据,构建二级索引等。
迈克尔

11
因为每个人都在这里提到有关Cassandra的twitter:他们没有使用Cassandra来保留推文,所以这里仍然使用MySQL(engineering.twitter.com/2010/07/cassandra-at-twitter-today.html)。好的,但是我可以想象他们仍然在Cassandra中存储了许多其他用途的数据。
H6。

7
看来全局写锁定可能已在Mongo 2.2中删除了……
马特·法默

16
甚至在我的项目上线之前,我就感到Mongodb的痛苦。热备份是基本要求。要在Linux服务器上进行热备份,您必须首先设置一个LVM分区(不太常见)并在每个备份会话之前进行快照。另一个简单的方法是使用Mongodb付费备份服务。但是,该服务非常昂贵(2.3美元/ GB /月)。很快,您将需要一个副本集以实现容错功能。使用开源版本时,节点只能以明文形式交换数据。对于SSL,您必须使用企业版。那是10,000 $。再见Mongodb。将我的代码重构为Cassandra。
Karthik Sankar 2014年

146

我已经在过去6个月中广泛使用了MongoDB,构建了分层数据管理系统,并且我可以保证设置的简便性(安装,运行,使用!)和速度。只要您仔细考虑索引,它绝对可以在速度方面尖叫。

我认为,由于MonsDB团队正在那里进行奇偶校验,尽管Cassandra用于Twitter等大型项目,但具有更好的扩展功能。我应该指出,在试运行阶段我没有使用过Cassandra,因此我无法透露细节。

在评估NoSQL数据库时,对我来说真正的摇摆人是查询-Cassandra基本上只是一个巨大的键/值存储,而查询有点古怪(至少与MongoDB相比),因此为了性能,您必须复制大量数据作为一种手动索引。另一方面,MongoDB使用“示例查询”模型。

例如,假设您有一个包含用户的集合(MongoDB相当于RDMS表)。MongoDB将记录存储为文档,基本上是二进制JSON对象。例如:

{
   FirstName: "John",
   LastName: "Smith",
   Email: "john@smith.com",
   Groups: ["Admin", "User", "SuperUser"]
}

如果要查找所有具有管理员权限的史密斯用户,只需创建一个新文档(在管理控制台中使用Javascript,或在生产中使用您选择的语言):

{
   LastName: "Smith",
   Groups: "Admin"
}

...然后运行查询。而已。添加了用于比较,RegEx过滤等的运算符,但是它们都非常简单,并且基于Wiki的文档非常好。


54
更新(2011年8月8日):亚马逊的爱尔兰EC2数据中心昨晚发生了与闪电相关的事件,在整理我们的服务器恢复过程中,我发现了一个非常关键的观点:如果您有两台服务器的复制集(它们(易于设置),请确保您有一个Arbiter节点,因此,如果其中一个发生故障,则另一个节点不会死机并停在辅助模式下!相信我,使用大型数据库进行整理是一件令人费解的事情。
理查德·K。

8
要添加@Richard K所说的内容,当副本集中的偶数个节点(主节点+次节点)时,您应该有一个仲裁节点。
Amareswar

在要对数据分析进行更多聚合时,请考虑mongodb。
user1503117

As long as you think about indexes carefully, it can absolutely scream along, speed-wise.等到您的物理内存已满并且操作系统开始页面错误大声笑
sturcotte06 '19

117

为什么要在传统数据库和NoSQL数据存储之间进行选择?同时使用!NoSQL解决方案的问题(超出了最初的学习曲线)是缺少事务-您对MySQL进行所有更新,并让MySQL填充NoSQL数据存储以进行读取-然后,您将从每种技术的优势中受益。这确实增加了更多的复杂性,但是您已经拥有MySQL方面-只需添加MongoDB,Cassandra等即可。

在其他方面相同的情况下,NoSQL数据存储区的扩展方式通常比传统DB更好,这是有原因的,原因是Facebook,Twitter,Google和大多数初创企业都使用NoSQL解决方案。不仅仅是极客们对新技术的重视。


8
我完全同意。我正在设计的即将推出的产品之一中使用mongodb + mysql。这是即将到来的金融产品云。在绝对需要事务处理功能的地方使用mysql。mongodb用于存储非计算复杂的数据结构,只需要在需要时将其上拉即可。到目前为止工作良好。:)
Ram on Rails-n-React

我在大多数项目中也使用了这种双重方法,在其他一些项目中,NFS挂载文件系统与PostgreSQL一起用于在某些情况下接近1 Gb的地震波。路径是对键值数据库的一种查询。
2014年

1
这是一个链接,指向我问过一个有关如何同时构造 sql和nosql数据库的问题:dba.stackexchange.com/questions/102053/…我可能会用到一些见解
j将于

他已经从交易中
永久

1
如果您的数据是分布式的,那么这不是一个好的解决方案
Esteban Verbel

60

我可能会变得很奇怪,但是我认为您需要继续使用MySQL。您尚未描述需要解决的实际问题,即使对于blob / json数据,MySQL / InnoDB还是一个出色的存储后端。

一旦意识到没有使用RDBMS的所有功能,Web工程师通常会尝试使用更多的NoSQL。仅仅这不是一个好理由,因为大多数NoSQL数据库通常具有相当差的数据引擎(MySQL称为存储引擎)。

现在,如果您不是那种人,请指定MySQL 缺少的内容,然后在其他数据库中寻找(例如,自动分片,自动故障转移,多主复制,较弱的数据一致性保证)。集群以更高的写入吞吐量获得回报等)。


13
他正在使用分片,这意味着他的数据在服务器之间进行了手动分区。Mongodb可以使分片自动化,这可能是一个好处。
fabspro

18
他还将大部分JSON Blob存储在RDBMS中-使关系设计(功能)无用。
Damir Sudarevic

4
数据模型和自动分片的确是不同的,但选择一个数据库时,你需要看看存储引擎第一,和花里胡哨的其余第二。在负载高峰期间,存储引擎将如何执行?自动分片功能在数据流入高峰时将如何执行?在将控制权交给这些重要方面之前,最好确保它能够执行此任务。
Kostja

7
关系模型是经过深思熟虑,最有效地实现的,节俭的数据模型之一。“使关系设计特征无用”可能与约束,触发器或参照完整性有关,但这些都是按使用付费的。
Kostja

20

我没有用过Cassandra,但是我用过MongoDB并认为它很棒。

如果您经过简单的设置,就是这样:您只需解压缩MongoDB并运行mongod守护程序,就可以了……它正在运行。

显然,这只是一个入门者,但是让您入门很容易。


22
AFAIK,同样适用于Cassandra。解压缩,运行守护程序。测试集群已设置好并可以投入生产!
ass 2015年

13

昨天我在mongodb上看到了一个演示文稿。我可以肯定地说安装是“简单的”,就像拆包然后启动一样简单。做完了

我相信mongodb和cassandra都可以在几乎所有常规linux硬件上运行,因此您在该领域应该不会遇到太多障碍。

我认为,在这种情况下,归根结底,这取决于您个人感觉更舒适,以及拥有更喜欢的工具集。就在mongodb上的演示而言,演示者指出mongodb的工具集非常轻巧,并且没有很多(他们说的真的)类似于MySQL的工具。当然,这就是他们的经验,所以YMMV。我对mongodb感兴趣的一件事是它似乎有很多语言支持(Python和.NET是我主要使用的两种语言)。

使用mongodb的网站列表令人印象深刻,而且我知道twitter刚切换到使用cassandra。


4
归根结底,这是苹果与橙子的比较。这两个数据库都有各自的优势。这里需要考虑一些事情-对象模型,二级索引,可写性,高可用性等。在这里有一篇博客文章,解释了mongodb和cassandra之间的高级策略差异-scalegrid.io/blog/cassandra-vs-mongodb
Dharshan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.