Hbase-WAL机制

更新于 2月15日  约 4 分钟

一.什么是Hbase的WAL机制
Hbase的Write Ahead Log(WAL) 提供了一种高并发,持久化的日志保存和回放机制。数据的写入操作(PUT/DELETE) 执行前,都会先写Hlog。
下图是Hbase写入数据的流程图。
Client将操作封装成KeyValue对象,通过RPC调用发送给HRegionServer,Server会将请求分发给它所管理的HRegion列表,HRegions首先会调用HLog将日志写入配置指定的地方,随后将数据写入缓存(MemStore),缓存满足条件(数据量达到一定大小/经过一段时间)后,数据会异步写入文件系统中(StoreFile/HFile),当然WAL是可配置的。
一个RegionServer对应一个HLog
p1.png

二.WAL有何作用
1.WAL最重要的作用是灾难恢复,和Mysql的BIN log类似,它记录着 所有数据的改动。一旦服务器崩溃,通过重放log,可以恢复崩溃之前的数据。如果写入WAL失败,整个操作则失败。
2.HLog通过"sequence number(序列号)" 追踪数据改变。Region打开存储文件。读取每个HFile中的最大的序列号,如果该值大于HLog的序列号,就将这个值设置为Hlog的序列号。HLog将得到上次存入文件和继续记log的点。
p2.png
如上图所示,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)
p3.png
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操作刷写到磁盘上。

阅读 41更新于 2月15日

推荐阅读
目录