DynamoDB和HBase是NoSQL数据库中的两大阵营,DynamoDB是AWS的专有方案和服务,而HBase则是Apache旗下的开源项目。在说这两大方案之前,先解释下什么是NoSQL。NoSQL就是“Not only SQL“,NoSQ的出现主要是因为SQL数据面临着很多挑战:
- 并不适用于数据类型多样化(比如图像、视频和文本)
- 无法扩展、支持庞大的数据量
- 垂直扩展受限于内存和处理器的功能
- 横向扩展受制于依赖缓存的读取和写入操作
- 复杂的RDBMS模型,一致性限制了RDBMS的可扩展性。
相比关系数据库,NoSQL更具有可扩展性,并提供了出色的性能
- 扩展简单,可以方便的添加新的结点以支持更多存储和并发
- 快速的读写:由于其逻辑简单,而且纯内存操作,使得其性能非常出色,单节点每秒可以处理超过10万次读写操作
- 低廉的成本:这是大多数分布式数据库共有的特点,因为主要都是开源软件,没有昂贵的License成本
当然NoSQL数据库还存在着很多的不足,常见主要有下面这几个:
- 不提供对SQL的支持
- 支持的特性不够丰富,大多数NoSQL数据库都不支持事务(Transactional)操作
- 产品还在成熟中
了解了NoSQL方案的优缺点后,我们来看DynamoDB和HBase。这两者的首要区别就是服务提供的层次不同,DynamoDB是AWS提供的服务,你不需要担心相关的服务和扩展,按需使用服务并付费即可;而HBase是一个开源的项目,你可以看到底层代码,深入了解它的实现细节,但需要自行管理其服务。
DynamoDB的存储和读写IO是按partition来组织的,一个Partition下面是一个跨多个AZ(Availability Zone)的存储单元。每个Partition支持10GB的存储,1000 WCU(Write Capacity Unit)或者3000 RCU(Read Capacity Unit),任何一项超过单个Partition能支持的上限,AWS就会在后台自动添加Partition,而DynamoDB的pimary key一般包含Partition key和Sort key,Partition key就是用来在多个Partition时决定当前数据分配到那个Partition。
数据表中每项可存储的大小是两者另外一个重要区别,AWS对表item设置了400KB的上限,而HBase的每项数据大小灵活可设,默认值 为10GB,最高可达100GB。读取时不需要复杂的判断。DynamoDB可以随时根据需要扩展或者缩减RCU和WCU,而且还支持Auto-Scaling。NoSQL数据库中经常会有存储文件、图片的需求,如果需要存储的项目大小超过400KB,就不能使用DynamoDB了。另外,Hbase对数据类型不设限,DynamoDB只支持Scalar类型数据,包括String, Number和Binary。
DynamoDB支持Secondary index,并且index自动与主表保持同步。HBase的Secondary Index则需要手动实现。DynamoDB的读取支持Eventually Consistency (EC) 或者Strongly Consistency (SC),EC不保证数据所有分片已同步,有可能读取还未完全写入所有分片的数据,而SC则会保持数据在所有分片上都是一致的。每个RCU支持每秒两个EC或者一个SC,每个数据块最大为4KB。EC是DynamoDB的默认模型,这样可以最大化读取速率。HBase的读写则都是SC,这意味着HBase的读写操作都是原子的(Atomic)。
DynamoDB和HBase都不支持跨多item或者跨多个表的事务型(transactional)操作,但它们都提供多item多表读写的批处理操作,但这不能保持事务性数据读写。
总结起来DynamoDB的最大优点就是以服务的方式提供,随用随取,使用方便,但这也是用户担心的地方,因为不透明,用户使用DynamoDB时的一大担忧就是被AWS绑死。相比之下,HBase开源,用户可以了解到HBase的底层实现,它更适合更大数据量的NoSQL数据库,但是HBase使用和维护的门槛也更高。