HBase不同版本中对WAL日志的处理

本文深入探讨了HBase在不同版本(尤其是2.3.2和1.6)中处理WAL日志的差异。在HBase 2.3.2中,数据追加到WAL并同步后才写入MemStore,而1.6版本仅执行append,同步操作发生在写入MemStore后。详细阐述了WAL的append、sync策略以及异常处理机制,对数据一致性保障进行了分析。

我们知道,HBase在处理写流程(put操作)时,RegionServer会先将数据Append到WAL日志中,在写入MemStore,这时就返回客户端通知成功了。但是,在不同的版本中(HBase 1.6和Hbase 2.x),处理WAL的具体逻辑有很大区别。因此,网络中不同的文章可能会让读者感到迷惑,我们不妨从源码中一探究竟。

HBase 2.3.2的流程:
1、对要操作的数据添加行锁(List(RowKey)),并添加读锁(这个锁是HRegion类里的可重入读写锁)
2、对数据更新timestamp字段(如果提交put请求的数据没有指定timestamp,HBase客户端会给一个Long.MAX_VALUE作为时间戳的值,RegionServer也会根据这个值判断是否对时间戳更新)
3、Append the WALEdits to WAL and sync。将WALEdits追加到WAL日志,并进行同步。其中append和同步是一个生产消费模型,append是生产者,将数据写入RingBuffer中,RingBuffer是一个线程安全的消息队列。(采用了disruptor框架,该框架是LMAX开发的高性能队列,Storm中也有使用)
在这里插入图片描述
数据append成功后,会有一个txid,然后执行sync()。
在这里插入图片描述
其中sync也有对应的不同策略,主要的策略有默认(sync)、aync、fsync等,其中的区别可以参考linux关于IO同步的策略。
4、写入MemStore
5、完成操作。主要是执行

<think>嗯,用户这次的问题聚焦在HBaseWAL日志体系上,特别是想理清WAL的类型划分、清理机制以及HLog与WAL的关系。从用户引用的资料来看,ta应该已经接触过一些基础概念,但可能被官方文档里交替出现的WAL/HLog/Procedure WAL等术语搞混了。 用户提到的几个引用很有价值。引用[1][3]详细说明了WAL的核心组件(WALKey/WALEdit/FSHLog),引用[2]提到多WAL机制(HBASE-5699),引用[4]则涉及wal滚动间隔的配置。不过要注意用户特别强调的"hbase.master.cleaner.ttl是否控制所有WAL"这个问题——这里存在关键概念区分:普通数据WAL和Procedure WAL的清理机制是不同的。 关于HLog和WAL的关系,需要从历史版本演进解释。早期版本确实用HLog类实现WAL功能,但2.0之后FSHLog成为默认实现。这个术语变迁容易造成混淆,就像Hadoop里JobTracker和YARN的关系。 用户可能还隐含了一个需求:想通过配置参数优化集群。比如当ta问"hbase.master.cleaner.ttl是否控制所有WAL"时,实际是担心配置错误导致磁盘爆满。所以回答时要特别强调Procedure WAL和普通数据WAL各自对应的清理参数。 最后那个"是否等同"的问题需要谨慎。从技术上说HLog是WAL的具体实现类,但日常交流中工程师们经常混用这两个词。就像我们会把纸巾统称为"Kleenex"那样——这个类比或许能帮助用户理解术语的模糊性。</think>以下是关于HBaseWAL日志的详细解析,结合引用内容整理关键点: --- ### 一、WAL日志的类型及作用 1. **普通数据WAL(Write-Ahead Log)** - **核心作用**:确保数据写入的持久性,在MemStore刷盘前记录所有数据修改操作(Put/Delete等),防止RegionServer宕机导致数据丢失[^1][^3]。 - **关键类**: - `WALKey`:包含`regionName`(Region标识)、`tableName`(表名)、`writeTime`(写入时间)、`clusterIds`(数据复制用)[^1][^3]。 - `WALEdit`:封装单次事务中的多个修改操作,支持序列化[^1][^3]。 - `FSHLog`:WAL的核心实现类,负责将日志写入HDFS[^1][^3]。 2. **Procedure WAL** - **作用**:记录系统级操作(如建表、Region迁移),保证分布式操作的原子性(非用户数据操作)[^1]。 - **清理机制**:由`hbase.master.cleaner.ttl`控制存活时间(默认24小时)[^1],与普通WAL独立。 3. **多WAL机制(MultiWAL)** - 支持每个RegionServer配置多个WAL文件(HBase 1.0+),通过`hbase.wal.provider=multiwal`启用,提升高并发写入吞吐量[^2]。 --- ### 二、WAL清理机制解析 1. **普通数据WAL清理**: - 触发条件:MemStore数据刷盘(Flush)到HFile后,对应的WAL日志不再需要。 - **清理参数**: - `hbase.regionserver.logroll.period`:控制WAL滚动周期(默认1小时)[^4]。 - **非**`hbase.master.cleaner.ttl`:该参数仅作用于Procedure WAL[^1]。 2. **Procedure WAL清理**: - 由`TimeToLiveProcedureWALCleaner`插件管理,通过`hbase.master.cleaner.ttl`(默认86400000ms)控制TTL[^1]。 > ✅ **关键结论**:`hbase.master.cleaner.ttl` **仅控制Procedure WAL的清理**,普通数据WAL的清理依赖MemStore刷盘和日志滚动机制。 --- ### 三、HLog与WAL的关系 - **HLog是WAL的历史实现**:早期HBase版本中,WAL功能由`HLog`类实现。 - **FSHLog是当前默认实现**:HBase 1.0+ 将`FSHLog`作为WAL的核心实现(参考引用[^3]),负责日志写入HDFS、RingBuffer缓存管理及同步机制[^3]。 - **术语习惯**: - 在架构讨论中,**WAL是通用概念**,指预写日志机制。 - **HLog常作为WAL的代称**(尤其在旧版文档中),但严格说`HLog`已是历史类名。 > ✅ **简答**:RegionServer中的HLog即WAL机制的具体实现,两者在功能上等同,但代码实现已演进为`FSHLog`。 --- ### 四、WAL写入流程(引用[^3]) 1. **日志封装**:RPC Handler将操作封装为`WALKey`+`WALEdit`,组成`FSWALEntry`。 2. **写入缓存**:通过Disruptor框架的RingBuffer异步缓存日志。 3. **持久化**:`FSHLog`的专属线程将数据写入HDFS。 4. **同步控制**:若持久化级别为`SYNC_WAL`,需等待数据同步完成。 ```mermaid graph LR A[客户端写入请求] --> B[RPC Handler封装WALEntry] B --> C[写入RingBuffer缓存] C --> D[FSHLog线程持久化到HDFS] D --> E{同步策略} E -->|SYNC_WAL| F[等待HDFS确认] E -->|ASYNC_WAL| G[异步返回] ``` --- ### 配置参数总结 | **参数** | **作用范围** | **默认值** | |-----------------------------------|----------------|------------------| | `hbase.wal.provider` | 普通数据WAL | `defaultProvider` | | `hbase.regionserver.logroll.period` | 普通数据WAL滚动 | 3600000ms (1小时) | | `hbase.master.cleaner.ttl` | Procedure WAL | 86400000ms (24小时) | | `hbase.procedure.store.wal.count` | Procedure WAL数量 | 4 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值