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