5.HMaster对HRegion的管理:master将region的分派,状态管理等工作委托给RegionManager
(1)RegionManager成员变量:rootRegionLocation,root region所在regionserver地址;
rootScannerThread和MetaScanner,root及meta region的扫描线程;
numberOfMetaRegions,meta regions数量由rootScannerThread设置;
onlineMetaRegions,在线的meta regions
regionsInTransition,记录正在状态变化中的region,region的状态有:
UNASSIGNED-等待分配到server
PENDING_OPEN-告诉server打开,但还未完成
OPEN-已打开region,但尚未在meta region中标识
CLOSING-已将close msg放入队列中,但还尚未发送到regionserver
PENDING_CLOSE-已将regionserver发送给regionserver
CLOSED-已关闭region,但尚未在meta region中标识
maxAssignInOneGo,一次分配给一个regionserver的最多region数量
LoadBalancer,负责regionserver间负载均衡
regionsToSplit,regionsToCompact,regionsToMajorCompact,regionsToFlush,需split/compact/MajorCompact/Flush的region
(2)RegionManager工作流程:
HMaster初始化时创建RegionManager实例;
清除RegionManager中root region的地址及状态信息,设置root region状态为UNASSIGNED并加入regionsInTransition中;
HMaster启动各种后台服务时,RegionManager后台启动rootScannerThread和metaScannerThread线程;
regionserver向master报告时,ServerManage在regionServerReport方法中调用RegionManager来处理跟region相关的msg.
(3)RegionManager处理各种Region相关HMsg
a.regionserver正在关闭
RegionManager关闭该regionserver上的所有region,包括root,meta和user region,并对root meta和online的user regionr重新分配,对offline user region从regionsInTransition删除其状态信息
b.regionserver已open指定region
RegionManager判断该region是否重复分配了,重复分配则返回关闭该region指令;
若open的是root region,则在master的ServerConnection和RegionManager中记录root region所在地址;
若open user region,具体操作参见ServerManager
c.regionserver已关闭指定region:
关闭root region:???
关闭meta region:从RegionManager的onlineMetaRegions中删除该region;
regionsInTransition中设置该region为CLOSED;
向master的RegionServerOperationQueue中增加ProcessRegionClose操作:往meta中写入该region offline状态,或若该region需重新分配则RegionManager设置该region待分配状态
d.regionserver已split某个region:
读取连续的后两条HMsg从中取出分裂产生的两个HRegionInfo;
从regionsToSplit和regionsToCompact中删除被分裂的HRegionInfo;
从onlineMetaRegions中查找应包含新region的meta region,并尝试从对应的regionserver中读取新region,若存在则不做处理,不存在则将新region设置成待分配状态;
若meta region被分裂,则从onlineMetaRegions中删除掉该region,并增加meta region的数量numberOfMetaRegions;
(4)组织返回给regionserver的HMsg:
a.对一个标记为需Close的region,增加一条MSG_REGION_CLOSE的HMsg,并在中regionsInTransition设置其状态为PENDING_CLOSE
b.若正执行open region的数量少于hbase.regions.nobalancing.count指定的值,则从regionsInTransition中获取待分配的region(root region优先)
c.若无region分配给该regionserver,则比较该regionserver的region负载数量和整个集群的平均负载+slop系数(由参数hbase.regions.slop指定),由一算法(balanceFromOverloaded和balanceToLowloaded方法)
计算该regionserver需close的region数量,并从负载最严重的region中选择指定数量的非root、meta region和不在regionsInTransition中的region,发出HMsg在该regionserver中close这些region,并设置状态为PENDING_CLOSE
d.综合考虑多个整个集群的负载, 将需分配的region分配到多个regionserver:
通过ServerManager找出负载最轻的那些regionserver,分摊一些region到这些regionserver;
doRegionAssignment方法分配一个region到指定regionserver,设置状态状态为PENDING_OPEN,并发送MSG_REGION_OPEN消息;
e.从regionsToCompact,regionsToSplit,regionsToFlush,regionsToMajorCompact中获取需要执行对应操作的region并发送对应HMsg
(5)MetaScanner和RootScanner线程
这两个线程都继承自BaseScanner,通过初始化时扫描root和meta region可以知道所有的region并进行分配;当分裂一个region时,regionserver会通知master分配新region,但master可能
会丢失这些分裂信息,而新region通常没有regionserver的信息,因此周期性地扫描发现这些新region并进行分配。
a.RootScanner运行时机:master收到regionserver的root region被open指令;首次扫描后定期自动扫描
扫描过程描述:
从RegionManager获取root region所在rs地址;
通过master的ServerConnection获取HRegionInterface接口代理,遍历root region内所有meta region的记录;
检查region对应的HServerInfo是否存在,不存在则表示尚未分配rs,加入到regionsInTransition,设置状态为UNASSIGNED;
检查所有已分裂的parent,
b.MetaScanner运行时机:当一个meta region上线;定期自动扫描上线的meta region;扫描过程逻辑类似RootScanner