Hbase 的 WAL 在 RegionServer 基本调用过程

作者介绍:熊训德

Hbase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。本文档用于说明 hbase 的 wal 简单原理以及从源码的角度分析一个“写”请求是如何到达 wal ,wal 又会做哪些请求。

特别说明 Hbase 不同版本的wal的源码差异比较大,但是原理几乎类似,本文档是采用当前线上使用版本( Hbase1.1.3 )来分析的。

简单原理

有关 hbase 的 wal 基本原理在《Hbase权威指南》以及网络教程中叙述的算比较清晰详尽,在此只做简单的叙述。

hbase 是基于 LSM 树的存储系统,它使用日志文件和内存存储来的存储架构将随机写转换成顺序写,以此保证稳定的数据插入速率。而这里说的日志文件即是wal文件,用于在服务器崩溃后回滚还没持久化的数据。

WAL(Write-Ahead-Log) 是 HBase 的 RegionServer 在处理数据插入和删除的过程中用来记录操作内容的一种日志。大致过程如下图所示,首先客户端启动一个操作来修改数据,每一个修改都封装到 KeyValue 对象实例中,并通过RPC调用发送到含有匹配 Region 的 HRegionServer 。一旦 KeyValue 到达,它们就会被发送管理相应行的 HRegion 实例。数据被写到 WAL,然后被放入到实际拥有记录的存储文件的 MemStore 中。同时还会检查 MemStore 是否满了,如果满了就会被刷写到磁盘中去。

wal调用链源码分析

本节将从源码角度如上所简述分析hbase的一个“写”过程。

其中基本调用过程如下:

从时序图中可以大体看到

  1. 首先 client 端先把 put/delete 等 api 操作封装成List<MutationProto>,然后使用 protobuf 协议使用 rpc 服务发送到对应的 HRegionServer ,HRegionServe r调用 execRegionServerService() 方法解析发送过来的 protobuf 协议二进制包,通过 serviceName 找到相应的 service 并调用 callMethod 方法执行:
  1. put/delet 等“写”操作会使用 MultiRowMutationService 这个 service 来作用,在 service 中将会调用 mutateRows( )方法去处理List<MutationProto>,真正调用 mutateRows() 的是 MultiRowMutationService 的一个实现类MultiRowMutationEndpoint ,MultiRowMutationEndpoint 类实现了 hbase 的行事务。从 MultiRowMutationEndpoint类文档可以看出其主要作用:

mutateRows() 方法会 row 所找到对应的 Region,并调用其对应实例 HRegion 的 mutateRowsWithLocks 方法具体实现写入过程。

  1. 在HRegion 类中 mutateRowsWithLocks 方法查看有没执行器 (RowProcessor) ,如果没有则创建一个再调用processRowsWithLocks() 方法。processRowsWithLocks 方法是整个“写”操作最核心的方法:把写wal,刷wal以及写memstore流程都在这里流转。在这里包括异常处理一共有14步之多。 它的原型如下:

其中processor的实现类是MultiRowMutationProcessor。 虽然processRowsWithLocks方法步骤很多,但是最关键的是如下几步:

在这里,HRegion将会对Region加锁,加锁的方式是把所有写row相关的行锁都拿到的二阶段锁方式。

在这里将会把List放入,但是这里并不是真正的放到了memstore,真正的执行会等sync()方法把日志或者说WALEdite真正刷入磁盘后,通过mvcc版本号异步通知再把数据写到memstore。

在这里HRegion会把封装好的WALEdit使用FSHLog的append方法追加到日志文件,但是由于文件本身在内存中有缓存的原因,还需要调用sync刷入磁盘。这里只是把WALEdit数据放到一个LMAX Disrutpor RingBuffer中。这个RingBuffer是一个线程安全的消息队列,在wal中主要用于有效且安全的协调多个生产者一个消费者模型。其中多个生产者就是这个append方法,将会有很多client产生数据都放到这个消息队列中,但是只有一个消费者从这个队列中取数据并调用sync方法把数据从缓存刷到磁盘,这样能保证WAL日志并发写入时日志的全局唯一顺序。 (其中有关LMAX Disrutpor RingBuffer可以参看文章,介绍的非常详尽:https://github.com/LMAX-Exchange/disruptor/wiki/Introduction)

在这步中会会调用syncOrDefer方法,除了metaRegion,syncOrDefer将根据client设置的持久化等级选择是否调用wal(FSHLog)的sync方法

HBase中可以通过设置WAL的持久化等级决定是否开启WAL机制、以及HLog的落盘方式。

client可以通过设置WAL持久化等级,如代码:put.setDurability(Durability. SYNC_WAL );

1.1.3版本的WAL的持久化等级分为如下四个等级:

USER_DEFAULT:默认如果用户没有指定持久化等级,HBase使用SYNC_WAL等级持久化数据。

SKIP_WAL:只写缓存,不写HLog日志。这种方式因为只写内存(memstore),因此可以提升写入性能,但是数据有丢失的风险。

ASYNC_WAL:异步将数据写入HLog日志中。

SYNC_WAL:同步将数据写入日志文件中,有可能只是被写入文件系统中,并没有真正落盘。

FSYNC_WAL:同步将数据写入日志文件并强制落盘。最严格的日志写入等级,可以保证数据不会丢失,但是性能相对比较差。

如代码中所示当前sync_wal和fsync_wal采用的是同一策略都是:调用HFLog的sync()方法。sync()是一个阻塞方法,需要等到数据真正的刷到磁盘后,便会唤醒它,然后工作线程返回写入memstore,完成一次“写”操作。

小结

Hbase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。本文档在介绍hbase基本“写”原理后着重从源码角度,比较浅显地分析了一个“写”操作后在RegionServer的调用过程,为以后继续更深入学习研究hbase“写”过程梳理了脉络。

相关推荐

Hbase写入hdfs源码分析

Hbase WAL线程模型源码分析

HBase跨版本数据迁移总结

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏岑玉海

oozie 安装过程详解

1.从apache的官网下载oozie3.3.2 2.编译oozie,以下命令用root来执行吧,它不做任何的测试的,因为一测试就会出错的 官网...

3704
来自专栏java架构师

Hadoop学习6--里程碑式的开始之执行第一个程序wordcount

一、先在HDFS文件系统创建对应的目录,具体如下: 1、待处理文件存放目录  /data/wordcount(之所以创建wordcount,是为了对文件分类,对...

2606
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第十九天 Linux学习【悟空教程】

UNIX操作系统是商业版,需要收费,价格比Microsoft Windows正版要贵一些。不过UNIX有免费版的,例如:NetBSD等类似UNIX版本。

1314
来自专栏阿杜的世界

【转】分布式协调服务ZooKeeper工作原理ZooKeeper是什么整体结构工作流程

大数据处理框架Hadoop、Redis分布式服务Codis、淘宝的分布式消息中间件MetaMQ ……他们都使用ZooKeeper做为基础部件,可以看出ZooKe...

873
来自专栏帘卷西风的专栏

linux的一些运维指令和技巧

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)

650
来自专栏鸿的学习笔记

不一样的日志

这里提的日志并不是应用程序产生的日志,应用程序产生的日志是以一种人类读得懂的方式展示程序运行信息的记录方式,本身不包含任何数据,这篇文章所要描述的日志指的数据系...

1025
来自专栏闵开慧

hadoop图解

gateway机器是跳板机,提交job到云梯的,在gateway机器上只要配置hadoop-site.xml即可,配置文件中主要是指定jobtracker的地...

38010
来自专栏姚姝娜的专栏

关于 Git 的那些事

本篇文章主要讲了下 Git 的一些基本的概念以及如果使用 git log 的命令来进行一段时间段的代码量统计,其中还可以统计不同作者修改的代码量,其中关于 gi...

4471
来自专栏沈唁志

Windows下PHPStudy中的Apache无法启动的解决方法

2443
来自专栏lonelydawn的前端猿区

基于java swing的设备管理系统

一.系统介绍 一个简易的设备管理系统,包含了管理员登录注册、设备录入、设备状态管理功能,具体状态有购买时、正在运行、正在修理和已报废。 二.开发环境 开发环境:...

2537

扫码关注云+社区