首页 > 数据库 > 数据库开发技术 > HBase的Region迁移流程





HBase是一个分布式系统,对于分布式系统,负载均衡,故障恢复是非常重要的。而这些都依赖于分片迁移,实际上即Region迁移。一方面,保证集群内所有节点的分片数目大致均衡。另一方面,保证发生故障时数据不丢失。Region迁移可以分为两个阶段:unassign阶段,assign阶段。



Region状态可以分为13个状态,具体如下表,除了OOFLINE状态,这些状态又可根据不同过程分为4个过程。分别为打开过程,关闭过程,合并过程,分裂过程。
打开过程:包含OPENING,OPEN,FAILED_OPEN等状态。
关闭过程:包含CLOSING , CLOSED,FAILED_CLOSE状态。
分裂过程:包含SPLITING,SPLIT,SPLITING_NEW状态。
合并过程:MERGING,MERGED , MERGING_NEW状态。
具体如下:
| Region状态 | 含义 |
| OFFLINE | 下线状态 |
| OPENING | 正在打开状态 |
| OPEN | 正常打开状态 |
| FAILED_OPEN | 打开失败状态 |
| CLOSING | 正在关闭状态 |
| CLOSED | 正常关闭状态 |
| FAILED_CLOSE | 关闭失败状态 |
| SPLITING | 正在分裂状态 |
| SPLIT | 完成分裂状态 |
| SPLITING_NEW | 分裂时产生新Region |
| MERGING | 正在合并状态 |
| MERGED | 完成合并状态 |
| MERGING_NEW | 合并后生成新Region |


unassign的含义是Region从源RegionServer上下线,涉及的服务有Hmaster,RegionServer,ZooKeeper。总体可分为以下六个步骤:
1).HMaster与ZooKeeper交互,生成事件M_ZK_REGION_CLOSING并更新到ZooKeeper组件,同时将本地内存中该Region的状态修改为PENDING_CLOSE。
2).HMaster与RegionServer交互,HMaster通过RPC发送close命令给拥有该Region的RegionServer,并关闭该Region。
3).RegionServer与ZooKeeper交互,RegionServer接收到Master发送过来的命令后,生成一个RS_ZK_REGION_CLOSING事件,更新到ZooKeeper中。
4).HMaster与ZooKeeper交互,HMaster监听到ZooKeeper节点变动后,更新内存中Region的状态为CLOSING。
5).RegionServer执行Region关闭操作,如果该Region正在执行flush或者Compaction操作,则等待操作完成。否则将该Region下的所有MemStore强制flush,然后关闭Region相关的服务。
6).RegionServer与ZooKeeper交互,HMaster与ZooKeeper交互,关闭相关服务后,生成RS_ZK_REGION_CLOSED事件,并更新到ZooKeeper。HMaster监听到ZooKeeper节点变动后,更新该Region的状态为CLOSED。

assign的含义是Region在目标RegionServer上线。涉及的服务与unassign阶段一致。也可以分为六个阶段:
1).HMaster与ZooKeeper交互,HMaster生成事件M_ZK_REGION_OFFLINE,并更新到ZooKeeper组件,同时将本地内存中该Region的状态修改为PENDING_OPEN。
2).HMaster与RegionServer交互,HMaster通过RPC发送open命令给拥有该Region的RegionServer,令其打开该Region。
3).RegionServer与ZooKeeper交互,RegionServer接收到HMaster发送过来的命令后,生成一个RS_ZK_REGION_OPENING事件,更新到ZooKeeper。
4).HMaster与ZooKeeper交互,HMaster监听到ZooKeeper节点变动后,更新内存中Region的状态为OPENING。
5).RegionServer执行Region打开操作,初始化相应的服务。
6).RegionServer与ZooKeeper交互,HMaster与ZooKeeper交互。Region打开完成之后生成事件RS_ZK_REGION_OPENED,更新到ZooKeeper,HMaster监听到ZooKeeper节点变动后,更新该Region的状态为OPEN。


在unassign和assign的过程中,HMaster,RegionServer和ZooKeeeper会有一系列的交互,但是每个人负责的职责不一样。
对于HMaster,在整个过程中,会负责维护Region在整个操作中的状态变化,相当于一个中枢系统。
对于RegionServer,在整个过程中,RegionServer相当于一个执行者,严格执行来自HMaster的指令,即打开或者关闭Region问题。
ZooKeeper相当于一个中转站,负责存储操作过程中的事件,ZooKeeper上有一个存储HBase的Region相关信息的节点,路径为/hbase/region-in-transition,当Region发生assign或者unassign操作,就会在该节点下生成一个子节点,子节点的内容是"事件"经过序列化的字符串,并且Master会在这个子节点上监听,无论发生任何事件,HMaster都可以监听到并更新Region的状态。
另外,无论是在unassign还是在assign操作中,都包括多个子操作以及多个组件的协调合作,隐藏需要通过记录Region状态才会知道当前进度,也便于在发生异常时进行有效恢复。Region状态会存储在meta表,HMaster内存以及ZooKeeper的region-in-transition节点。详细如下:
meta表只存储RegionServer所在的RegionServer,不存储中间状态。
HMaster内存中存储整个集群所有的Region信息,可以查看某个region目前在哪个RegionServer上及状态。HMaster上的Region状态由RegionServer通过ZooKeeper传递给HMaster的,因此是滞后于真正的Region状态变更。在HBase Master WebUI上看到的Region状态即来自于此。
ZooKeeper中存储的是临时性的状态转移信息,如果HMaster或者RegionServer在region迁移的某个阶段发生异常,ZooKeeper上存储的状态可以在异常恢复后作为依据进行迁移操作。
只有meta表,HMaster内存,ZooKeeper三者中的状态一致,对应的Region才会处于正常状态,当三者不能处于一致时。便会触发region-in-transition(RIT)现象。但对于Region在迁移的过程中会出现短暂的RIT现象这种场景无需人工干预。

这几天有点懈怠了,今天学习了一下HBase中Region迁移的相关知识点,但是涉及到RIT的部分,因为没有实际遇到过,感觉不是很理解,先清楚这个概念吧,后续实际遇到了再做深入学习吧。

END




原文作者:DBA修行之路;如有侵权,请联系管理员删除。