Cassandra HBase | ||
---|---|---|
一致性 | Quorum NRW策略 通过Gossip协议同步Merkle Tree,维护集群节点间的数据一致性 | 单节点,无复制,强一致性 |
可用性 | 1,基于Consistent Hash相邻节点复制数据,数据存在于多个节点,无单点故障。 2,某节点宕机,hash到该节点的新数据自动路由到下一节点做 hinted handoff,源节点恢复后,推送回源节点。 3,通过Gossip协议维护集群所有节点的健康状态,并发送同步请求,维护数据一致性。 4,SSTable,纯文件,单机可靠性一般。 | 1,存在单点故障,Region Server宕机后,短时间内该server维护的region无法访问,等待failover生效。 2,通过Master维护各Region Server健康状况和Region分布。 3,多个Master,Master宕机有zookeeper的paxos投票机制选取下一任Master。Master就算全宕机,也不影响Region读写。Master仅充当一个自动运维角色。 4,HDFS为分布式存储引擎,一备三,高可靠,0数据丢失。 5,HDFS的namenode是一个SPOF。 |
伸缩性 | 1,Consistent Hash,快速定位数据所在节点。 2,扩容需在Hash Ring上多个节点间调整数据分布。 | 1,通过Zookeeper定位目标Region Server,最后定位Region。 2,Region Server扩容,通过将自身发布到Master,Master均匀分布。 |
负载均 衡 | 请求Zookeeper取得整个集群地址,然后根据Consistent Hash选择合适的节点。client会缓存集群地址。 | 请求Zookeeper取读写数据路由表定位Region Server,Master会修改这个路由表。Client自身也会缓存一部分路由信息。 |
数据差异比较算法 | Merkle Tree , Bloom Filter | Bloom Filter |
锁与事务 | Client Timestap(Dynamo使用vector lock) | Optimistic Concurrency Control |
读写性能 | 数据读写定位非常快。 | 数据读写定位可能要通过最多6次的网络RPC,性能较低。 |
CAP点评 | 1,弱一致性,数据可能丢失。 2,可用性高。 3,扩容方便。 | 1,强一致性,0数据丢失。 2,可用性低。 3,扩容方便。 |
大方面对比 Riak 与 HBase 都是基于 Apache 2.0 licensed 发布 Riak 的实现是基于 Amazon 的 Dynamo 论文,HBase 是基于 Google 的 BigTable Riak 主要用 Erlang 写成,包括一部分的C,而 HBase 是用 Java 写的。 功能性对比
>
功能点 | Riak | HBase |
---|---|---|
数据模型 | Riak 通过bucket作为命名空间,存储 Key-Value 信息 Buckets, Keys, and Values | HBase 按预先定义好的 column family 结构来存储数据(每一条数据有一个key以及若干个列属性值组成,每列的数据都有自己的版本信息)。HBase 中的数据是按列进行有序存储的(不像关系型数据库中按行存储)。 HBase Data Model Supported Data Types |
存储引擎 | Riak 采用模块化的思想,将存储层作为引擎挂到系统上。你可以根据自己的需要选择不同的存储引擎。 Riak 支持的存储引擎 你也可以甚至 Riak 的 backend API实现你自己的存储引擎。 | HBase 是存在于 HDFS之上的,其数据文件存在HDFS中。与BigTable 类似,数据存储分为内存中的 MemStore 和落地存储的 StoreFiles。其数据文件称为HFile,基于BigTable 的SSTable。可以直接使用JVM的 文件系统IO操作来对数据文件进行操作。 HDFS Hadoop Uses HDFS |
数据访问接口 | 除了直接使用 Erlang 之外,Riak 还提供了两种数据访问接口,REST方式和 Protocol Buffer : HTTP Protocol Buffers Riak 的客户端都是基于上面的API来实现,目前对主流的语言支持很好。 Client-Libraries Community Developed Libraries and Projects | HBase 的操作主要通过在JVM中直接执行代码。HBase 也提供了外部数据访问方式,包括REST方式以及Thrift协议的访问。 Java Interface REST Thrift |
数据操作方式 | Riak中支持下面四种方式的操作 对主键进行直接操作 (GET, PUT, DELETE,UPDATE) MapReduce 方式 Riak 还提供 Secondary Indexes Riak Search 插件 上面几种方式的对比文章 | HBase 有两种方式的数据操作,通过对有序key值进行扫描查询,获取value值,或者借助强大的Hadoop来进行MapReduce查询 Scanning MapReduce Secondary Indexes |
数据一致性问题 | Riak 通过 vector clock的方式来维护数据版本,处理不一致的情况。同时你也可以不使用vector clock,而是采用基于时间戳的 “last-write-wins” 策略 Vector Clocks Why Vector Clocks Are Easy Why Vector Clocks Are Hard | HBase 采用了强一致性的读写保证。数据会在多个不同的region中进行保存。Column families 可以包含无限多个数据版本,每个版本可以有自己的TTL Consistent Architecture Time to Live |
并发 | Riak 集群中的所有节点都能同时进行读写操作,Riak只负责进行数据的写入操作(基于vector clock进行带版本控制的保存),在数据读取的时候再来定义数据冲突的处理逻辑。 | HBase 通过行级锁来保证写操作的原子性,但是不支持多行写操作的事务性。数据扫描操作不保证一致性。 Consistency Guarantees |
复制 | Riak 的数据复制系统的理论来源主要是Dynamo 的论文和 Eric Brewer 博士的 CAP 理论。Riak 采用一致性hash对数据进行分片,同一份数据会在多个节点中保存备份。在一致性hash的理论支持下,Riak采用的是虚拟节点的方式来实现数据的复制并进行数据平衡分配的保证。引入虚拟节点使得数据与实际节点间能够保持松耦合 Replication Clustering Riak 的API 提供在一致性和可用性之间的自由选择,你可以根据自己的应用场景选择不同策略。在最初存储数据到Riak中时,可以按bucket为单位进行复制方式的配置。在后续的读写操作中,每次都能够再进行复制份数的设置。 Reading, Writing, and Updating Data | HBase 是典型的最终一致性实现,数据复制通过 master向slave的推送来实现。最近HBase也添加了master-master 的实现。 Replication |
扩展性 | Riak 支持动态添加我删除节点,所有节点都对等,不存在主从的区别。当向Riak 中添加一个节点后,集群会通过gossiping 发现节点并分配对应的数据范围并进行数据迁移。移除节点的过程相反。Riak提供了一系列工具来完成节点的增删操作。 Adding and Removing Nodes Command Line Tools | HBase 以regions为单位进行分片,region会分裂和合并,并自动在多个节点间分配。Regions Node Management HBase Architecture |
多数据中心的数据同步 | 只有Riak的企业版才支持多数据中心的部署方案,通常用户仅支持单数据中心的部署。 Riak Enterprise | HBase通过region来进行分片,天然就支持多数据中心的部署。 Node Management |
图形化的监控管理工具 | 从Riak 1.1.x 开始,Riak 发布了 Riak Control,这是一个针对Riak的开源的图形化管理工具。 Riak Control Introducing Riak Control | HBase 有一些开源社区开发的图形化工具,同时也有一个命令行的控制终端能用。 Admin Console Tools Eclipse Dev Plugin HBase Manager GUI Admin |