最近发现HBase官方文档里面关于region的内容写的很清晰,所以尝试把其中和region的基本概念有关的内容做了翻译和简单的补充。关于Region的split/compact等操作的相关内容网上已经很多了,所以这些方面本文不涉及,只对region的概念和状态图这两部分内容做了搬运。如果需要了解更多内容可以自行阅读原文。Region是HBase中管理数据的一个单位,日常的运维中有相当一部分和region有关,把region的一些基本概念搞清楚还是很有意义的。


Region的概念

Region是HBase中表数据分布和访问的基本单位。这句话有两层含义:
(1)从数据的逻辑概念来说,表按照rowkey范围划分为不同的region,region按照列族划分为不同的store,store中包含memstore和storefile。如下图:

关于HBase Region的一些基本概念_Java


(2)从数据的物理存储位置来说,region是数据分布的基本单位,表的数据会分布在多个RegionServer上面,而一个region的数据只会在一个RegionServer上面。一个RegionServer同时管理多个region。

Region状态图

在HBase2.0里面,Region的状态存储在hbase:meta表里面,hbase:meta本身的Region状态存储在zookeeper中。Region的状态图如下:

关于HBase Region的一些基本概念_Java_02


图中大部分状态应该都不需要翻译了,这里简单解释一下和merge/split有关的几个状态:
SPLITTING: 当一个region开始split时,RegionServer通知master该region处于此状态。
SPLIT: 表示这个Region已经完成了split操作。
SPLITTING_NEW: 表示这个Region是在当前正在进行中的split操作创建出的子Region。
MERGING: merge操作开始后(到结束之前),被Merge的Region处于此状态。
MERGED: 表示这个Region已经被合并了。
MERGING_NEW: 表示这个Region是当前正在进行中的merge操作创建出的。

图中状态迁移的过程描述如下:

1) master将region的状态由OFFLINE置为OPENING,并尝试将region分配到一个RegionServer上面。如果分配region的RPC请求失败(RegionServer没有收到),master会重试直到成功或超出最大重试次数。RegionServer收到分配请求后,开始打开region。

2) 如果分配region的RPC请求超出最大重试次数,master会将region置为CLOSING状态并尝试关闭region。

3) RegionServer打开region后,会一直通知master直到master将region状态置为OPEN并通知RegionServer。

4)如果RegionServer打开region失败,会通知master,master降region状态置为CLOSED并尝试在其他RegionServer打开region。

5) 如果master在多个RegionServer上都无法打开region(hbase.assignment.maximum.attempts,默认为10),会将region的状态置为FAILED_OPEN。之后不会对这个region做任何操作。对于FAILED_OPEN的region,只能通过hbase shell人工干预或重启master才会再次打开。

6) master把region状态由OPEN置为CLOSING。master会向RegionServer发送关闭region的请求,如果RegionServer没有收到,master会重试,直到RPC成功或达到最大重试次数。

7 )如果RegionServer不在线或抛出NotServingRegionException,master将region置为OFFLINE状态,并将region重新分配到其他RegionServer上面。

8 ) 如果RegionServer在线但是master一直调用失败(超过最大重试次数),master会将region置为FAILED_CLOSE状态。之后不会对这个region做任何操作。对于FAILED_CLOSE的region,同样只能通过hbase shell人工干预或重启master才会改变其状态。

9) RegionServer收到关闭region的请求后,关闭region并通知master。master将region置为CLOSED状态并重新分配到其他RegionServer。

10) 分配region前,master会先将处于CLOSED状态的region置为OFFLINE状态。

11) RegionServer在split region前通知master。master将region状态由OPEN置为SPLITTING并将两个新创建的region加入到RegionServer,这两个新的region初始状态为SPLITTING_NEW。

12 )通知master后,RegionServer开始split region。split结束后,master将被切分的region状态由SPLITTING置为SPLIT,新切分出的两个region的状态由SPLITTING_NEW置为OPEN。

13) 如果split失败,master将被切分的region状态由SPLITTING置为OPEN,新切分出的两个region的状态由SPLITTING_NEW置为OFFLINE。

14 )RegionServer在开始合并两个region前,首先通知master,master将这两个region的状态由OPEN置为MERGING,并创建一个新的region,将其状态置为MERGING_NEW。

15 )通知master后,RegionServer开始合并两个region。合并完成后,master将被合并的两个region的状态由MERGING置为MERGED,将新的region的状态由MERGING_NEW置为OPEN。

16) 如果合并失败,master将被合并的两个region的状态由MERGING置为OPEN,新创建的region的状态由MERGING_NEW置为OFFLINE。

17) 对处于FAILED_OPEN和FAILED_CLOSE状态的region,通过hbase shell重新分配,master会尝试再次关闭。



关于HBase Region的一些基本概念_Java_03