MongoDB与Cassandra:读写神话?

17

阅读了几篇关于MongoDB与Cassandra读/写性能的文章。

一般来说,当数据非常巨大时,Cassandra的写入性能比MongoDB更好。如下所述:

Cassandra的存储引擎提供恒定时间的写入性能,无论您的数据集增长多快。在MongoDB中,由于基于B树的存储引擎以及每个数据库的写入锁定,写入更为麻烦。

我的问题是: 这个说法现在仍然正确吗?根据我的理解,MongoDB支持按文档而不是按数据库进行锁定,对吗?那么现在Cassandra在写入性能方面是否仍然优于MongoDB?如果是,为什么呢?

读取

一般来说,MongoDB的读取性能优于Cassandra,但我没有找到任何解释,说明MongoDB的读取性能为什么优于Cassandra。

更新:

根据Jared在这个论坛上的答案:

MongoDB的存储引擎比Cassandra更高效。Cassandra的存储引擎在写入方面表现非常出色,因为它以追加方式存储数据。这充分利用了具有较差寻址时间但能够快速执行串行写入的磁盘驱动器。但缺点是,在进行读取时,您通常需要扫描对象的几个版本才能获取最新版本并返回给调用者。MongoDB会就地更新数据。这意味着在处理写入时,它会执行更多的随机IO,但在处理读取时,由于可以通过一个B-tree查找找到磁盘上对象的精确位置,所以读取速度更快。

它帮助我理解Cassandra在删除/编辑现有记录时更快,因为它只需将其附加到末尾,而不是像Mongo一样的原地编辑,需要先搜索然后再进行编辑。这使得Cassandra在写方面比Mongo更好。

但是同样的事情使得Mongo比Cassandra更慢,因为Cassandra必须扫描几个版本的相同记录以获取最新版本才能返回给调用者。

另一个来自blog的原因表明Cassandra在写方面更好。

MongoDB采用“单主”模型,只能在主服务器上进行写入。辅助服务器只能用于读取。因此,如果您有三个节点的副本集,只有主服务器正在进行写入,其他两个节点仅用于读取。这大大限制了写扩展性。您可以部署多个分片,但基本上只有1/3的数据节点可以进行写入。Cassandra采用“多主”模型,可以在任何服务器上进行写入。基本上,您的写扩展性受到群集中服务器数量的限制。群集中的服务器越多,它的扩展性就越好。

从同一blog中可以看到Mongo在读方面优于Cassandra。

二级索引是MongoDB中的一级构造。这使得即使嵌套在MongoDB中存储的对象的属性也很容易进行索引。这使得基于这些二级索引查询变得非常容易。Cassandra仅对二级索引提供了粗略的支持。二级索引还受限于单个列和相等比较。如果您主要将按主键查询,则Cassandra将适合您。

1个回答

8

问题的答案是:是的,最新版本的MongoDB支持文档级别的锁定https://docs.mongodb.com/manual/core/wiredtiger/

以下是写操作的基准测试:https://www.datastax.com/nosql-databases/benchmarks-cassandra-vs-mongodb-vs-hbase 根据这些基准测试,在规模较大的集群中Cassandra表现更好(在集群中节点数量较多时)。

希望这可以帮助你。

以下是关于你的问题的一些详细信息,这也可能有所帮助。

关于Cassandra

Cassandra使用LSM-tree进行优化以处理大量写入。 https://docs.datastax.com/en/cassandra/2.1/cassandra/dml/dml_manage_ondisk_c.html

一些细节:

执行写操作时,数据会立即写入提交日志。提交日志是一种崩溃恢复机制。只有在写入提交日志后,写操作才被视为成功。 数据写入提交日志后,会写入内存表。在Cassandra的最新版本中,内存表大多存储在本地内存中而不是JVM堆中。因此它也提高了性能。

当存储在内存表中的对象数量达到阈值时,内存表的内容会被刷新到名为SSTable的磁盘文件中。然后创建一个新的内存表。一旦将内存表刷新到SSTable中,它就是不可变的。

对于向Cassandra写入值,不需要进行任何读取或查找,因为所有写入都是追加操作。

关于MongoDB

默认情况下,MongoDB使用MMAPv1存储引擎,该引擎使用B树(https://docs.mongodb.com/manual/core/mmapv1/),但MongoDB的最新版本使用WiredTiger存储引擎(https://docs.mongodb.com/manual/core/wiredtiger/),该引擎也支持LSM-tree。

关于锁定:WiredTiger MongoDB支持文档级别的锁定,但MMAPv1仅支持集合级并发控制。

一些有用的文章:
https://dba.stackexchange.com/questions/121160/mongodb-mmapv1-vs-wiredtiger-storage-engines
https://docs.mongodb.com/manual/faq/concurrency/
https://www.percona.com/blog/2016/01/06/mongodb-revs-you-up-what-storage-engine-is-right-part-1/

这里有一个纠正/澄清:自 MongoDB 3.2(约2年前发布)以来,默认存储引擎已经是 WiredTiger(请参阅 https://docs.mongodb.com/manual/core/storage-engines)。 - IanWhalen
3
MongoDB在读取性能上比Cassandra快的原因是什么? - emilly
@emilly MongoDB有B树(最新版本有WiredTiger,它又是B+树)。在这里阅读其时间复杂度https://en.wikipedia.org/wiki/B%2B_tree 而Cassandra使用LSM树。在这里阅读其时间复杂度https://en.wikipedia.org/wiki/Log-structured_merge-tree 这些数据结构的工作方式定义了这些数据库的特性。 - pankaj

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