RegionServer是HBase零碎中最外围的组件,次要负责用户数据写入、读取等根底操作。RegionServer组件实际上是一个综合体系,蕴含多个各司其职的外围模块:HLog、MemStore、HFile以及BlockCache。

RegionServer内部结构

RegionServer是HBase零碎响应用户读写申请的工作节点组件,由多个外围模块组成,其内部结构如图所示。

一个RegionServer由一个(或多个)HLog、一个BlockCache以及多个Region组成。其中,HLog用来保证数据写入的可靠性;BlockCache能够将数据块缓存在内存中以晋升数据读取性能;Region是HBase中数据表的一个数据分片,一个RegionServer上通常会负责多个Region的数据读写。一个Region由多个Store组成,每个Store寄存对应列簇的数据,比方一个表中有两个列簇,这个表的所有Region就都会蕴含两个Store。每个Store蕴含一个MemStore和多个HFile,用户数据写入时会将对应列簇数据写入相应的MemStore,一旦写入数据的内存大小超过设定阈值,零碎就会将MemStore中的数据落盘造成HFile文件。HFile寄存在HDFS上,是一种定制化格局的数据存储文件,不便用户进行数据读取。

HLog

HBase中系统故障复原以及主从复制都基于HLog实现。默认状况下,所有写入操作(写入、更新以及删除)的数据都先以追加模式写入HLog,再写入MemStore。大多数状况下,HLog并不会被读取,但如果RegionServer在某些异常情况下产生宕机,此时曾经写入MemStore中但尚未f lush到磁盘的数据就会失落,须要回放HLog补救失落的数据。此外,HBase主从复制须要主集群将HLog日志发送给从集群,从集群在本地执行回放操作,实现集群之间的数据复制。

HLog文件构造

HLog文件的根本构造如图所示。

阐明如下:

•每个RegionServer领有一个或多个HLog(默认只有1个,1.1版本能够开启MultiWAL性能,容许多个HLog)。每个HLog是多个Region共享的,图中Region A、Region B和Region C共享一个HLog文件。

•HLog中,日志单元WALEntry(图中小方框)示意一次行级更新的最小追加单元,它由HLogKey和WALEdit两局部组成,其中HLogKey由table name、region name以及sequenceid等字段形成。

WALEdit用来示意一个事务中的更新汇合,在0.94之前的版本中,如果一个事务对一行row R三列c1、c2、c3别离做了批改,那么HLog中会有3个对应的日志片段,如下所示:

然而,这种日志构造无奈保障行级事务的原子性,如果RegionServer更新c2列之后产生宕机,那么一行记录中只有局部数据写入胜利。为了解决这样的问题,HBase将一个行级事务的写入操作示意为一条记录,如下所示:

其中,WALEdit会被序列化为格局<-1, # of edits, , , >,比方<-1, 3, , , >,-1为标识符,示意这种新的日志构造。

HLog文件存储

HBase中所有数据(包含HLog以及用户理论数据)都存储在HDFS的指定目录(假如为hbase-root)下,能够通过hadoop命令查看hbase-root目录下与HLog无关的子目录,如下所示:

其中,/hbase/WALs存储以后还未过期的日志;/hbase/oldWALs存储曾经过期的日志。能够进一步查看/hbase/WALs目录下的日志文件,如下所示:

/hbase/WALs目录下通常会有多个子目录,每个子目录代表一个对应的RegionServer。以hbase17.xj.bjbj.org,60020,1505980274300为例,hbase17.xj.bjbj.org示意对应的RegionServer域名,60020为端口号,1505980274300为目录生成时的工夫戳。每个子目录下存储该RegionServer内的所有HLog文件,如下所示:

HLog文件为:

HLog生命周期

HLog文件生成之后并不会永恒存储在零碎中,它的使命实现后,文件就会生效最终被删除。HLog整个生命周期如图所示。

HLog生命周期蕴含4个阶段:

1)HLog构建:HBase的任何写入(更新、删除)操作都会先将记录追加写入到HLog文件中。

2)HLog滚动:HBase后盾启动一个线程,每隔一段时间(由参数'hbase.regionserver. logroll.period'决定,默认1小时)进行日志滚动。日志滚动会新建一个新的日志文件,接管新的日志数据。日志滚动机制次要是为了不便过期日志数据可能以文件的模式间接删除。

3)HLog生效:写入数据一旦从MemStore中落盘,对应的日志数据就会生效。为了不便解决,HBase中日志生效删除总是以文件为单位执行。查看某个HLog文件是否生效只需确认该HLog文件中所有日志记录对应的数据是否曾经实现落盘,如果日志中所有日志记录曾经落盘,则能够认为该日志文件生效。一旦日志文件生效,就会从WALs文件夹挪动到oldWALs文件夹。留神此时HLog并没有被零碎删除。

4)HLog删除:Master后盾会启动一个线程,每隔一段时间(参数'hbase.master.cleaner. interval',默认1分钟)查看一次文件夹oldWALs下的所有生效日志文件,确认是否能够删除,确认能够删除之后执行删除操作。确认条件次要有两个:

•该HLog文件是否还在参加主从复制。对于应用HLog进行主从复制的业务,须要持续确认是否该HLog还在利用于主从复制。

•该HLog文件是否曾经在OldWALs目录中存在10分钟。为了更加灵便地治理HLog生命周期,零碎提供了参数设置日志文件的TTL(参数'hbase.master.logcleaner.ttl',默认10分钟),默认状况下oldWALs外面的HLog文件最多能够再保留10分钟。

文章基于《HBase原理与实际》一书