当前位置: 主页 > 大数据 >

完善region assign的流程

Master端:
1.regionserver下线,zk中注册的rs节点下的server子路径session过期被删除,
  master触发RegionServerTracker.nodeDeleted监听事件,并调用ServerManager.expireServer
2.把下线的server添加到deadServers列表中,同时从onlineServers列表中移出此server,
3.触发ServerShutdownHandler.process方法,执行Hlog 的split操作。
4.通过AssignmentManager.assign执行region的分配操作,得到现在可用的所有servers
5.通过LoadBalancer.roundRobinAssignment把要分配的region平均到4中得到的可用servers中。
6.如果配置的balancer实现是FavoredNodeLoadBalancer,那么执行其getFavoredNodes,
  得到每个region可转移的servers列表.
7.检查是否达到批量分配region条件,如果是,执行GeneralBulkAssigner.bulkAssign,否则直接使用assign
8.设置每一个region的状态为offline,同时在zk的region-in-transition中注册此region名称的子路径,
  设置此路径的zk的event type 为M_ZK_REGION_OFFLINE,并生成一个RegionTransition添加到此节点的内容中
9.生成region的RegionPlan实例。并把RegionPlan添加到AssignmentManager.regionPlans列表中。
10.把region的assign状态更新为PENDING_OPEN状态
11.通过ServerManager.sendOpenRegion去请求regionserver的rpc连接,
  并把连接存储到ServerManager.rsAdmin列表中,调用regionserver.openRegion方法开始执行openRegion


RegionServer端:
1.region server接收到openRegion的rpc请求,并解析出要open的所有的region列表
2.检查region是否在RegionServer.onlineRegions中存在,
  同时meta表中此region在当前RegionServer.regionsInTransitionInRS中为非closing状态,
  表示region已经在此server上存在,设置此region的响应状态为ALREADY_OPENED,执行下一个region open
3.region在当前server中不存在,添加region到regionsInTransitionInRS中,设置值为true
4.从RegionServer中的movedRegions列表中移出此region,
5.如果distributedLogReplay设置为true,检查此region在zk中的recovering-regions路径下是否存在,
  如果存在,把region添加到recoveringRegions列表中。
5.1开始执行6与后面的其它流程,同时设置此region的响应状态为OPENED,执行下一个region open
6.此处开始异步执行,检查是否是meta region,如果是执行OpenMetaHandler,否则执行OpenRegionHandler
7.在zk中的region-in-transition路径下把eventtype的状态从M_ZK_REGION_OFFLINE设置为RS_ZK_REGION_OPENING
7.1:master中通过AssignmentManager.nodeDataChanged来处理zk中状态的修改,更新region状态为OPENING,
  触发RegionStates.notify,
8.调用HRegion.openRegion来生成此region实例,openRegion最终调用HRegion.newHRegion,生成HRegion实例
9.调用HRegion实例的openRegion方法。openRegion-->initialize-->initializeRegionInternals
10.调用initializeRegionStores初始化加载region下所有的cf,开启线程调用instantiateHStore,
  并加载每一个cf中的store file,
  得到所有的store中所有的store file中最大的sequenceid与maxMemstoreTS,
  初始化region mvcc的memstoreWrite/memstoreRead为最大的maxMemstoreTS+1
  初始化此Hregion实例的next sequence id(openSeqNum)为最大的sequenceid+1
11.执行replayRecoveredEditsIfAny进行日志重播.得到一个replay后的最大seqid,
  与region store加载得到sequenceid取最大值返回去计算next sequence id.
  Replay会查找region是否存在recovered.edits路径,
  如果distributedLogReplay设置为true,在region open时此路径不存在,因此region的open会相对很快。
12.如果设置有distributedLogReplay为true,同时recoveringRegions列表中包含此region(zk中存在)
  设置HRegion实例的isRecovering=true,
13.执行OpenRegionHandler.updateMeta,生成并启动OpenRegionHandler.PostOpenDeployTasksThread线程
  region的assign分配超时时间通过进行hbase.master.assignment.timeoutmonitor.timeout配置,
  默认为600000ms
  执行HRegionServer.postOpenDeployTasks方法,检查所有store是否需要做compact,并发起compact请求
  如果是user region,更新meta表中此region的location信息,
   主要是region所在的regionserver,当前region实例开启时的sequence id.
  如果是meta region,更新zk中meta-region-server路径下的内容为当前的regionserver
14.更新zk中recovering-regions路径下region的last seqid,每一个store的last seqid.
15.从HRegionServer的regionsInTransitionInRS列表中移出此region,添加到onlineRegions列表中
16.把zk中region-in-transition路径下把eventtype的状态从RS_ZK_REGION_OPENING设置为RS_ZK_REGION_OPENED
16.1:master中通过AssignmentManager.nodeDataChanged来处理zk中状态的修改,更新region状态为OPEN,
  把region对应的regionserver添加到RegionStates.lastAssignments中,触发RegionStates.notify,
  生成一个OpenedRegionHandler实例,并执行其process处理,检查如果region的状态为open,
  同时zk中此region的eventtype为RS_ZK_REGION_OPENED,删除zk中region-in-transition路径下此region的路径
16.2:master中更新region状态为open后会删除zk中此region的transition路径,
  触发AssignmentManager.nodeDeleted处理。
  从RegionStates.regionsInTransition中移出此region的transition,
  在RegionStates.regionAssignments中添加此region对应的server
  在RegionStates.serverHoldings中此server中添加此open成功的region
  • 发表于: