HBase WAL

WAL

RegionService内部架构图,一个RegionServer包含一个BlockCache、一个或多个WAL(默认只有1个,在HBase1.0可以开启MultiWAL功能,开始支持多个WAL。参见HBASE-5699)和多个Region。


预写日志(Write-ahead log,WAL)也称为HLog,WAL在Hbase中有两个核心作用。

  • 其一,用于实现数据的高可用性,Hbase随机写入时,并非直接写入HFile文件,而是先写入缓冲,再异步刷新落盘。为了防止缓存的数据丢失,数据写入缓存之前需要首先顺序写入WAL。这样,即使缓存丢失,仍可以通过WAL日志恢复;
  • 其二,用于实现Hbase集群主从复制,通过回放集群推送归来的WAL日志实现主从复制。

默认情况下,所有写入操作(写入、更新以及删除)的数据都先以追加的形式写入WAL,再写入MemStore。

WAL文件存储

WAL文件被创建出来后会放在/hbase/WALs下(这该文件夹在HDFS上。在0.94版本之前WALs目录的名称为.log),一旦WAL文件过期,则会被移动到/hbase/oldWALs下(该文件夹在HDFS上。在0.94版本之前oldWALs目录的名称为.oldlogs)。

hbase/WALs目录下通常会有多个子目录,每个子目录代表一个对应的RegionServer。

/hbase
    /WALs
        /<RegionServer>    (RegionServers)
            /<WAL>         (WAL files for the RegionServer)

示例:
/hbase/WALs/host1,16020,1585535973311
host1表示对应的RegionServer域名,16020为端口号;1585535973311为目录生成时的时间戳。
每个子目录下存储该RegionServer内的所有WAL文件,
/hbase/WALs/host1,16020,1585535973311/host1%2C16020%2C1585535973311.1587237184832

可以通过 hbase wal 命令查看具体WAL文件中的记录内容。

WAL生命周期

WAL文件生成之后并不会永久存储在系统中,它的使命完成后,文件就会失效最终被删除。整个WAL生命周期如下图所示:

WAL生命周期包含4个阶段:

1)WAL构建:HBase的任何写入(更新、删除)操作都会先将记录追加写入到WAL文件中。
2)WAL滚动:HBase后台启动一个线程,每隔一段时间(由参数'hbase.regionserver.logroll.period'决定,默认1小时)进行日志滚动。日志滚动会新建一个新的日志文件,接收新的日志数据。日志滚动机制主要是为了方便过期日志数据能够以文件的形式直接删除。
3)WAL失效:写入数据一旦从MemStore中落盘,对应的日志数据就会失效。为了方便处理,HBase中日志失效删除总是以文件为单位执行。查看某个WAL文件是否失效只需确认该WAL文件中所有日志记录对应的数据是否已经完成落盘,如果日志中所有日志记录已经落盘,则可以认为该日志文件失效。一旦日志文件失效,就会从/hbase/WALs文件夹移动到/hbase/oldWALs文件夹。注意此时WAL并没有被系统删除。
4)WAL删除:Master后台会启动一个线程,每隔一段时间(参数'hbase.master.cleaner.interval',该参数从HBase 2.0+开始由原先的1分钟改成了10分钟)检查一次文件夹oldWALs下的所有失效日志文件,确认是否可以删除,确认可以删除之后执行删除操作。确认条件主要有两个:

  • 该HLog文件是否还在参与主从复制。对于使用HLog进行主从复制的业务,需要继续确认是否该HLog还在应用于主从复制。
  • 该HLog文件是否已经在OldWALs目录中存在10分钟。为了更加灵活地管理HLog生命周期,系统提供了参数设置日志文件的TTL(参数'hbase.master.logcleaner.ttl',默认10分钟),默认情况下oldWALs里面的HLog文件最多可以再保存10分钟。

WAL持久化等级

HBase定义了多个WAL持久化等级,使得用户在数据高可靠和写入性能之间进行权衡。通过设置WAL的持久化等级决定是否开启WAL机制以及WAL的落盘方式。WAL的持久化等级分为如下五个等级。

  • SKIP_WAL:只写MenStore,不写WAL日志,既关闭WAL。因为只写内存,因此这种方式可以极大地提升写入性能,但RegionServer宕机的时候有可能会丢失部分数据;
    在实际应用过程中并不建议设置此等级,除非确认不要求数据的可靠性。
  • ASYNC_WAL:异步将WAL持久化到硬盘,因为是异步操作所以在异常的情况下也有可能丢失少量数据;。
  • SYNC_WAL:同步将WAL持久化到操作系统缓存,再由操作系统将数据异步持久化到磁盘,需要注意的是,数据只是被写入文件系统中,并没有真正落盘。HDFS Flush策略详见HADOOP-6313
    这种场景下RegionServer宕掉并不会丢失数据,当操作系统宕掉会导致部分数据丢失;
  • FSYNC_WAL:同步将数据写入日志文件并强制落盘。这是最严格的日志写入等级,可以保证数据不会丢失,但是性能相对比较差。
  • USER_DEFAULT:如果用户没有指定持久化等级,默认HBase使用SYNC_WAL等级持久化数据

可以选择通过调用下面语句来设置WAL持久化等级。Put、Append、Increment、Delete都是Mutation的子类,所以它们都有setDurability方法。

Mutation.setDurability(Durability.SKIP_WAL);

异步写入WAL

当进行改动时,比如Put、Delete、Append来到Region的时候会先放在内存中,最后flush到HFile中。但是这些改动在放入region中的Memstore之前就被立刻写入了WAL中。写入的方式是调用HDFS客户端来写入HDFS,也就是说即使只有一个改动,也会调用HDFS接口来同步(sync)WAL数据。

如果不想完全关闭WAL,又不想每次改动都写入WAL,可以选择采用异步的方式来同步WAL。设定方式还是调用setDurability()方法:

Mutation.setDurability(Durability.ASYNC_WAL);

这样设定后Region会等到条件满足的时候才把操作写入WAL。这里提到的条件主要指的是时间间隔
hbase.regionserver.optionallogflushinterval,默认值是1s。这个时间间隔的意思是HBase间隔多久会把操作从内存写入WAL。

如果使用异步的方式写入WAL的时候出错了怎么办?
出错了是没有任何事务保证的,写入WAL的数据即使写入成功了,如果失败的话也会丢失。如果系统对性能要求极高、对数据一致性要求不高,并且系统的性能瓶颈出现在WAL上的时候,可以考虑使用异步写入WAL。否则,使用默认的配置即可。

WAL滚动

WAL一定是一个环状的滚动日志结构,因为这种结构写入效果最高,而且可以保证空间不会持续变大。

WAL的检查间隔由hbase.regionserver.logroll.period定义,默认值为1小时。检查的内容是把当前WAL中的操作跟实际持久化到HDFS上的操作比较,看哪些操作已经被持久化了,被持久化的操作就会被移动到/hbase/oldWALs文件夹内。
一个WAL实例包含有多个WAL文件。WAL文件的最大数量通过hbase.regionserver.maxlogs(默认是32)参数来定义,这个值的大小要怎么定义涉及性能调优,参见WAL的优化

触发滚动的条件:

  • 一个WAL实例包含的WAL文件数量超过了阀值限定。
  • 当WAL文件所在的块(Block)快要满了。
  • 当WAL所占的空间大于或者等于某个阀值,该阀值的计算公式是:
    hbase.regionserver.hlog.blocksize * hbase.regionserver.logroll.multiplier
    hbase.regionserver.hlog.blocksize是标定存储系统的块(Block)大小的,如果是基于HDFS的,那么只需要把这个值设定成HDFS的块大小即可。
    实际上,如果不设定hbase.regionserver.hlog.blocksize,HBase还是会自己去尝试获取这个参数的值。不过,还是建议设定该值。
    hbase.regionserver.logroll.multiplier是一个百分比,默认设定成0.95,意思是95%,如果WAL文件所占的空间大于或者等于95%的块大小,则这个WAL文件就会被归档到oldWALs文件夹。

先写WAL还是先写MemStore?

在0.94版本之前,Region中的写入顺序是先写WAL再写MemStore,这与WAL的定义也相符。
但在0.94版本中,将这两者的顺序颠倒了,当时颠倒的初衷,是为了使得行锁能够在WAL sync之前先释放,从而可以提升针对单行数据的更新性能。详细问题单,请参考HBASE-4528。
在2.0+版本中,这一行为又被改回去了,原因在于修改了行锁机制以后,发现了一些性能下降,而HBASE-4528中的优化却无法再发挥作用,详情请参考HBASE-15158。改动之后的逻辑也更简洁了。


《Hbase不睡觉书》笔记

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值