HMaster启动流程|青训营笔记

338 阅读4分钟

这是我参与【第四届青训营】笔记创造活动的第十天。

HMaster启动流程

  1. 先将自己加到backup master的ZK目录下,这样抢主失败了active master能感知到backup;
  1. 除非关闭master,无限循环尝试写入active master的ZK目录来抢主,成功的话从backup目录删除自己的znode;失败的话监听ZK上activeMaster的znode,主挂了就再次抢主
  1. 初始化文件系统相关组件

    1. MasterFileSystem - 封装对底层HDFS文件系统的交互
    2. MasterWalManager - 封装master分裂WAL操作,管理WAL文件、目录
    3. TableDescriptor - 管理table信息,预加载所有table的信息
  1. 发布clusterID到ZK,位于/hbase/hbaseid
  1. 加文件锁防止hbck1在hbase2集群执行造成数据损坏
  1. 初始化以下master状态管理组件

    1. ServerManager - 管理regionserver状态(online/dead),处理rs启动、关闭、恢复

    2. SplitWALManager - 代替ZK管理split WAL的procedures,

    3. ProcedureExecutor - 负责调度、执行、恢复procedures,包含以下组件

  • AssignmentManager - 负责调度region,包含以下组件

    1. RegionStates - 管理内存态的region状态,包括online/offline/RIT的region信息 RegionStateNode表示一个region的内存态状态,和meta表保持一致,会关联TransitRegionStateProcedure以保证最多一个RIT在并发
    2. RegionStateStore - 负责更新region state到meta表 AssignmentManager::start()方法从ZK路径meta-region-server加载meta region state,对第一个meta region(hbase:meta,,1.1588230740)上锁后设置region location、state、唤醒等待着meta region online的event
    3. 从procedure列表里找出RIT,即未完成的TransitRegionStateProcedure,由AssignmentManager::setupRIT方法将RIT的procedures绑定到regionStates里对应的region
  • RegionServerTracker - 监听ZK的rs目录管理online servers,对比ServerCrashProcedure列表、HDFS的WAL目录里的alive/splitting rs记录,delta就是dead servers,并分别调用ServerManager::expireServer安排ServerCrashProcedures;将online rs添加到ServerManager管理。

      1. SERVER_CRASH_ASSIGN_META:ZK模式进入此状态assign meta region上线,然后进入SERVER_CRASH_GET_REGIONS状态获取该宕机rs上的region列表,进入SERVER_CRASH_SPLIT_LOGS状态处理用户数据的WAL split,过程类似上述meta WAL split,全部完成后标记rs的ServerState状态OFFLINE。(非ZK模式通过SplitWALProcedure处理)
      2. SERVER_CRASH_ASSIGN状态assign该rs上所有挂掉的region后进入SERVER_CRASH_FINISH状态删除该rs,标记这个dead server处理完成
    1. TableStateManager - meta表确认已online才能启动,负责更新table state到meta表
  1. 初始化一系列ZK相关的trackers

    1. LoadBalancer
    2. RegionNormalizer
    3. LoadBalancerTracker
    4. RegionNormalizerTracker
    5. SplitOrMergeTracker
    6. ReplicationPeerManager
    7. DrainingServerTracker
    8. MetaLocationSyncer + MasterAddressSyncer (client ZK不是observer mode时需要)
    9. SnapshotManager
    10. MasterProcedureManagerHost
  1. InitializationMonitor - zombie master检测 HBASE-21535
  1. 如果是新建集群,安排InitMetaProcedure来初始化元数据,即创建AssignProcedure把meta表region拉起
  1. 初始化以下后台服务

    1. Balancer
    2. CatalogJanitor
    3. ExecutorServices
    4. LogCleaner
    5. HFileCleaner
    6. ReplicationBarrierCleaner
  1. 等待元数据构建完成
  1. 等待足够多RegionServer加入集群,默认至少1个,可配置数量: hbase.master.wait.on.regionservers.maxtostart hbase.master.wait.on.regionservers.mintostart
  1. AssignmentManager::joinCluster扫描meta表每行数据,构建regionStates,wake等待meta加载后执行的任务。
  1. 启动其他Chore服务,如:

    1. RITChore - 定期巡检RIT数量是否过多并打warn日志和打metrics
    2. DeadServerMetricRegionChore - 定期打deadServer相关metrics
  1. TableStateManager::start扫描meta表的table:state column和HDFS上每个table目录下.tabledesc目录下最新的$seqNum.tableinfo文件(即seqNum最大的.tableinfo文件),将meta表里的tableState添加到内存中的tableState,HDFS里不存在则设置为ENABLED
  1. assignmentManager::processOfflineRegions对每个offline region创建AssignProcedure,按round-robin策略分配
  1. 如果开启了favoredNode功能,扫meta创建一个索引多种查询模式(rs->region, region->rs等)的元数据快照来初始化favoredNodesManager
  1. 启动Chore服务

    1. ClusterStatusChore
    2. BalancerChore
    3. RegionNormalizerChore
    4. CatalogJanitor
    5. HbckChore
  1. assignmentManager检查regionserver实例是否存在不同版本,是则移动所有system table到版本最新的rs上以保证兼容性。
  1. 初始化quota
  1. serverManager.clearDeadServersWithSameHostNameAndPortOfOnlineServer清楚deadServer里相同host和port的已经online的rs,因master初始化期间加入的rs未更新状态,见HBASE-5916
  1. 检查ZK上ACL配置
  1. 初始化MobCleaner
  1. 最后刷新下balancer的RegionLocationFinder
  2. 创建master addr tracker,注册到zk,阻塞等待master上线