【问题标题】:MongoDb vs Cassandra:Read/Write myths?MongoDb vs Cassandra:读/写神话?
【发布时间】:2018-06-06 19:43:18
【问题描述】:

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

一般来说,Cassandra 的写入性能在数据量很大的情况下比 Mongo 的要好。请参阅下面的声明。

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

这是我的问题:- 这个陈述仍然正确吗?据我了解,Mongo 支持每个文档而不是每个数据库的锁定。正确的?那么目前Cassandra在写性能上还是比Mongo更好吗?如果是,为什么?

阅读

一般来说,Mongo 的读取性能比 Cassandra 好,但我没有找到任何理由让 Mongo 的读取性能优于 Cassandra 的?

更新:-

来自 this forum 的 Jared Answer

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

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

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

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

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

来自同一个 blog 为什么 Mongo 在阅读方面比 cassandra 更好

二级索引是 MongoDB 中的一流结构。这使得 很容易索引存储在 MongoDB 中的对象的任何属性,即使 它是嵌套的。这使得基于这些查询变得非常容易 二级索引。 Cassandra 仅粗略地支持辅助 索引。二级索引也仅限于单列和 平等比较。如果您主要是通过 主键,那么 Cassandra 就可以很好地为您工作。

【问题讨论】:

    标签: mongodb cassandra nosql


    【解决方案1】:

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

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

    希望对您有所帮助。

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

    关于卡桑德拉

    Cassandra 正在使用针对大量写入进行了优化的 LSM-tree。 https://docs.datastax.com/en/cassandra/2.1/cassandra/dml/dml_manage_ondisk_c.html

    一些细节:

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

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

    向 Cassandra 写入值不需要任何类型的读取或查找,因为所有写入都是附加操作。

    关于 MongoDB

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

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

    【讨论】:

    猜你喜欢
    • 2011-02-22
    • 1970-01-01
    • 2019-11-08
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2014-06-18
    • 2020-03-01
    相关资源
    最近更新 更多