注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

obsolete

wanna go

 
 
 

日志

 
 

MongoDB vs Cassandra  

2012-08-06 14:46:12|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

译自MongoDB vs Cassandra

过去两年里,我们一直在服务器监控工具Server Density上使用MongoDB,由此积累了丰富的经验和知识。退回2009年,当我正在寻求一个MySql的替代方案时,我曾考虑过 Cassandra但还是放弃了,原因在于Cassandra当时还处在一个早期发展阶段而MongoDB则相对有一些优势。由于我被邀请在 Cassandra London Meetup上做一个对照,促使我去关注Cassandra今天的发展情况。
声明:重要的一点在于工作中的使用帮助我对MongoDB有很多了解,而没有使用Cassandra使得任何对照都会比较表面化。但对于大多数正在做数据库选择的人们来说还是切合需要的。
不过基于我对MongoDB广泛的了解而对Cassandra认识却很有限,难免会存在偏见,我会试着避免对具体的细节进行技术上的比较。
下面我将从两个方面的差异来比较:具体的使用和项目的运作。
使用:开发者在结合数据库开发应用时的实际使用。
运作:不直接和数据库核心相关而是关注产品和管理的适应性的运作上。
为便于理解,我将先从一些技术上的对照开始。
-结构
MongoDB更像一个关系型数据库。它的数据模型顶层是一个数据库(database),之下一个类似于MySql表结构的集合 (collection),然后collection内包含的是文档(document)就像MySql里的数据行。每个文档有一个域(field)和一 个值(value)
类似于MySql里的列和值。field可以是简单的键/值(例如 { 'name': 'David Mytton' })也可以包含别的document(例如 { 'name': { 'first' : David, 'last' : 'Mytton' } })。
在Cassandra里,document对应的是“column”,即一个键值对(例如{ 'key': 'name', 'value': 'David Mytton' }),还包括一个时间戳字段用于内部的复制和一致性。值可以是一个值也可以包含其它的“column”,这些column按照某个指定值的顺序保存在column family里,顶层是一个键空间(keyspace)类似于MongoDB的database。

MongoDB <wbr>vs <wbr>Cassandra

Cassandra的数据模型图解可参考此文:http://www.javageneration.com/?p=70
-索引
MongoDB的索引很像关系型数据库。你可以在collection层面创建单个的或组合索引,每个插入这个collection里的document的相关field都会被索引。只要你的索引保存在内存里依据索引的查询是极其快的。
在0.7版本前,Cassandra实质上就是一个键值对存储,因此如果你想根据一个键的内容即value来查询,你需要创建一个单独的column来指向别的column即你创建自己的索引,在0.7版本里提供了对column值的辅助性索引,
但只能通过column families机制。如果你想做范围查询Cassandra需要更多的元数据来做索引,以及辅助性索引
例如我们定义了一个新的有一个索引的column family

MongoDB <wbr>vs <wbr>Cassandra
然而我们还不能实现范围查询:

MongoDB <wbr>vs <wbr>Cassandra
必须得创建辅助性索引。

MongoDB <wbr>vs <wbr>Cassandra
这样Cassandra就可以在birth_date字段基础上使用state字段做主键和过滤了。

MongoDB <wbr>vs <wbr>Cassandra
编码实例见博客http://www.datastax.com/dev/blog/whats-new-cassandra-07-secondary-indexes
-部署
MongoDB采用C++语言实现,支持Linux、OS X、Windows等多个平台。 安装特别简单-下载,展开,运行。
Cassandra采用Java语言实现,方便与现有的Java工程整合,但带来了额外的开销,初始化时间有些长,但有办法在两分钟内设置好一个4节点的集群,演示在此:http://www.screenr.com/5G6。相信很多人在Windows环境下运行MongoDB,但很少人选择在Windows上使用Cassandra。
-一致性和复制

MongoDB <wbr>vs <wbr>Cassandra
MongoDB复制机制通过replica set实现,这是一个加强的主从模型(包含一组节点,其中一个是主库)。数据被复制到所有节点上,即使主节点失效,其它的成员可以接管。可以通过配置决定 哪个节点有优先权,以及复制选项(sync delay即表示延时同步,在灾难恢复时用到)。MongoDB的写操作缺省是“不安全的”,缺省设置下,数据不是立刻写入磁盘的,因此有可能一个写操作 返回成功,但如果在将数据写入磁盘时服务器发生故障,那数据就丢失了。这也是MongoDB如何获得高性能表现。如果你需要增加可靠性,你可以指定安全写 入将确保返回前将数据写入磁盘。进一步你还可以要求数据必须成功写入N个备份从库。
MongoDB客户端支持从库读数据,可以在一个连接,数据库、collection或者查询层级上,驱动将查询发送到正确的从库上,但是不能确保一致性 (除非你使用返回前写入所有从库的选项)。与此相比,Cassandra查询发送到每个节点并返回最新的数据column(基于时间戳的值)。

MongoDB <wbr>vs <wbr>Cassandra


Cassandra在数据复制上通过感知网络拓扑(http://www.datastax.com/docs/0.8/operations/clustering#snitches)的方式提供更灵活的支持。服务器可以一致性等级的设置来确保数据备份在本地网络还是远程数据中心。这意味着Cassandra可以通过感知哪个机架和数据中心有可用的节点来处理冗余。Cassandra还可以监控节点来让查询避开响应“慢”的节点。

Cassandra唯一不足的是,Cassandra的这些设置都是在节点上通过配置文件实现的,而MongoDB可以在运行时通过客户端代码实现细到查询层级的不同粒度的控制。
-幕后支持
Cassandra(Apache 2.0 license)和MongoDB(AGPL)都是开源产品。但Cassandra是一个纯粹的开源工程,而MongoDB幕后是一家商业公 司:10gen。MongoDB的作者即核心开发者都在10gen工作(实际上,10gen就是专门为支持MongoDB成立的,CEO,CTO都是最初 的创造者)。而Cassandra由两名来自facebook的工程师创造,并由Apache基金孵化。这并不是一个坏处但有助于你了解它将来的获得的支 持,发展和社区
--支持
尽管有关于MongoDB的独立的咨询顾问,作为MongoDB的作者10gen公司无疑是获取支持的最好资源。而有数家公司提供Cassandra的商业支持,他们都是Cassandra核心代码的提交者。我觉得这不同于从一处就可以访问到整个开发队伍和原始作者。
-进行中的开发
直接与公司的开发团队互动意味着你可以在代码基础上修补bug和做改进。我们在使用MongoDB过程中发现并提交的大量问题都被修复了。在我们购买了 10gen的支持服务前,他们就一直很负责的对待发现的bug。我们还可以投票参与改进和新功能。理论上在Cassandra上,你同样期待修复bug和 改善功能。但因为开源项目由志愿者维护的原因这些改进可能就不那么确定了。

-技术文档
Cassandra的官方文档并不太好,相对好一些的是Datastax自己上面的一个版本。但还是缺乏一个完整详尽的介绍。而MongoDB的文档相对来说比较完整而成体系。在其官方网站上你就能看到结构明了的文档了,而且多语言版本也都在跟进翻译中。
-社区活动
这方面MongoDB做得非常出色,几乎可以用技术营销经典案例来形容。在去年一年,MongoDB相关的会议就举行了40场。相信在国内的很多朋友还记得在北京举行的Mongo Beijing。而Cassandra的活动更多的是自发进行的。
-第三方客户端
这也是boxedice选择MongoDB的另一个原因,MongoDB拥有非常广泛的客户端支持,几乎所有流行语言都有其操作客户端。而且这些客户端几 乎都是由10gen官方开发并维护的。而Cassandra仅有Java和Python的官方客户端,剩下的都是一些自发的第三方客户端。
结论
其实没啥结论,这篇文章不是关于谁是最好的,不是在比较它们。两者都有优势和不足,并且真要比较你就得在高负载的环境下在实际产品中长时间的使用他们。 MongoDB我们用的很好证明它可以适合高负载,可以灵活方便地搭建一个队列系统或者作为我们服务器监控服务的数据存储。就我而言,一个项目如何运作是 做决定前要考虑的一个重要方面,因为这些数据库类型都诞生不久。我觉得对这些因素对公司选用这项技术同样重要。

  评论这张
 
阅读(4024)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018