引用《https://blog.csdn.net/nigeaoaojiao/article/details/54909921》

hlog介绍:

hlog构建:

从图中可以看出,对于一个hlog日志,整一个region server中的region数据都写入到同一个日志中,日志中最小单元的格式为<HLogKey,WALEdit>

hlogKey格式:
  • sequenceid,自增id
  • write time,写入时间,修改操作何时写入日志的时间戳
  • cluster ids,集群id,满足用户多集群之间复制的需求
  • region 信息
  • table name,表名

hlog滚动:

region server每个一段时间就会生成一个log文件(默认1小时,可以设置),设置日志滚动机制,类似于binlog的处理机制。虽然会产生会多文件,但是考虑到删除文件时,直接将文件删除是最方便的方式。

hlog失效:

当一个日志文件的数据全部从MemStore中flush到了HFile中,该日志文件即可以被删除掉了。可以通过自增id——sequenceid判断,当一个文件中的sequenceid小于Memstore中flush记录的最大的sequenceid即可判断。当一个log被判定为失效后,会被移到oldWALs目录下

hlog删除:

hmaster后台启动一个线程每个一段时间(默认一分钟)检查文件夹OldWALs,判断下面的log是否真正的失效,确认失效即删除。

hbase日志恢复流程:

regionServer是否存活:

hbase中,master检查regionServer是否存活是通过zookeeper实现的,regionServer通过向zookeeper注册节点(/hbase/rs目录下),并且定时向zookeeper上报心跳来证明自己处于存活状态。master通过查看该目录的节点查看regionServer是否存活。

region server出问题的情况:

  • regionServer出现长时间的full gc
  • regionServer宕机
  • zookeeper出问题
  • 网络问题
  • 等等

在master看来,就是在zookeeper中查看不到具体的region Server注册的节点,这时候就会进行数据恢复。

hbase的日志恢复有三种方式:

  • logSplitting
  • Distributed log splitting
  • Distributed log replay

logSplitting:

hbase的日志分割方式,整个过程都由HMaster执行。

  1. 首先将日志复制一份,重命名后缀加-splitting。
  2. 启动一个线程依次读取log,根据hlogkey中不同的region,写入到不同的buffer中。知道全部的log读完
  3. 对应每个buffer启动一个线程,将每个buffer的数据写入到hdfs中
  4. 之后,等hmaster分配完region后,将hdfs中数据写入到对应的region中

因为是单线程恢复,在出现大量的机器宕机后,需要恢复的数据过大,耗时会变得非常长。

Distributed log splitting:

DLS是LS的分布式实现,借助了master和多个regionserver的计算能力,将hlog的splitting任务分散到不同的regionserver上。

  1. hmaster分别将每个log(该日志在hdfs上的路径)作为一个任务发布到zookeeper上(/hbase/splitWAL节点下),设置起始状态为TASK_UNASSIGNED。
  2. 所有存活的regionserver都注册这个节点上等待任务,一旦hmaster发布任务,全部regionserver开始竞争任务,即全部regionserver尝试修改任务状态为TASK_OWNED,修改成功即竞争成功。
  3. regionserver抢占任务成功后,分配任务给相应的线程处理。处理成功修改状态为TASK_DONE,失败修改状态为TASK_ERR。
  4. hmaster一直监听者该节点,一旦有状态修改就会收到通知,如果任务成功,则删除对应任务节点,如果任务失败,则从新发布任务。
  5. 具体regionserver处理一个任务的流程和LS处理流程一样

DLS有一个问题,生成的小文件过多,对于M个region,N个hlog日志最终会生成M*N个文件。

Distributed log replay:

DLR方式相对于DLS方式来说,流程上做了一些改动:

  • DLR先分配region,在切分回放HLog,region重新分配后状态被设置为recovering,该状态只能写不能读取。而在HLog splitting分配到buffer后,不写文件,而是直接执行回放操作。

hbase-数据恢复流程的更多相关文章

  1. hbase读写流程

    一. Hbase读流程 META表记录着表的原信息,根据rowkey查询META表,获取所在region信息 客户端去相应的regionServer查询数据,先查询memStore(memstore是 ...

  2. HBase Scan流程分析

    HBase Scan流程分析 HBase的读流程目前看来比较复杂,主要由于: HBase的表数据分为多个层次,HRegion->HStore->[HFile,HFile,...,MemSt ...

  3. 8.hbase写入流程和读取流程

    1 hbase写入流程 hbase中无论是新增数据还是修改已有行,其内部流程都是一样的,hbase执行写入时会写到两个地方,write-ahead log 简称wal 也叫hlog 预写式日志 和 M ...

  4. Mysql 数据恢复流程 基于binlog redolog undolog

    注:文中有个易混淆的地方 sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,同时undolog维护了此事务是否完成的状态. 日志持久化事务,为了保证redolog和 ...

  5. hbase读写流程分析

    前言 最近被大佬问到一个问题,hbase查询数据在最坏的场景下需要进行几次rpc,当时就懵了..下面主要对client端代码进行分析.阅读文章和看源码更配~ 读数据 流程总览 1. 从zookeepe ...

  6. oracle 执行 delete user$ 误删所有用户信息后的数据恢复流程

    起因: 在oracle测试过程中,不小心执行了delete user$ 命令,导致oracle当前实例所有的用户信息丢失,包括sys用户. 第一次使用DUL工具数据恢复:失败 下载ParnassusD ...

  7. Hbase读写流程和寻址机制

    写操作流程 (1) Client通过Zookeeper的调度,向RegionServer发出写数据请求,在Region中写数据. (2) 数据被写入Region的MemStore,直到MemStore ...

  8. Hbase获取流程

    1\\.客户端chou操作 2.服务器dauncaozuo操作 3\存储优化

  9. Hbase存储流程

  10. HBase 数据恢复

    参考链接: https://community.hortonworks.com/content/supportkb/48748/hbase-master-wont-start-with-followi ...

随机推荐

  1. 位运算练习:将整数A转换为B,需要改变多少个bit位

    思路解析: 将整数A转换为B,如果A和B在第i(0<=i<32)个位上相等,则不需要改变这个BIT位,如果在第i位上不相等,则需要改变这个BIT位.所以问题转化为了A和B有多少个BIT位不 ...

  2. [C#]位运算符

    参考链接: http://www.runoob.com/csharp/csharp-operators.html 表: 简单来说,就是: &:全1为1,否则为0 |:有1为1,否则为0 ^:不 ...

  3. thunderbird 163 smtp

    thunderbird 163 smtp 如果要正常发送,配置如下: server: smtp.163.com port: 465 auth: Normal password security: SS ...

  4. leetcode每日刷题计划-简单篇day6

    突发奇想&胡思乱想的一天 银行家算法证明错了并挂在黑板上的可怜希希 Num 53 最大子序和 Maximum Subarray O(n)的算法实现了,分治法有空补 class Solution ...

  5. zabbix3.x添加华为(93069306)网络设备详解

    转载自:https://www.cnblogs.com/yinzhengjie/p/6768006.html 前言: 欢迎加入:高级运维工程师之路 598432640 相信大家在看我的文章之前,也看过 ...

  6. Python第7天

    其他内置函数: abs() 绝对值 all()均为真则为True any()有一个为真就为True bin()十进制->二进制 bool() 空,0,None为False,其余为True byt ...

  7. Nexus构建

    参考文章: Maven远程仓库搭建与配置(https://my.oschina.net/u/1455528/blog/637063) Maven仓库—Nexus环境搭建及简单介绍(http://blo ...

  8. list之flex布局写法

    list之flex布局写法 移动端实际场景中经常会遇到将header置顶,然后下面list需要滚动的情况,通常的做法会是将header使用fixed的方式固定到顶部,然后list主体相对于header ...

  9. JavaScript值全等判断

    作为开发员,很多时候拿到数据之后都是要做数据判断,比较特别的情况就是我们需要做数组判断和对象判断,经常的我们就array === array ,object === object;但是可惜是我们得到的 ...

  10. Java并发编程随笔

    死锁:两个线程互相等待对方释放锁才可以继续运行. 避免死锁的常见方法: 1.避免一个线程同时获取多个锁 2.避免一个线程在锁内同时占用多个资源,尽量保证一个锁只占用一个资源 3.尝试使用定时锁,使用l ...