RegionServer启动流程及故障恢复|青训营笔记

169 阅读3分钟

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

RegionServer启动流程

先初始化所有组件但不启动,直到reportForDuty成功注册到Hmaster后才启动所有服务。

  1. 在ctor里初始化(不启动)

    1. 初始化Netty server event loop用于RPC server/client和WAL

    2. 检查Memory limit,HFile version,codecs,初始化UserProvider,配置短路读等

    3. 初始化RSRpcServices,其中是所有RPC接口的实现

    4. 初始化HFileSystem和FSTableDescriptors

    5. 初始化ZK,创建:

      1. ZkCoordinatedStateManager来协调WAL split
      2. MasterAddressTracker管理ZK上当前active master信息,监听主master变化
      3. ClusterStatusTracker管理ZK上的cluster配置信息
    6. 创建ChoreService和ExecutorService

    7. 拉起rs的webUI

  1. reportForDuty成功上报HMaster(启动服务)

    1. 上报前初始化ZK,创建RegionServerProcedureManagerHost并从配置项hbase.procedure.regionserver.classes加载system procedures、RegionServerSnapshotManager和RegionServerFlushTableProcedureManager
    2. 初始化可以短路优化本地请求的ClusterConnection和用于HMaster通信的client
    3. 从ZK获取当前active master地址,发送RegionServerStartupRequest向master注册本rs
    4. 成功收到resp后在handleReportForDutyResponse方法把master返回的KV对加入自身conf,在ZK创建ephemeral znode(默认目录rs/$hostname,$port,$startcode),把rsInfo写入value,PB格式如下:
    1. 如果resp里有hbase.rootdir这个key,需要重新初始化FS更新rootDir
    2. ZNodeClearer::writeMyEphemeralNodeOnDisk把rs的ZK ephemeral节点路径写入FS里HBASE_ZNODE_FILE环境变量设置的路径。server正常退出时会删除该文件,用来识别server是否正常退出,加速恢复
    3. 创建WAL相关目录,并初始化replication的source和sink实例并启动
    4. 唤醒等待rs online的线程
    5. 启动snapshotManager和其他procedureHandlers,quotaManager
    6. 定期调用HMaster的regionServerReport RPC上报server load,报错则尝试重建连接

RegionServer故障恢复

regionserver每次启动的startcode不同,都视为一个新的rs实例,因此走一遍启动流程。

Region上线流程

Region状态转换统一抽象成TransitRegionStateProcedure。RIT即一个region有未完成的TRSP。常见的状态转换包括以下几种:

  1. assign region: GET_ASSIGN_CANDIDATE ------> OPEN -----> CONFIRM_OPENED

    1. 设置region的candidate rs,AssignmentManager异步用balancer选择rs打开region。assign是封装成一个AssignmentProcedureEvent创建在RegionStateNode里,AssignmentManager::processAssignQueue批量获取待assign region的regionStateNodes,acceptPlan方法里依次调用每个AssignmentProcedureEvent的wakeInternal方法,将阻塞等待在event上的procedures保序加入procedureScheduler调度队列恢复执行。

    2. AssignmentManager::regionOpening更新regionNode状态为OPENING,regionStates添加region和对应的rs记录,创建子过程OpenRegionProcedure,这个RemoteProcedure会向目标rs发送executeProcedures RPC,在RSRpcServices::executeOpenRegionProcedures方法里提交AssignRegionHandler异步地通过HRegion.openHRegion做以下操作:

      1. 写RegionInfo到HDFS上region的目录/ns/table/encodedRegionName下的.regioninfo文件用于恢复meta表数据。如果相同文件内容已存在就跳过,否则覆盖写(先写到region目录下.tmp目录,再move)
      2. 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
  1. unassign region: CLOSE -----> CONFIRM_CLOSED
  1. reopen/move region: CLOSE -----> CONFIRM_CLOSED -----> GET_ASSIGN_CANDIDATE ------> OPEN -----> CONFIRM_OPENED

同一时刻一个region只能最多有一个TRSP。