Hbase-09-Hlog
HLog
1.概述
Hlog又称为WAL(write ahead log),目的就是为了防止内存数据丢失做的备份。故名思义就是在数据写入memory store之前,先把数据写入到这个wal日志文件中。
HBase的Write Ahead Log (WAL)提供了一种高并发、持久化的日志保存与回放机制。每一个业务数据的写入操作(PUT / DELETE)执行前,都会记账在WAL中。
如果出现HBase服务器宕机,则可以从WAL中回放执行之前没有完成的操作。
2.Hlog的作用:
- 故障恢复
- 主从复制
3.HLog文件内容
/hbase/WALs :
存储当前还未过期的日志
➜ WALs pwd
/usr/local/var/hbase/WALs
➜ WALs cd localhost,16020,1625402408661
➜ localhost,16020,1625402408661 ls
localhost%2C16020%2C1625402408661.1625438436526 localhost%2C16020%2C1625402408661.meta.1625438426514.meta
# Hlog 内容
➜ localhost,16020,1625402408661 cat localhost%2C16020%2C1625402408661.1625438436526
PWAL"ProtobufLogWriter*5org.apache.hadoop.hbase.regionserver.wal.WALCellCodecLAWP%
/hbase/oldWALs:
存储已经过期的文件
➜ oldWALs pwd
/usr/local/var/hbase/oldWALs
➜ oldWALs
HBase中所有数据(包括HLog以及用户实际数据)都存储在HDFS的指定目录。
4.HLog 文件结构
- 每个ReginServer 会拥有一个或者多个HLog(默认只有1个,1.1版本可以开启MultiWAL功能,允许多个HLog)
- 每个Hlog是多个region共享的,如图RegionA、RegionB、ReginC共享。
- 图中每个小单元格代表一次行级跟新的最小单元。
- HlogKey 由seq num、write time 、cluster ids 、region name、table name 组成。
- WALEdit 用来表示一个事务中的更新集合。
HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是”写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue。
5.WAL 持久化级别
HBase 中可以通过设置 WAL 的持久化等级决定是否开启 WAL 机制、以及 HLog 的落盘方式。
- USE_DEFAULT: 如果没有指定持久化级别,则默认为 USE_DEFAULT, 这个为使用 HBase 全局默认级别(SYNC_WAL)
- SKIP_WAL: 不写 WAL 日志, 这种可以较大提高写入的性能,但是会存在数据丢失的危险,只有在大批量写入的时候才使用(出错了可以重新运行),其他情况不建议使用。
- ASYNC_WAL: 异步写入
- SYNC_WAL: 同步写入wal日志文件,保证数据写入了DataNode节点。
- FSYNC_WAL: 目前不支持了,表现是与SYNC_WAL是一致的
package org.apache.hadoop.hbase.client;
import org.apache.hadoop.hbase.classification.InterfaceAudience;
import org.apache.hadoop.hbase.classification.InterfaceStability;
@InterfaceAudience.Public
@InterfaceStability.Evolving
public enum Durability {
/* Developer note: Do not rename the enum field names. They are serialized in HTableDescriptor */
/**
* If this is for tables durability, use HBase's global default value (SYNC_WAL).
* Otherwise, if this is for mutation, use the table's default setting to determine durability.
* This must remain the first option.
*/
USE_DEFAULT,
/**
* Do not write the Mutation to the WAL
*/
SKIP_WAL,
/**
* Write the Mutation to the WAL asynchronously
*/
ASYNC_WAL,
/**
* Write the Mutation to the WAL synchronously.
* The data is flushed to the filesystem implementation, but not necessarily to disk.
* For HDFS this will flush the data to the designated number of DataNodes.
* See <a href="https://issues.apache.org/jira/browse/HADOOP-6313">HADOOP-6313<a/>
*/
SYNC_WAL,
/**
* Write the Mutation to the WAL synchronously and force the entries to disk.
* (Note: this is currently not supported and will behave identical to {@link #SYNC_WAL})
* See <a href="https://issues.apache.org/jira/browse/HADOOP-6313">HADOOP-6313<a/>
*/
FSYNC_WAL
}
6.HLog 生命周期
Hlog构建:
HBase的任何写入(更新、删除)操作都会先将记录追加写入到HLog文件中。
Hlog滚动:
HBase后台启动一个线程,每隔一段时间(由参数'hbase.regionserver. logroll.period'决定,默认1小时)进行日志滚动。日志滚动会新建一个新的日志文件,接收新的日志数据。日志滚动机制主要是为了方便过期日志数据能够以文件的形式直接删除。
Hlog失效:
写入数据一旦从MemStore中落盘,对应的日志数据就会失效。为了方便处理,HBase中日志失效删除总是以文件为单位执行。查看某个HLog文件是否失效只需确认该HLog文件中所有日志记录对应的数据是否已经完成落盘,如果日志中所有日志记录已经落盘,则可以认为该日志文件失效。一旦日志文件失效,就会从WALs文件夹移动到oldWALs文件夹。注意此时HLog并没有被系统删除。
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 原理与实践》
https://blog.csdn.net/xiaohu21/article/details/108347550
https://www.jianshu.com/p/230065273340
https://lihuimintu.github.io/2019/06/03/WAL-of-HBase-Source-Code-Analysis/
https://cloud.tencent.com/developer/article/1004496?from=14588