摘取了一部分,全文请查看
http://blog.sina.com.cn/s/blog_633f4ab20100r9nm.html
背景
“这是最好的时代,也是最坏的时代。”
每个时代的人都在这么形容自己所处的时代。在一次次IT浪潮下面,有人觉得当下乏味无聊,有人却能锐意进取,找到突破。数据存储这个话题自从有了计算机之后,就一直是一个有趣或者无聊的主题。上世纪七十年代,关系数据库理论的出现,造就了一批又一批传奇,并推动整个世界信息化到了一个新的高度。而进入新千年以来,随着SNS等应用的出现,传统的SQL数据库已经越来越不适应海量数据的处理了。于是,这几年NoSQL数据库的呼声也越来越高。
在NoSQL数据库当中,呼声最高的是HBase和Cassandra两个。虽然严格意义上来说,两者服务的目的有所不同,侧重点也不尽相同,但是作为当前开源NoSQL数据库的佼佼者,两者经常被用来做各种比较。
去年十月,Facebook推出了他的新的Message系统。Facebook宣布他们采用HBase作为后台存储系统。这引起了一片喧哗声。因为Cassandra恰恰是Facebook开发,并且于2008年开源。这让很多人惊呼,是否是Cassandra已经被Facebook放弃了?HBase在这场NoSQL数据库的角力当中取得了决定性的胜利?本文打算主要从技术角度分析,HBase和Cassandra的异同,并非要给出任何结论,只是共享自己研究的一些结果。
选手简介
HBase
HBase是一个开源的分布式存储系统。他可以看作是Google的Bigtable的开源实现。如同Google的Bigtable使用Google File System一样,HBase构建于和Google File System类似的Hadoop HDFS之上。
Cassandra
Cassandra可以看作是Amazon Dynamo的开源实现。和Dynamo不同之处在于,Cassandra结合了Google Bigtable的ColumnFamily的数据模型。可以简单地认为,Cassandra是一个P2P的,高可靠性并具有丰富的数据模型的分布式文件系统。
分布式文件系统的指标
根据UC Berkeley的教授Eric Brewer于2000年提出猜测- CAP定理,一个分布式计算机系统,不可能同时满足以下三个指标:
Consistency 所有节点在同一时刻保持同一状态Availability 某个节点失败,不会影响系统的正常运行Partition tolerance 系统可以因为网络故障等原因被分裂成小的子系统,而不影响系统的运行
Brewer教授推测,任何一个系统,同时只能满足以上两个指标。
在2002年,MIT的Seth Gilbert和Nancy Lynch发表正式论文论证了CAP定理。
而HBase和Cassandra两者都属于分布式计算机系统。但是其设计的侧重点则有所不同。HBase继承于Bigtable的设计,侧重于CA。而Cassandra则继承于Dynamo的设计,侧重于AP。
。。。。。。。。。。。。。。。。。。。
特性比较
由于HBase和Cassandra的数据模型比较接近,所以这里就不再比较两者之间数据模型的异同了。接下来主要比较双方在数据一致性、多拷贝复制的特性。
HBase
HBase保证写入的一致性。当一份数据被要求复制N份的时候,只有N份数据都被真正复制到N台服务器上之后,客户端才会成功返回。如果在复制过程中出现失败,所有的复制都将失败。连接上任何一台服务器的客户端都无法看到被复制的数据。HBase提供行锁,但是不提供多行锁和事务。HBase基于HDFS,因此数据的多份复制功能和可靠性将由HDFS提供。HBase和MapReduce天然集成。
Cassandra
写入的时候,有多种模式可以选择。当一份数据模式被要求复制N份的时候,可以立即返回,可以成功复制到一个服务器之后返回,可以等到全部复制到N份服务器之后返回,还可以设定一个复制到quorum份服务器之后返回。Quorum后面会有具体解释。复制不会失败。最终所有节点数据都将被写入。而在未被完全写入的时间间隙,连接到不同服务器的客户端有可能读到不同的数据。在集群里面,所有的服务器都是等价的。不存在任何一个单点故障。节点和节点之间通过Gossip协议互相通信。写入顺序按照timestamp排序,不提供行锁。新版本的Cassandra已经集成了MapReduce了。
相对于配置Cassandra,配置HBase是一个艰辛、复杂充满陷阱的工作。Facebook关于为何采取HBase,里面有一句,大意是,Facebook长期以来一直关注HBase的开发并且有一只专门的经验丰富的HBase维护的team来负责HBase的安装和维护。可以想象,Facebook内部关于使用HBase和Cassandra有过激烈的斗争,最终人数更多的HBase team占据了上风。对于大公司来说,养一只相对庞大的类似DBA的team来维护HBase不算什么大的开销,但是对于小公司,这实在不是一个可以负担的起的开销。
另外HBase在高可靠性上有一个很大的缺陷,就是HBase依赖HDFS。HDFS是Google File System的复制品,NameNode是HDFS的单点故障点。而到目前为止,HDFS还没有加入NameNode的自我恢复功能。不过我相信,Facebook在内部一定有恢复NameNode的手段,只是没有开源出来而已。
相反,Cassandra的P2P和去中心化设计,没有可能出现单点故障。从设计上来看,Cassandra比HBase更加可靠。
关于数据一致性,实际上,Cassandra也可以以牺牲响应时间的代价来获得和HBase一样的一致性。而且,通过对Quorum的合适的设置,可以在响应时间和数据一致性得到一个很好的折衷值。
Cassandra优缺点
主要表现在:
配置简单,不需要多模块协同操作。功能灵活性强,数据一致性和性能之间,可以根据应用不同而做不同的设置。 可靠性更强,没有单点故障。
尽管如此,Cassandra就没有弱点吗?当然不是,Cassandra有一个致命的弱点。
这就是存储大文件。虽然说,Cassandra的设计初衷就不是存储大文件,但是Amazon的S3实际上就是基于Dynamo构建的,总是会让人想入非非地让Cassandra去存储超大文件。而和Cassandra不同,HBase基于HDFS,HDFS的设计初衷就是存储超大规模文件并且提供最大吞吐量和最可靠的可访问性。因此,从这一点来说,Cassandra由于背后不是一个类似HDFS的超大文件存储的文件系统,对于存储那种巨大的(几百T甚至P)的超大文件目前是无能为力的。而且就算由Client手工去分割,这实际上是非常不明智和消耗Client CPU的工作的。
因此,如果我们要构建一个类似Google的搜索引擎,最少,HDFS是我们所必不可少的。虽然目前HDFS的NameNode还是一个单点故障点,但是相应的Hack可以让NameNode变得更皮实。基于HDFS的HBase相应地,也更适合做搜索引擎的背后倒排索引数据库。事实上,Lucene和HBase的结合,远比Lucene结合Cassandra的项目Lucandra要顺畅和高效的多。(Lucandra要求Cassandra使用OrderPreservingPartitioner,这将可能导致Key的分布不均匀,而无法做负载均衡,产生访问热点机器)。
所以我的结论是,在这个需求多样化的年代,没有赢者通吃的事情。而且我也越来越不相信在工程界存在一劳永逸和一成不变的解决方案。当你仅仅是存储海量增长的消息数据,存储海量增长的图片,小视频的时候,你要求数据不能丢失,你要求人工维护尽可能少,你要求能迅速通过添加机器扩充存储,那么毫无疑问,Cassandra现在是占据上风的。
但是如果你希望构建一个超大规模的搜索引擎,产生超大规模的倒排索引文件(当然是逻辑上的文件,真实文件实际上被切分存储于不同的节点上),那么目前HDFS+HBase是你的首选。
就让这个看起来永远正确的结论结尾吧,上帝的归上帝,凯撒的归凯撒。大家都有自己的地盘,野百合也会有春天的!