在计算机数据存储领域,一直是关系型数据库(RDBMS)的天下,以至于在传统企业的应用领域,许多应用系统设计都是面向数据库设计,也就是先设计数据库然后设计程序,,从而导致关系模型绑架对象模型。
为了解决关系数据库无法处理海量数据的不足,于是就有了NoSQL的概念。
NoSQL主要指非关系的、分布式的、支持海量数据存储的数据库设计模式。今天要说的就是HBase。
HBase就是专门用来存储海量数据的,下面来说说HBase可伸缩架构。
HBase可伸缩架构
HBase为可伸缩海量数据存储而设计,实现面向在线业务的实时数据访问延迟。HBase的伸缩性主要依赖其可分裂的HRegion及可伸缩的分布式文件系统HDFS实现。
HRegion是HBase负责数据存储的主要进程,应用程序对数据的读写操作都是通过和HRegion通信完成。通过上图我们可以看到在HBase中数据以HRegion为单位进行管理,也就是说如果一个数据要存储首先要找到HRegion然后将读写操作提交给HRegion,完成存储。
HRegionServer是物理服务器,每个HRegionServer上可以启动多个HRegion。当一个HRegion里面写入的数据太多达到配置的阈值,就会分裂成两个HRegion,并将HRegion在整个集群中进行迁移,以使HRegionServer的负载均衡。
每个HRegion中存储一段Key值区间[key1, key2)的数据,所有HRegion信息,包括存储的Key值区间、所在HRegionServer地址、访问端口号等,都记录在HMaster服务器上。为了HMaster高可用,HBase会启动多个HMaster,并通过Zookeeper选举出一个主服务器。
获取数据流程
应用程序通过Zookeeper获得主HMaster地址,输入key值获得这个key所在的HRegionServer地址,然后请求HRegionServer上的HRegion,获得所需要的数据。
数据写入过程也是一样,需要先得到HRegion才能继续操作。HRegion会把数据存储在若干个HFile格式的文件中,这些文件使用HDFS分布式文件系统存储,在整个集群内分布并高可用。
小结
HBase的核心设计目标是解决海量数据的分布式存储,和Memcached这类分布式缓存的路由算法不同,HBase的做法是按Key的区域进行分片,这个分片也就是HRegion。应用程序通过HMaster查找分片,得到HRegion所在的服务器HRegionServer,然后和该服务器通信,就得到了需要访问的数据。
HBase可扩展数据模型
传统的关系数据库为了保证关系运算的正确性,必须提前设计好数据库表里的结构就是DDL执行的那些语句,但是HBase做到了可扩展数据结构,也就是不修改表结构也能新增字段,HBase采用列族(ColumnFamily)进行设计。
这是一个学生的基本信息表,表中不同学生的联系方式各不相同,选修的课程也不同,而且将来还会有更多联系方式和课程加入到这张表,如果按照传统的关系数据库设计,无论是提前预设多少冗余字段都会捉襟见肘、疲于应付。
HBase在设计表的时候,只需要指定列族就可以,字段只需要写入的时候在指定就可以达到随机扩展的数据结构。
本质上来说,HBase这种列族的数据结构设计,实际上是把字段的名称和字段的值,以key-value方式一起存储在HBase中。实际写入的时候随意指定字段名称。即使有几百万个字段也能轻松应对。
HBase的高性能存储
为了提高数据写入速度,HBase使用了LSM树,也就是Log结构合并树,数据写入的时候以Log方式连续写入,然后异步对磁盘上的多个LSM树进行合并。
LSM树可以看做是一个N阶合并树。数据写操作(rud没有create)都在内存中进行,并且创建一个新纪录。这些数据在内存中仍然还是一颗排序树,当数据量超过设定的内存阈值后,就会和最新的排序树合并,当这棵排序树的数据量也超过设定阈值后,会和下一级的排序树合并,并且覆盖旧数据。
使用LSM树存储的方式,让数据可以通过连续写磁盘的方式去保存,提升了很多的性能。
但是如果突然宕机,就需要一个操作日志来记录数据,当这些数据与集群数据合并时这段时间的部分数据是访问不到的。