这是我参与【第四届青训营】笔记创造活动的第十天。
HMaster启动流程
- 先将自己加到backup master的ZK目录下,这样抢主失败了active master能感知到backup;
- 除非关闭master,无限循环尝试写入active master的ZK目录来抢主,成功的话从backup目录删除自己的znode;失败的话监听ZK上activeMaster的znode,主挂了就再次抢主
-
初始化文件系统相关组件
- MasterFileSystem - 封装对底层HDFS文件系统的交互
- MasterWalManager - 封装master分裂WAL操作,管理WAL文件、目录
- TableDescriptor - 管理table信息,预加载所有table的信息
- 发布clusterID到ZK,位于/hbase/hbaseid
- 加文件锁防止hbck1在hbase2集群执行造成数据损坏
-
初始化以下master状态管理组件
-
ServerManager - 管理regionserver状态(online/dead),处理rs启动、关闭、恢复
-
SplitWALManager - 代替ZK管理split WAL的procedures,
-
ProcedureExecutor - 负责调度、执行、恢复procedures,包含以下组件
-
-
AssignmentManager - 负责调度region,包含以下组件
- RegionStates - 管理内存态的region状态,包括online/offline/RIT的region信息 RegionStateNode表示一个region的内存态状态,和meta表保持一致,会关联TransitRegionStateProcedure以保证最多一个RIT在并发
- 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 - 从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管理。
-
-
- 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处理)
- SERVER_CRASH_ASSIGN状态assign该rs上所有挂掉的region后进入SERVER_CRASH_FINISH状态删除该rs,标记这个dead server处理完成
- TableStateManager - meta表确认已online才能启动,负责更新table state到meta表
-
-
初始化一系列ZK相关的trackers
- LoadBalancer
- RegionNormalizer
- LoadBalancerTracker
- RegionNormalizerTracker
- SplitOrMergeTracker
- ReplicationPeerManager
- DrainingServerTracker
- MetaLocationSyncer + MasterAddressSyncer (client ZK不是observer mode时需要)
- SnapshotManager
- MasterProcedureManagerHost
- InitializationMonitor - zombie master检测 HBASE-21535
- 如果是新建集群,安排InitMetaProcedure来初始化元数据,即创建AssignProcedure把meta表region拉起
-
初始化以下后台服务
- Balancer
- CatalogJanitor
- ExecutorServices
- LogCleaner
- HFileCleaner
- ReplicationBarrierCleaner
- 等待元数据构建完成
- 等待足够多RegionServer加入集群,默认至少1个,可配置数量: hbase.master.wait.on.regionservers.maxtostart hbase.master.wait.on.regionservers.mintostart
- AssignmentManager::joinCluster扫描meta表每行数据,构建regionStates,wake等待meta加载后执行的任务。
-
启动其他Chore服务,如:
- RITChore - 定期巡检RIT数量是否过多并打warn日志和打metrics
- DeadServerMetricRegionChore - 定期打deadServer相关metrics
- TableStateManager::start扫描meta表的
table:statecolumn和HDFS上每个table目录下.tabledesc目录下最新的$seqNum.tableinfo文件(即seqNum最大的.tableinfo文件),将meta表里的tableState添加到内存中的tableState,HDFS里不存在则设置为ENABLED
- assignmentManager::processOfflineRegions对每个offline region创建AssignProcedure,按round-robin策略分配
- 如果开启了favoredNode功能,扫meta创建一个索引多种查询模式(rs->region, region->rs等)的元数据快照来初始化favoredNodesManager
-
启动Chore服务
- ClusterStatusChore
- BalancerChore
- RegionNormalizerChore
- CatalogJanitor
- HbckChore
- assignmentManager检查regionserver实例是否存在不同版本,是则移动所有system table到版本最新的rs上以保证兼容性。
- 初始化quota
- serverManager.clearDeadServersWithSameHostNameAndPortOfOnlineServer清楚deadServer里相同host和port的已经online的rs,因master初始化期间加入的rs未更新状态,见HBASE-5916
- 检查ZK上ACL配置
- 初始化MobCleaner
- 最后刷新下balancer的RegionLocationFinder
- 创建master addr tracker,注册到zk,阻塞等待master上线