HBase源码阅读-5-HMaster对HRegion的管理

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

你可能感兴趣的:(工作,算法,hbase)