我们知道,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、完成操作。主要是执行

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

被折叠的 条评论
为什么被折叠?



