一.什么是Hbase的WAL机制
Hbase的Write Ahead Log(WAL) 提供了一种高并发,持久化的日志保存和回放机制。数据的写入操做(PUT/DELETE) 执行前,都会先写Hlog。
下图是Hbase写入数据的流程图。
Client将操做封装成KeyValue对象,经过RPC调用发送给HRegionServer,Server会将请求分发给它所管理的HRegion列表,HRegions首先会调用HLog将日志写入配置指定的地方,随后将数据写入缓存(MemStore),缓存知足条件(数据量达到必定大小/通过一段时间)后,数据会异步写入文件系统中(StoreFile/HFile),固然WAL是可配置的。
一个RegionServer对应一个HLogsql
二.WAL有何做用
1.WAL最重要的做用是灾难恢复,和Mysql的BIN log相似,它记录着 全部数据的改动。一旦服务器崩溃,经过重放log,能够恢复崩溃以前的数据。若是写入WAL失败,整个操做则失败。
2.HLog经过"sequence number(序列号)" 追踪数据改变。Region打开存储文件。读取每一个HFile中的最大的序列号,若是该值大于HLog的序列号,就将这个值设置为Hlog的序列号。HLog将获得上次存入文件和继续记log的点。
如上图所示,3个不一样的region,每一个负责一段rowkey的范围。这些region共享同一个Hlog实例,不难看出,region间的数据写入WAL的顺序是不肯定的。
3.Hlog利用HMaster恢复和切分一个已经崩溃的HRegionServer 遗留下来的log,随后从新部署regions缓存
三.WAL工做原理
1.HLogKey/KeyValue
如上图所示,WAL中保存了HLogKey和KeyValue
以下图所示HLogKey中包含Region,表名,序列号,写入时间。
KeyValue中包含rowkey,列簇,限定符,时间戳,value,操做类型(PUT/DELETE)
2.LogFlusher
LogFlusher的缓存会按期(hbase.regionserver.optionallogflushinterval)刷写到文件系统,另外写入日志的过程当中也会按期(hbase.regionserver.flushlogentries)刷写
3.LogRoller
Log的大小经过配置(hbase.regionserver.logroll.period)来限制,默认是一个小时,每隔一小时,会打开一个新的log文件,长此以往会有一大堆的文件须要维护。首先LogRoller定时滚动日志,随后清除旧日志。它会先取得存储文件中的最大的sequence number,以后检查是否存一个log全部条目的序列号均低于这个值,若是存在,将删除这个log
4.Replay
当Region server崩溃后,当HMaster启动或检测到region server崩溃,它将日志文件拆分为多个文件,将其存储到region所属的文件夹,以后region server打开所管辖的region,
它将检查是否存在剩余的log文件,若是存在将重放这个日志,将日志中的条目加入到Memstore中,最后flush操做刷写到磁盘上。服务器