【问题标题】:MongoDB vs. Cassandra [closed]MongoDB vs. Cassandra [关闭]
【发布时间】:2011-02-22 23:28:46
【问题描述】:

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

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

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

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

【问题讨论】:

  • 提供了官方的性能基准统计数据。 Cassandra vs MongoDB vs HBase
  • >每个查询中的大量读取,较少的常规写入 => 寻找 CQRS(将您的读取与写入分开,可能没有事件源但检查您是否可以更新您的读取模型异步 .. 同步可能有效太..这取决于您的用例)
  • 这实际上是一个很好的问题。我想知道它是否有更新版本?这个现在很老了

标签: mongodb database-design cassandra database


【解决方案1】:

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

两个数据库在热数据集适合内存的读取方面表现良好。两者都强调无连接数据模型(并鼓励非规范化),并且都提供documents 或rows 上的索引,尽管 MongoDB 的索引目前更加灵活。

无论您的数据集增长到多大,Cassandra 的存储引擎都能提供恒定时间的写入。在 MongoDB 中写入问题更多,部分原因是基于 b-tree 的存储引擎,但更多是因为它确实存在multi-granularity locking。

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

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

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

更关心简单的设置、维护和代码

两者的设置都很简单,单个服务器具有合理的开箱即用默认值。 Cassandra 在多服务器配置中设置起来更简单,因为没有需要担心的特殊角色节点。

如果您目前使用的是 JSON blob,那么 MongoDB 非常适合您的用例,因为它使用 BSON 来存储数据。您将能够拥有比现有数据库中更丰富、更可查询的数据。这将是 Mongo 最重要的胜利。

【讨论】:

  • 完全不同,评论不够大,但是...... Cassandra 是一个线性可扩展(摊销的常数时间读取和写入)发电机/谷歌 bigtable 混合体,无论数据大小如何,都具有快速写入功能。它的功能集是极简主义的,几乎没有超出有序键值存储的功能。 MongoDB 是一个功能强大(且速度快)的文档存储,其代价是持久性和保证写入持久性(因为它们不会立即写入磁盘)。它们是不同的野兽,有着不同的哲学,MongoDB 更接近于 RDMS 的替代品......
  • 虽然 Cassandra 级别较低,但允许超级扩展(请参阅 Twitter/Digg/Facebook),但您必须仔细考虑如何布置数据、构建二级索引等,因为不允许灵活查询。
  • 因为每个人都在这里提到了与 Cassandra 相关的 Twitter:他们没有使用 Cassandra 来持久化推文,他们在这里仍然使用 MySQL (engineering.twitter.com/2010/07/cassandra-at-twitter-today.html)。好的,但我可以想象他们仍然在 Cassandra 中存储大量数据用于其他目的。
  • 看起来全局写锁可能已经在 Mongo 2.2 中被移除了...
  • 在我的项目上线之前,我就已经感受到了MongoDB的痛点。热备份是一项基本要求。要在 Linux 服务器中进行热备份,您必须首先设置一个 LVM 分区(不太常见)并在每次备份会话之前拍摄快照。另一种简单的方法是使用 Mongodb 付费备份服务。但是,这项服务很昂贵(2.3 美元/GB/月)。很快您将需要一个用于容错的副本集。使用开源版本,节点只能以明文形式交换数据。对于 SSL,您必须使用 Entprise 版本。那是10,000美元。再见了MongoDB。将我的代码重构为 Cassandra。
【解决方案2】:

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

我认为 Cassandra 具有更好的扩展功能,因为它与 Twitter 等大型项目一起使用,尽管 MongoDB 团队正在那里进行平价工作。需要指出的是,我没有在试运行阶段之后使用过 Cassandra,所以我不能详细说明。

当我们评估 NoSQL 数据库时,对我来说真正的摇摆不定是查询 - Cassandra 基本上只是一个巨大的键/值存储,而且查询有点繁琐(至少与 MongoDB 相比),所以对于性能而言,你' d 必须复制相当多的数据作为一种手动索引。另一方面,MongoDB 使用“示例查询”模型。

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

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

如果您想查找所有名为 Smith 且拥有管理员权限的用户,您只需创建一个新文档(在管理控制台中使用 Javascript,或在生产环境中使用您选择的语言):

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

...然后运行查询。而已。添加了比较运算符、RegEx 过滤等,但都非常简单,而且基于 Wiki 的文档也很不错。

【讨论】:

  • 更新(2011 年 8 月 8 日):亚马逊的爱尔兰 EC2 数据中心昨晚发生了与闪电有关的事件,在整理我们的服务器恢复时,我发现了一个非常关键的点:如果你有一个两台服务器的复制集(它们很容易设置),确保你有一个仲裁节点,所以如果一个出现故障,另一个不会恐慌并在辅助模式下停止!相信我,使用大型数据库进行整理是一件很痛苦的事情。
  • 添加@Richard K 所说的,当您在副本集中有偶数个节点(主要+次要)时,您应该有仲裁节点。
  • 添加到在数据分析上进行更多聚合时考虑使用 mongodb。
  • As long as you think about indexes carefully, it can absolutely scream along, speed-wise. 等到你的物理内存满了,操作系统开始出现页面错误,哈哈
【解决方案3】:

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

对于相同的规格,NoSQL 数据存储通常比传统数据库具有更好的扩展性——Facebook、Twitter、Google 和大多数初创企业都使用 NoSQL 解决方案是有原因的。这不仅仅是极客对新技术的兴趣。

【讨论】:

  • 我完全同意。我在我正在构建的即将推出的产品之一中使用 mongodb + mysql。它是即将推出的金融产品云。 mysql 用于我们绝对需要事务能力的地方。 mongodb 用于存储非计算复杂的数据结构,需要时才需要拉起。到目前为止工作良好。 :)
  • 我在大多数项目中也使用了这种双重方法,在其他一些项目中,NFS 挂载文件系统与 PostgreSQL 一起用于在某些情况下接近 1 Gb 的地震 blob。路径是对键值数据库的一种查询。
  • 这里是一个链接,指向我询问的关于如何构建 sql 和 nosql 数据库的问题:dba.stackexchange.com/questions/102053/…我可以使用您可能有的一些见解
  • 他已经从交易中逃脱了 => 现在无限的可扩展性可能是可能的.. 否则 -> 不是:)
  • 如果您的数据是分布式的,这不是一个好的解决方案
【解决方案4】:

我可能会成为一个奇怪的人,但我认为你需要继续使用 MySQL。您还没有描述需要解决的实际问题,MySQL/InnoDB 是一个出色的存储后端,即使对于 blob/json 数据也是如此。

一旦意识到并非使用 RDBMS 的所有功能,Web 工程师就有一个常见的技巧,即尝试使用更多的 NoSQL。仅此一项并不是一个好的理由,因为大多数 NoSQL 数据库的数据引擎(MySQL 称之为存储引擎)通常都很差。

现在,如果您不是那种类型,那么请指定 MySQL 中缺少的内容,并且您正在其他数据库中查找(例如,自动分片、自动故障转移、多-master 复制,集群中较弱的数据一致性保证在更高的写入吞吐量中得到回报等)。

【讨论】:

  • 他正在使用分片,这意味着他的数据在服务器之间手动分区。 Mongodb 可以自动分片,这可能是一个好处。
  • 他还在 RDBMS 中存储了大部分 JSON blob——使关系设计(功能)变得无用。
  • 数据模型和自动分片确实不一样,但是在选择数据库的时候,需要先看存储引擎,其他的花里胡哨。存储引擎在负载峰值下将如何执行?在数据流入激增的情况下,自动分片功能将如何执行?在将这些重要方面的控制权交给数据库之前,您最好确保它能够胜任这项任务。
  • 关系模型是目前最深思熟虑、实施效率最高且节俭的数据模型之一。 “使关系设计功能变得无用”可能与约束、触发器或引用完整性有关——但这些都是按使用付费的。
【解决方案5】:

我没用过Cassandra,但是我用过MongoDB,觉得它很棒。

如果您进行简单的设置,就是这样:您只需解压 MongoDB 并运行 mongod 守护程序,就是这样......它正在运行。

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

【讨论】:

  • AFAIK,同样适用于 Cassandra。解压,运行守护进程。测试集群已设置好并可以投入生产!
【解决方案6】:

我昨天看了一个关于 mongodb 的介绍。我可以肯定地说设置很“简单”,就像打开包装并启动它一样简单。完成。

我相信 mongodb 和 cassandra 几乎都可以在任何常规的 linux 硬件上运行,因此您应该不会在该领域发现太多障碍。

我认为,在这种情况下,归根结底,您个人觉得哪个更舒服,哪个工具集更适合您。至于关于 mongodb 的演示,演示者表示 mongodb 的工具集非常轻巧,并且没有很多(他们说真的)类似于 MySQL 可用的工具。这当然是他们的经验,所以 YMMV。我喜欢 mongodb 的一件事是它似乎有很多语言支持(Python 和 .NET 是我主要使用的两个)。

使用 mongodb 的网站列表很漂亮impressive,我知道 Twitter 刚刚切换到使用 cassandra。

【讨论】:

  • 归根结底是苹果与橙子的比较。这两个数据库都有自己的优势。这里有一些需要考虑的事情 - 对象模型、二级索引、写入可扩展性、高可用性等。这里有一篇博文解释了 mongodb 和 cassandra 之间的高级战略差异 - scalegrid.io/blog/cassandra-vs-mongodb
猜你喜欢
  • 1970-01-01
  • 2014-08-25
  • 2011-01-08
  • 2015-05-27
  • 2014-12-29
  • 2011-03-23
  • 2018-06-06
  • 2014-05-16
  • 2013-09-17
相关资源
最近更新 更多