数智资源网
首页 首页 大数据 大数据入门 查看内容

HBase原理-RegionServer宕机数据恢复

木马童年 2020-10-17 08:52 13 0

HBase采用类LSM的架构体系,数据写入并没有直接写入数据文件,而是会先写入缓存(Memstore),在满足一定条件下缓存数据再会异步刷新到硬盘。为了防止数据写入缓存之后不会因为RegionServer进程发生异常导致数据丢失, ...

HBase采用类LSM的架构体系,数据写入并没有直接写入数据文件,而是会先写入缓存(Memstore),在满足一定条件下缓存数据再会异步刷新到硬盘。为了防止数据写入缓存之后不会因为RegionServer进程发生异常导致数据丢失,在写入缓存之前会首先将数据顺序写入HLog中。如果不幸一旦发生RegionServer宕机或者其他异常,这种设计可以从HLog中进行日志回放进行数据补救,保证数据不丢失。HBase故障恢复的最大看点就在于如何通过HLog回放补救丢失数据。

HLog简介

为了更好的理解HBase故障恢复原理,需要对HLog有简单的认识。HLog的整个生命历程可以使用下面一张图来表示:

  HBase原理-RegionServer宕机数据恢复

1. HLog构建:详见另一篇博文《HBase-数据写入流程解析》中相关章节,此处再将HLog的结构示意图拿出来:

  HBase原理-RegionServer宕机数据恢复

上图可以看出,一个HLog由RegionServer上所有Region的日志数据构成,日志数据的最小单元为,其中HLogKey由sequenceid、writetime、clusterid、regionname以及tablename组成。其中sequenceid是日志写入时分配给数据的一个自增数字,先写入的日志数据sequenceid小,后写入的sequenceid大。,waledit>

2. HLog滚动:HBase后台启动了一个线程会每隔一段时间(由参数’hbase.regionserver.logroll.period’决定,默认1小时)进行日志滚动,即新生成一个新的日志文件。可见,HLog日志文件并不是一个大文件,而是会产生很多小文件。有些同学就会问了,为什么需要产生多个日志文件,一个日志文件不好吗?这是因为随着数据的不断写入,HLog所占空间将会变的越来越大,然而很多日志数据其实已经没有任何作用了,这部分数据完全可以被删掉。而删除数据最好是一个文件一个文件整体删除,因此设计了日志滚动机制,方便文件整体删除。类似于Binlog的处理机制。

3. HLog失效:上文提到,很多日志数据在之后会因为失效进而可以被删除,并且删除操作是以文件为单元执行的。那怎么判断一个日志文件里面的数据失效了呢?首先从原理上讲一旦数据从Memstore中落盘,对应的日志就可以被删除,因此一个文件所有数据失效,只需要看该文件中最大sequenceid对应的数据是否已经落盘就可以,HBase会在每次执行flush的时候纪录对应的最大的sequenceid,如果前者小于后者,则可以认为该日志文件失效。一旦判断失效就会将该文件从WALs文件夹移动到OldWALs文件夹。

4. HLog删除:HMaster后台会启动一个线程每隔一段时间(由参数’hbase.master.cleaner.interval’,默认1分钟)会检查一次文件夹OldWALs下的所有失效日志文件,确认是否可以被删除,确认之后执行删除操作。又有同学问了,刚才不是已经确认可以被删除了吗?这里基于两点考虑,第一对于使用HLog进行主从复制的业务来说,第三步的确认并不完整,需要继续确认是否该HLog还在应用于主从复制;第二对于没有执行主从复制的业务来讲,HBase依然提供了一个过期的TTL(由参数’hbase.master.logcleaner.ttl’决定,默认10分钟),也就是说OldWALs里面的文件最多依然再保存10分钟。

HBase故障恢复三部曲

HBase的故障恢复我们都以RegionServer宕机恢复为例,引起RegionServer宕机的原因各种各样,有因为Full GC导致、网络异常导致、官方Bug导致(close wait端口未关闭)以及DataNode异常导致等等。

这些场景下一旦RegionServer发生宕机,HBase都会马上检测到这种宕机,并且在检测到宕机之后会将宕机RegionServer上的所有Region重新分配到集群中其他正常RegionServer上去,再根据HLog进行丢失数据恢复,恢复完成之后就可以对外提供服务,整个过程都是自动完成的,并不需要人工介入。基本原理如下图所示:

  HBase原理-RegionServer宕机数据恢复

HBase检测宕机是通过Zookeeper实现的, 正常情况下RegionServer会周期性向Zookeeper发送心跳,一旦发生宕机,心跳就会停止,超过一定时间(SessionTimeout)Zookeeper就会认为RegionServer宕机离线,并将该消息通知给Master。上述步骤中比较特殊的是HLog切分,其他步骤相信都能够理解,为什么需要切分HLog?大家都知道当前(0.98)版本中一台RegionServer只有一个HLog文件,即所有Region的日志都是混合写入该HLog的,然而,回放日志是以Region为单元进行的,一个Region一个Region回放,因此在回放之前首先需要将HLog按照Region进行分组,每个Region的日志数据放在一起,方便后面按照Region进行回放。这个分组的过程就称为HLog切分。

根据实现方式的不同,HBase的故障恢复前后经历了三种不同模式,如下图所示,下面会针对每一种模式进行详细介绍:

  HBase原理-RegionServer宕机数据恢复

LogSplitting

HBase的最初阶段是使用如下流程进行日志切分的,整个过程都由HMaster控制执行。如下图所示:

  HBase原理-RegionServer宕机数据恢复

1. 将待切分日志文件夹重命名,为什么需要将文件夹重命名呢?这是因为在某些场景下RegionServer并没有真正宕机,但是HMaster会认为其已经宕机并进行故障恢复,比如最常见的RegionServer发生长时间Full GC,这种场景下用户并不知道RegionServer宕机,所有的写入更新操作还会继续发送到该RegionServer,而且由于该RegionServer自身还继续工作所以会接收用户的请求,此时如果不重命名日志文件夹,就会发生HMaster已经在使用HLog进行故障恢复了,但是RegionServer还在不断写入HLog

2. 启动一个读线程依次顺序读出每个HLog中所有数据对,根据HLogKey所属的Region不同写入不同的内存buffer中,如上图Buffer-Region1内存存放Region1对应的所有日志数据,这样整个HLog所有数据会被完整group到不同的buffer中,waledit>

3. 每个buffer会对应启动一个写线程,负责将buffer中的数据写入hdfs中(对应的路径为/hbase/table_name/region/recoverd.edits/.tmp),再等Region重新分配到其他RegionServer之后按顺序回放对应Region的日志数据。

这种日志切分可以完成最基本的任务,但是效率极差,在某些场景下(集群整体宕机)进行恢复可能需要N个小时!也因为恢复效率太差,所以开发了Distributed Log Splitting架构。                

数据丢失 HBase
0
为您推荐
小甲鱼数据结构与算法,资源教程下载

小甲鱼数据结构与算法,资源教程下载

课程名称小甲鱼数据结构与算法,资源教程下载课程目录:01 数据结构和算法绪论02 谈谈…...

云帆大数据Hadoop从入门到上手企业开发8天学习视频,资源教程下载

云帆大数据Hadoop从入门到上手企业开发8天学习视频,

课程名称云帆大数据Hadoop从入门到上手企业开发8天学习视频,资源教程下载课程介绍超…...

数据分析工具之spss/amos精品课程零基础到精通,资源教程下载

数据分析工具之spss/amos精品课程零基础到精通,资源

课程名称数据分析工具之spss/amos精品课程零基础到精通,资源教程下载课程介绍Matlab…...

郝斌数据结构系列培训学习视频,资源教程下载

郝斌数据结构系列培训学习视频,资源教程下载

课程名称郝斌数据结构系列培训学习视频,资源教程下载课程目录01:什么叫做数据结构02…...

2017算法与数据结构C++精解-慕课网,资源教程下载

2017算法与数据结构C++精解-慕课网,资源教程下载

课程名称2017算法与数据结构C++精解-慕课网,资源教程下载课程目录第1章 当我们谈论算…...

Spark Streaming实时流处理项目实战,Spark与Spark Streaming核心架构系统实践课程下 ...

Spark Streaming实时流处理项目实战,Spark与Spark St

课程名称Spark Streaming实时流处理项目实战,Spark与Spark Streaming核心架构系统实…...