这是我参与【第四届青训营】笔记创造活动的第十一天。
RegionServer启动流程
先初始化所有组件但不启动,直到reportForDuty成功注册到Hmaster后才启动所有服务。
-
在ctor里初始化(不启动)
-
初始化Netty server event loop用于RPC server/client和WAL
-
检查Memory limit,HFile version,codecs,初始化UserProvider,配置短路读等
-
初始化RSRpcServices,其中是所有RPC接口的实现
-
初始化HFileSystem和FSTableDescriptors
-
初始化ZK,创建:
- ZkCoordinatedStateManager来协调WAL split
- MasterAddressTracker管理ZK上当前active master信息,监听主master变化
- ClusterStatusTracker管理ZK上的cluster配置信息
-
创建ChoreService和ExecutorService
-
拉起rs的webUI
-
-
reportForDuty成功上报HMaster(启动服务)
- 上报前初始化ZK,创建RegionServerProcedureManagerHost并从配置项
hbase.procedure.regionserver.classes
加载system procedures、RegionServerSnapshotManager和RegionServerFlushTableProcedureManager - 初始化可以短路优化本地请求的ClusterConnection和用于HMaster通信的client
- 从ZK获取当前active master地址,发送RegionServerStartupRequest向master注册本rs
- 成功收到resp后在handleReportForDutyResponse方法把master返回的KV对加入自身conf,在ZK创建ephemeral znode(默认目录
rs/$hostname,$port,$startcode
),把rsInfo写入value,PB格式如下:
- 上报前初始化ZK,创建RegionServerProcedureManagerHost并从配置项
-
- 如果resp里有
hbase.rootdir
这个key,需要重新初始化FS更新rootDir - ZNodeClearer::writeMyEphemeralNodeOnDisk把rs的ZK ephemeral节点路径写入FS里HBASE_ZNODE_FILE环境变量设置的路径。server正常退出时会删除该文件,用来识别server是否正常退出,加速恢复
- 创建WAL相关目录,并初始化replication的source和sink实例并启动
- 唤醒等待rs online的线程
- 启动snapshotManager和其他procedureHandlers,quotaManager
- 定期调用HMaster的regionServerReport RPC上报server load,报错则尝试重建连接
- 如果resp里有
RegionServer故障恢复
regionserver每次启动的startcode不同,都视为一个新的rs实例,因此走一遍启动流程。
Region上线流程
Region状态转换统一抽象成TransitRegionStateProcedure。RIT即一个region有未完成的TRSP。常见的状态转换包括以下几种:
-
assign region: GET_ASSIGN_CANDIDATE ------> OPEN -----> CONFIRM_OPENED
-
设置region的candidate rs,AssignmentManager异步用balancer选择rs打开region。assign是封装成一个AssignmentProcedureEvent创建在RegionStateNode里,AssignmentManager::processAssignQueue批量获取待assign region的regionStateNodes,acceptPlan方法里依次调用每个AssignmentProcedureEvent的wakeInternal方法,将阻塞等待在event上的procedures保序加入procedureScheduler调度队列恢复执行。
-
AssignmentManager::regionOpening更新regionNode状态为OPENING,regionStates添加region和对应的rs记录,创建子过程OpenRegionProcedure,这个RemoteProcedure会向目标rs发送executeProcedures RPC,在RSRpcServices::executeOpenRegionProcedures方法里提交AssignRegionHandler异步地通过HRegion.openHRegion做以下操作:
- 写RegionInfo到HDFS上region的目录
/ns/table/encodedRegionName
下的.regioninfo
文件用于恢复meta表数据。如果相同文件内容已存在就跳过,否则覆盖写(先写到region目录下.tmp
目录,再move) - initializeStores并发初始化每个cf的HStore,创建cf的hdfs目录,配置blocksize、hdfs storagePolicy、dataBlockEncoding、cell comparator、TTL、低峰期等,创建memstore,创建StoreEngine(集成storeFlusher,compactionPolicy,Compactor,storeFileManager的工厂实例),遍历HDFS上该region该cf的HFiles创建StoreFileInfo集合,并发打开reader,从HFIie读取元信息compectedFiles并移动到archive目录下WIP here
- 写RegionInfo到HDFS上region的目录
-
- unassign region: CLOSE -----> CONFIRM_CLOSED
- reopen/move region: CLOSE -----> CONFIRM_CLOSED -----> GET_ASSIGN_CANDIDATE ------> OPEN -----> CONFIRM_OPENED
同一时刻一个region只能最多有一个TRSP。