关于数据库设计:MongoDB与Cassandra

MongoDB vs. Cassandra

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

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

现在看来,MongoDB和Cassandra都是可能的选择。我的处境:

  • 每一个查询中都有大量的读取,较少的常规写入
  • 不担心"大规模"可扩展性
  • 更关注简单的设置、维护和代码
  • 最小化硬件/服务器成本


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

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

Cassandra的存储引擎提供恒定的时间写入,不管数据集增长多大。在MongoDB中,写入问题更大,部分原因是基于B树的存储引擎,但更多的原因是它的多粒度锁定。

对于分析,MongoDB提供定制的map/reduce实现;Cassandra提供本地Hadoop支持,包括Hive(基于Hadoop map/reduce构建的SQL数据仓库)和Pig(许多人认为Hadoop特定的分析语言比SQL更适合map/reduce工作负载)。卡桑德拉也支持使用火花。

不担心"大规模"可扩展性

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

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

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

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


我已经广泛使用MongoDB(在过去的6个月里),构建了一个分层的数据管理系统,并且我可以保证安装的容易(安装它,运行它,使用它!)和速度。只要你仔细考虑索引,它就可以毫无保留地快速前进。

我认为,Cassandra由于与Twitter等大型项目配合使用,具有更好的扩展功能,尽管MongoDB团队正在努力实现对等性。我应该指出,我没有使用卡桑德拉超过试运行阶段,所以我不能说的细节。

当我们评估NoSQL数据库时,我真正感到兴奋的是查询——Cassandra基本上只是一个巨大的键/值存储,而查询有点麻烦(至少与MongoDB相比),因此为了提高性能,您必须复制相当多的数据作为一种手动索引。另一方面,MongoDB使用"示例查询"模型。

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

1
2
3
4
5
6
{
   FirstName:"John",
   LastName:"Smith",
   Email:"[email protected]",
   Groups: ["Admin","User","SuperUser"]
}

如果您想找到所有拥有管理权限的用户Smith,您只需创建一个新文档(在管理控制台上使用javascript,或在生产中使用您选择的语言):

1
2
3
4
{
   LastName:"Smith",
   Groups:"Admin"
}

…然后运行查询。就是这样。有一些用于比较、regex过滤等的附加操作符,但它们都非常简单,基于wiki的文档也非常好。


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

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


我可能会成为一个奇怪的人,但我认为你需要留在MySQL。您还没有描述需要解决的实际问题,而且mysql/innodb是一个优秀的存储后端,即使对于blob/json数据也是如此。

在Web工程师中,有一个常见的诀窍,就是一旦意识到并没有使用RDBMS的所有特性,就尝试使用更多的NoSQL。这本身并不是一个很好的理由,因为大多数nosql数据库都有相当差的数据引擎(mysql称之为存储引擎)。

现在,如果您不是这样的人,那么请指定MySQL中缺少的内容,并在不同的数据库中查找(例如,自动切分、自动故障转移、多主机复制、集群中较弱的数据一致性保证,在较高的写吞吐量中获得回报等)。


我没用过卡桑德拉,但我用过MongoDB,觉得它很棒。

如果您正在进行简单的设置,那么就是这样:您只需解开mongodb并运行mongod守护进程,就这样……它在运行。

显然,这只是一个开始,但要让你开始是很容易的。


我昨天看了一个关于MongoDB的演示。我可以肯定地说,设置是"简单的",就像打开它并启动它一样简单。完成。

我相信MongoDB和Cassandra几乎可以在任何普通的Linux硬件上运行,所以您不应该在这方面发现太多障碍。

我认为在这种情况下,在一天结束的时候,它将归结为您个人觉得哪个更舒服,哪个有您喜欢的工具集。至于MongoDB的演示,演示者指出MongoDB的工具集很轻,并且有很多(他们说是真的)类似于MySQL的工具。这当然是他们的经验,所以YMMV。我喜欢MongoDB的一点是,它似乎有很多语言支持(Python和.NET是我主要使用的两种语言)。

使用MongoDB的网站列表非常令人印象深刻,我知道Twitter刚刚转向使用Cassandra。