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 原理与实际》一书