作用
一般在HBase中写数据都是写到MemStore中,MemStore是内存,如果该RegionServer宕机了,那么内存中的数据就丢失了,所以HBase加入了WAL预写日志,写数据先写WAL,然后在写MemStore,这样就可以保证RegionServer宕机也可以从WAL中来恢复数据了,HLog就是实现WAL的类
和MySQL的主从复制一样,HBase的主从复制也是通过将HLog数据发送给从集群来实现
持久化级别
WAL有五种持久化级别,每一种级别都有不同的行为,对性能的影响也不同 | 持久化级别 | 行为 | | :—-: | :—-: | | SKIP_WAL | 不写WAL日志,直接把数据写入各个Store里的MemStore,这样的话,如果MemStore数据还没flush到HFile里去,此时hbase重启或者宕机,可能导致一部分数据丢失的 | | ASYNC_WAL | 异步将数据写入到HLog日志文件里去,这个就是写入都返回告诉你成功了,然后异步去把WAL日志写入HLog文件里去,如果宕机,那么还没来同步的HLog就会丢失 | | SYNC_WAL | 同步把WAL日志写入到HLog日志文件里去,但是这种持久化级别下,仅仅是把数据写入到hdfs的文件里,停留在hdfs的操作系统的os cache里,还不是直接flush到底磁盘上去,所以也有很小的几率造成数据丢失,这种级别也是HBase默认的级别 | | FSYNC_WAL | 这个是同步把WAL日志写入到HLog文件里,同时直接强制将hdfs OS中的缓存flush到磁盘上去,,数据只要返回给你说写入成功了,那就绝对不会丢失,因为他肯定是已经flush到底层hdfs的磁盘上去了 | | USER_DEFAULT | 默认级别,就是SYNC_WAL |
文件结构
每个RegionServer只有一个HLog,所有的Region共享这一个HLog(在1.1版本中可以开启MultiWAL功能,允许有多个HLog)
HLog中WALEntry为单位追加到HLog中,WALEnrty又分为HLogKey和WALEdit

HLogKey由table name、region name和sequenceid等字段组成,WALEdit用来表示一个事务的更新集合
HLog文件存储
HBase下的所有数据都存储在HDFS指定的目录中,CDH中默认为/hbase下,其中和WAL相关的目录有两个/hbase/WALs和/hbase/oldWALs,前者保存还没有过期的WAL日志,后者保存已经过期的WAL日志

- /hbase/WALs通常会有多个子目录,格式类似于tbdata01.wisdom.com,16020,1608511873150,tbdata01.wisdom.com为RegionServer的域名,16020为端口号,1608511873150是该目录生成的时间戳

- 该目录的子目录就是HLog日志文件了

同时可以使用hbase wal命令来查看HLog的详细信息 加-j参数可以以json格式打印HLog内容
HLog生命周期
HLog构建:HBase的更新、删除操作都会先将记录追加到HLog文件中
HLog滚动:HBase会在后台启动一个线程,每隔一段时间(由参数hbase.regionserver.logroll.period决定)就会进行滚动,滚动会新建一个HLog文件,后续的操作就会写入新的HLog文件中,滚动的主要目的就是方便过期的日志文件可以以文件的形式进行删除
HLog失效:如果MemStore中的数据一旦落盘,那么HLog所对应得日志就失效了,但是由于HLog日志得删除是以文件来执行的,所以查看某个HLog是否失效就需要去看日志记录中的数据是否全部落盘,如果全部落盘那么就说明HLog就失效了,该HLog文件就会从/hbase/WALs文件夹移动至/hbase/oldWALs文件夹中
HLog删除:Master后台会启动一个线程,每隔一段时间(由hbase.master.cleaner.interval参数决定)就会检测/habse/oldWALs里面的文件是否可以删除,判断是否可以删除有两个条件,满足以下条件就会删除HLog文件
- 判断HLog是否还在参数主从复制
- 判断HLog文件在/hbase/oldWALs存在的时间是否超过一定的时间(由hbase.master.logcleaner.ttl参数决定),
