HBase vs Cassandra

来源:互联网 发布:吉他谱软件哪个好 编辑:程序博客网 时间:2024/05/21 14:56


HBase

HBase是一个开源的分布式存储系统。他可以看作是GoogleBigtable的开源实现。如同GoogleBigtable使用Google
File System
一样,HBase构建于和Google File System类似的Hadoop HDFS之上。

Cassandra

Cassandra可以看作是Amazon
Dynamo
的开源实现。和Dynamo不同之处在于,Cassandra结合了Google
Bigtable
ColumnFamily的数据模型。可以简单地认为,Cassandra是一个P2P的,高可靠性并具有丰富的数据模型的分布式文件系统。

 

架构比较

 

上面两个一个是HBase的架构层次图,一个是Cassandra的结构图。其实两者并不对等。但是HBase内部的结构图更加复杂,HadoopHDFSHBase每个单独部分都有若干个角色。而Cassandra与之不同,它不依赖任何一个已有的框架,且每个节点都是对等的。从架构上面来看,Cassandra显然比HBase更加简单。

造成这种设计层次的区别的原因,其实很显而易见。HBase是一个Google Bigtable的复制者。Google Bigtable要解决的问题是如何基于Google File System构建一个分布式数据库存储系统。对应的,HDFSGoogle File System,因此HBase的任务事实如何基于HDFS构建一个分布式数据库存储系统。

关于GFSBigtable,这里要多啰唆几句。GFSgoogle构建的,一个非POSIX的分布式文件存储系统。之所以GFS没有严格遵循POSIX的标准,因为GFS构建的目的是如何在造价低廉的服务器上存储超大文件这样一个系统。而POSIX对于小文件的查询等要求则被GFS给忽略了。因此,GFS适合做的事情是在在计算机集群里面有效地存取超大规模的文件。但是真实的世界里面,基于表结构的存储系统更加有用。传统的SQL数据库无法使用GFS因为GFS根本不提供POSIX接口,并且基于B+树的存储结构也让做超大规模索引而引发的树的分裂和重排成为一个巨大的瓶颈。Bigtable就是为了解决这个问题,提供一个基于表和列存储的一个系统,以方便Google为他们的搜索引擎提供存储网页和倒排索引的数据库。

Cassandra的被模仿者DynamoAmazon被使用的,是一个无单点故障的P2PKey-Value的数据库存储系统。为了让Cassandra更方便使用,Cassandra的开发团队也加入了ColumnFamily, Column, SuperColumn的概念。可以说,Dynamo所使用P2P的概念和相关技术(Bloom FilterDHT等)不是第一次被软件开发者使用,但是是严肃的大型软件第一次成功应用。Cassandra的设计者正是FacebookAmazon挖来的Dynamo的设计者和开发者。我们相信CassandraDynamo的设计实现是非常相似的。

 

数据模型比较

 

  

Cassandra  

HBase

  

缺少类似于表的概念.所有的文档都告诉你,有多个Keyspace的情况不常见.这意味着你必须在一个集群中共享同一个key space.另外,新增keyspace需要重启集群才能生效.  

存在表相关的概念.每个表都有它自己的key space. 这一点对我们来说很重要.添加/删除表都很容易,跟在RDBMS中一样.

  

使用字符串的Key.通常使用uuid作为Key.如果希望你的数据按照时间排序,可以使用TimeUUID.  

使用二进制Key.通常将三个不同的项目组合在一起来构建一个Key.这意味着你可以搜索一个给定表中的多个键.


  

即使使用TimeUUID,也不会发生热点问题,因为Cassandra会对客户端请求做负载均衡.  

如果Key的第一部分是时间或者序列数,就会发生热点问题.所有新的Key都会被插入同一个区域,一直到此区域被塞满(因而导致出现热点问题).

  

支持列排序  

不支持列排序

  

超列(Super Column)概念使得你可以设计非常灵活也非常复杂的表结构.  

不支持超列.不过可以设计一个类似与超列的结构,不过列名称与值都是二进制的.

  

没有便捷的方法来自增长一个列的值.实际上,最终一致性的不同特性使得更新/写入一条记录并在更新后立即读出非常困难.必须确保使用R+W>N来实现强一致性.  

由于设计上就是一致性.提供了一个非常便捷的方法来自增计数器.非常适合做数据汇总.

  

刚开始支持Map Reduce接口.还需要有一个hadoop集群来运行它.需要将数据从Cassandra集群迁移到Hadoop集群.不适合对大型数据运行map reduce任务.  

Map Reduce的支持是原生的.HBase构建在Hadoop集群上.数据不需要做迁移.

  

如果不需要Hadoop的话,维护相对简单.  

由于包含多个诸如ZookeeperrHadoop以及HBase本身的可活动组件,维护相对复杂.

  

到目前为止,还没有本地化的Java Api支持.没有Java文档.虽然是使用Java编写的,你还是必须用Thrift接口来与集群进行通讯.  

有友好的本地Java API.Cassandra更像是Java系统.由于我们的应用是基于Java,这一点对我们很重要.

  

没有主节点,因此也没有单点故障.  

虽然在概念上有一个主节点服务,HBase本身对它的依赖并不严重.即使在主节点宕机的情况下,HBase集群仍然可以正常提供数据服务.HadoopNamenode是一个单点故障.



特性比较

由于HBaseCassandra的数据模型比较接近,所以这里就不再比较两者之间数据模型的异同了。接下来主要比较双方在数据一致性、多拷贝复制的特性。

HBase

HBase保证写入的一致性。当一份数据被要求复制N份的时候,只有N份数据都被真正复制到N台服务器上之后,客户端才会成功返回。如果在复制过程中出现失败,所有的复制都将失败。连接上任何一台服务器的客户端都无法看到被复制的数据。HBase提供行锁,但是不提供多行锁和事务。HBase基于HDFS,因此数据的多份复制功能和可靠性将由HDFS提供。HBaseMapReduce天然集成。

Cassandra

写入的时候,有多种模式可以选择。当一份数据模式被要求复制N份的时候,可以立即返回,可以成功复制到一个服务器之后返回,可以等到全部复制到N份服务器之后返回,还可以设定一个复制到quorum份服务器之后返回。Quorum后面会有具体解释。复制不会失败。最终所有节点数据都将被写入。而在未被完全写入的时间间隙,连接到不同服务器的客户端有可能读到不同的数据。在集群里面,所有的服务器都是等价的。不存在任何一个单点故障。节点和节点之间通过Gossip协议互相通信。写入顺序按照timestamp排序,不提供行锁。新版本的Cassandra已经集成了MapReduce了。

相对于配置Cassandra,配置HBase是一个艰辛、复杂充满陷阱的工作。Facebook关于为何采取HBase,里面有一句,大意是,Facebook长期以来一直关注HBase的开发并且有一只专门的经验丰富的HBase维护的team来负责HBase的安装和维护。可以想象,Facebook内部关于使用HBaseCassandra有过激烈的斗争,最终人数更多的HBase
team
占据了上风。对于大公司来说,养一只相对庞大的类似DBAteam来维护HBase不算什么大的开销,但是对于小公司,这实在不是一个可以负担的起的开销。

另外HBase在高可靠性上有一个很大的缺陷,就是HBase依赖HDFSHDFSGoogle File
System
的复制品,NameNodeHDFS的单点故障点。而到目前为止,HDFS还没有加入NameNode的自我恢复功能。不过我相信,Facebook在内部一定有恢复NameNode的手段,只是没有开源出来而已。

相反,CassandraP2P和去中心化设计,没有可能出现单点故障。从设计上来看,CassandraHBase更加可靠。

关于数据一致性,实际上,Cassandra也可以以牺牲响应时间的代价来获得和HBase一样的一致性。而且,通过对Quorum的合适的设置,可以在响应时间和数据一致性得到一个很好的折衷值。

Cassandra优缺点

主要表现在:

配置简单,不需要多模块协同操作。功能灵活性强,数据一致性和性能之间,可以根据应用不同而做不同的设置。
可靠性更强,没有单点故障。

尽管如此,Cassandra就没有弱点吗?当然不是,Cassandra有一个致命的弱点。

这就是存储大文件。虽然说,Cassandra的设计初衷就不是存储大文件,但是AmazonS3实际上就是基于Dynamo构建的,总是会让人想入非非地让Cassandra去存储超大文件。而和Cassandra不同,HBase基于HDFSHDFS的设计初衷就是存储超大规模文件并且提供最大吞吐量和最可靠的可访问性。因此,从这一点来说,Cassandra由于背后不是一个类似HDFS的超大文件存储的文件系统,对于存储那种巨大的(几百T甚至P)的超大文件目前是无能为力的。而且就算由Client手工去分割,这实际上是非常不明智和消耗Client
CPU
的工作的。

因此,如果我们要构建一个类似Google的搜索引擎,最少,HDFS是我们所必不可少的。虽然目前HDFSNameNode还是一个单点故障点,但是相应的Hack可以让NameNode变得更皮实。基于HDFSHBase相应地,也更适合做搜索引擎的背后倒排索引数据库。事实上,LuceneHBase的结合,远比Lucene结合Cassandra的项目Lucandra要顺畅和高效的多。(Lucandra要求Cassandra使用OrderPreservingPartitioner,这将可能导致Key的分布不均匀,而无法做负载均衡,产生访问热点机器)。

 

0 0