下面介绍一下HBase集群中主要角色的作用:
HMaster
HBase集群的主节点,可以配置多个,用来实现HA,主要作用:
1.为RegionServer分配region
2.负责RegionServer的负载均衡
3.发现失效的RegionServer,重新分配它负责的region
4.hdfs上的垃圾文件回收(标记为删除的且经过major compact的文件)
5.处理schema更新请求
RegionServer(以下简称RS)
HBase集群的从节点,负责数据存储,主要作用:
1.RS维护HMaster分配给它的region,处理对这些region的IO请求
2.RS负责切分在运行过程中变得过大的region
Zookeeper(以下简称ZK)
1.通过选举,保证任何时候,集群中只有一个active master(HMaster与RS启动时会向ZK注册)
2.存贮所有region的寻址入口,如-ROOT-表在哪台服务器上
3.实时监控RS的状态,将RS的上下线信息通知HMaster
4.存储HBase的元数据,如有哪些table,每个table有哪些column family
client包含访问HBase的接口,维护着一些缓存来加速对HBase的访问,比如region的位置信息。
client在访问HBase上数据时不需要HMaster参与(寻址访问ZK和RS,数据读写访问RS),HMaster主要维护着table和region的元数据信息,负载很低。
HBASE数据存储
通过之前的HBase系统架构图,可以看出:
1.HBase中table在行的方向上分割为多个region,它是HBase负载均衡的最小单元,可以分布在不同的RegionServer上,但是一个region不能拆分到多个RS上
2.region不是物理存储的最小单元
region由一个或者多个store组成,每个store保存一个column family。每个store由一个memstore和多个storefile组成,storefile由hfile组成是对hfile的轻量级封装,存储在hdfs上。
3.region按大小分割,默认10G,每个表一开始只有一个region,随着表中数据不断增加,region不断增大,当增大到一个阀值时,region就会划分为两个新的region。
当表中的数据不断增多,就会有越来越多的region,这些region由HMaster分配给相应的RS,实现负载均衡。
HBase底层存储基于hdfs,但对于为null的列并不占据存储空间,并且支持随机读写,主要通过以下机制完成:
1.HBase底层存储结构依赖了LSM树(Log-structured merge tree)
2.数据写入时先写入HLog,然后写入memstore,当memstore存储的数据达到阈值,RS启动flush cache将memstore中的数据刷写到storefile
3.客户端检索数据时,先在client缓存中找,缓存中找不到则到memstore找,还找不到才会从storefile中查找
4.storefile底层以hfile的形式存储到hdfs上,当storefile达到一定阈值会进行合并
5.minor合并和major合并小文件,删弃做过删除标记的数据
WAL log
即预写日志,该机制用于数据的容错和恢复,每次更新都会先写入日志,只有写入成功才会通知客户端操作成功,然后RS按需自由批量处理和聚合内存中的数据。
每个HRegionServer中都有一个HLog对象,它负责记录数据的所有变更,被同一个RS中的所有region共享。
HLog是一个实现预写日志的类,在每次用户操作写入memstore之前,会先写一份数据到HLog文件中,