MongoDb vs Cassandra:读/写神话?

时间:2017-12-25 17:02:33

标签: mongodb cassandra nosql

在网上阅读关于MongoDB与Cassandra读/写性能的几篇文章,

人们普遍认为,当数据非常庞大时,Cassandra的写性能优于Mongo。我在下面的陈述中看到了

  

Cassandra的存储引擎无论如何都能提供恒定时间写入   你的数据集越来越大。在MongoDB中写入更有问题,   部分是因为基于b树的存储引擎,但更多是因为   每个数据库写锁。

以下是我的问题:此声明是否仍然正确?根据我的理解Mongo支持锁定每个文档而不是每个数据库。对?所以目前cassandra在写作方面还比Mongo好吗?如果是的话为什么?

阅读

人们普遍认为Mongo的阅读表现要好于Cassandra,但我没有找到任何理由让Mongo在阅读方面比Cassandra更好?

更新: -

来自this forum的Jared答案

  

MongoDB的存储引擎中的读取效率比它们更高效   卡桑德拉。 Cassandra的存储引擎在写入时表现非常出色   因为它以仅附加格式存储数据。这很有用   旋转磁盘驱动器的寻道时间很短,但可以串行   写得很快。但缺点是当你读书时,你   经常需要扫描几个版本的对象来获取   最新版本返回给调用者。 MongoDB更新数据   地点。这意味着在处理写入时它会执行更多随机IO,   但它具有处理读取时更快的好处,因为   您可以在一个b树中找到磁盘上对象的确切位置   查找。

它帮助我理解Cassandra在现有记录上删除/编辑时速度更快,因为它必须最后添加它而不是像Mongo那样必须首先搜索然后编辑它的编辑。这使得cassandra在编写方面比Mongo更好

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

另一个原因是blog为什么cassandra写得更好

  

MongoDB及其“单主”模型只能在其上进行写入   主。辅助服务器只能用于读取。所以   基本上如果你有三个节点副本集,只有主节点   写入和其他两个节点仅用于读取。这个   极大地限制了写入可伸缩性您可以部署多个分片   基本上只有1/3的数据节点可以进行写操作。卡桑德拉   使用“多主”模型可以在任何服务器上进行写入。   基本上,您的写入可伸缩性受服务器数量的限制   你在群集中。您在群集中拥有的服务器越多,即   它会更好地扩展。

同样的blog为什么Mongo比Cassandra更好阅读

  

辅助索引是MongoDB中的第一类构造。这使得   很容易索引存储在MongoDB中的对象的任何属性,即使   它是嵌套的。这使得基于这些查询非常容易   二级指标。卡桑德拉只是粗略支持中学   索引。二级索引也仅限于单列和   平等比较。如果你大部分时间都要去查询   主键然后Cassandra将很适合你。

1 个答案:

答案 0 :(得分:2)

问题答案: 是。最新的mongoDB支持每个文件锁https://docs.mongodb.com/manual/core/wiredtiger/

以下是写操作的基准:https://www.datastax.com/nosql-databases/benchmarks-cassandra-vs-mongodb-vs-hbase 根据这些基准 cassandra在规模上表现更好(在群集中更多节点上)

希望它会对你有所帮助。

以下是有关您的问题的一些细节,也可能有所帮助

关于Cassandra

Cassandra正在使用针对重写优化的LSM树。 https://docs.datastax.com/en/cassandra/2.1/cassandra/dml/dml_manage_ondisk_c.html

一些细节

执行写入时,数据会立即写入提交日志。提交日志是一种崩溃恢复机制。在将写入写入提交日志之前,写入不会被视为成功。 将数据写入提交日志后,将其写入memtable。在最新版本的Cassandra中,memtables主要存储在本机内存中,而不是存储在JVM堆中。所以它也提高了性能。

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

向Cassandra写入值不需要任何读取或搜索,因为所有写入都是追加操作。

关于MongoDB

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

关于锁: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/