HBase
HBase是一个开源的分布式存储系统。他可以看作是Google的Bigtable的开源实现。如同Google的Bigtable使用GoogleFile System一样,HBase构建于和Google File System类似的Hadoop HDFS之上。
Cassandra
Cassandra可以看作是Amazon 
Dynamo的开源实现。和Dynamo不同之处在于,Cassandra结合了Google 
Bigtable的ColumnFamily的数据模型。可以简单地认为,Cassandra是一个P2P的,高可靠性并具有丰富的数据模型的分布式文件系统。
 架构比较
上面两个一个是HBase的架构层次图,一个是Cassandra的结构图。其实两者并不对等。但是HBase内部的结构图更加复杂,Hadoop,HDFS和HBase每个单独部分都有若干个角。而Cassandra与之不同,它不依赖任何一个已有的框架,且每个节点都是对等的。从架构上面来看,Cassandra显然比HBase更加简单。
造成这种设计层次的区别的原因,其实很显而易见。HBase是一个Google Bigtable的复制者。Google Bigtable要解决的问题是如何基于Google File System构建一个分布式数据库存储系统。对应的,HDFS是Google File System,因此HBase的任务事实如何基于HDFS构建一个分布式数据库存储系统。
关于GFS和Bigtable,这里要多啰唆几句。GFS是google构建的,一个非POSIX的分布式文件存储系统。之所以GFS没有严格遵循POSIX的标准,因为GFS构建的目的是如何在造价低廉的服务器上存储超大文件这样一个系统。而POSIX对于小文件的查询等要求则被GFS给忽略了。因此,GFS适合做的事情是在在计算机集里面有效地存取超大规模的文件。但是真实的世界里面,基于表结构的存储系统更加有用。传统的SQL数据库无法使用GFS因为GFS根本不提供POSIX接口,并且基于B+树的存储结构也让做超大规模索引而引发的树的分裂和
hbase主要用来储存什么数据重排成为一个巨大的瓶颈。Bigtable就是为了解决这个问题,提供一个基于表和列存储的一个系统,以方便Google为他们的搜索引擎提供存储网页和倒排索引的数据库。
而Cassandra的被模仿者Dynamo在Amazon被使用的,是一个无单点故障的P2P的Key-Value的数据库存储系统。为了让Cassandra更方便使用,Cassandra的开发团队也加入了ColumnFamily, Column, SuperColumn的概念。可以说,Dynamo所使用P2P的概念和相关技术(Bloom Filter,DHT等)不是第一次被软件开发者使用,但是是严肃的大型软件第一次成功应用。Cassandra的设计者正是Facebook从Amazon挖来的Dynamo的设计者和开发者。我们相信Cassandra和Dynamo的设计实现是非常相似的。
 数据模型比较 
  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是一个单点故障.
由于HBase和Cassandra的数据模型比较接近,所以这里就不再比较两者之间数据模型的异同了。接下来主要比较双方在数据一致性、多拷贝复制的特性。
HBase
HBase保证写入的一致性。当一份数据被要求复制N份的时候,只有N份数据都被真正复制到N台服务器上之后,客户端才会成功返回。如果在复制过程中出现失败,所有的复制都将失败。连接上任何一台服务器的客户端都无法看到被复制的数据。HBase提供行锁,但是不提供多行锁和事务。HBase基于HDFS,因此数据的多份复制功能和可靠性将由HDFS提供。HBase和MapReduce天然集成。
Cassandra
数据先写入内存中的Memtable,Memtable达到条件后刷新到磁盘,保存为SSTable,同一个CF的多个SSTable可以合并(Compaction)以优化读操作
commit log -> memtable -> sstable -> compaction.
看起来似乎有些麻烦,存个数据要这么多弯弯绕,但是记得,兄弟们,现在是应付海量数据,同时有很多节点,所以必须要走这么多弯路。
memtable是啥呢,所谓mem, mem,就是memory,内存,放在内存的table。
数据放内存有啥好处呢?
一个字:快。
因为离CPU最近的,就是内存.
数据的时候,先去内存里,不到再去硬盘。
写入的时候,有多种模式可以选择。当一份数据模式被要求复制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的工作的。