HBase Procedure V2介绍

小米工程师介绍HBase Procedure,基本原理和问题解决方案。
展开查看详情

1.Procedure V2介绍 张铎,小米,2018.07.21

2.架构 Poll Insert Push ProcedureExecutor Update Delete Load ProcedureScheduler ProcedureStore

3.ProcedureExecutor Procedures Move Completed Submit Worker Worker ProcedureScheduler Worker TimeoutExecutor

4.Worker的执行流程 1. Poll a procedure from scheduler. 2. Acquire lock 3. Execute the procedure 4. Update procedure store 5. Depending on the return value, we will a. If the return value is the procedure itself, then immediately re-execute it(#3). b. If the return value is a list of new procedures, then record them as sub procs and schedule them, and also suspend the current procedure. c. If the return value is null, then we are done 6. Check if it is a sub proc and try to resume the parent procedure. 7. Release lock

5.Procedure Lock ● 用于保证procedure执行时不被打断 ● 读写锁,可以从parent procedure继承 ● Procedure.holdLock ○ 为true时除非Procedure结束否则不释放锁 ○ 为false(默认)则在被suspend时会释放锁,下次执行重新拿锁 ● 举例 ○ AssignProcedure/UnassignProcedure,需要拿着namespace和table的读锁,以及对应region 的写锁,且holdLock为true ○ ModifyTableProcedure,需要拿着namespace的读锁,以及对应table的写锁,但holdLock为 false(why?) ● 相关类 ○ SchemaLocking ○ LockAndQueue

6.MasterProcedureScheduler ● Queue ○ 元素是procedure ○ 针对相同目标的procedure会放在同一个queue中 ● RunQueue(FairQueue) ○ 元素是Queue ○ 只有在RunQueue中的Queue中的procedure才能被ProcedureExecutor取出并执行 ○ Procedure在拿到写锁时会把Queue从RunQueue中拿掉,释放时再放回 ● 四种类型的Queue ○ ServerQueue,以ServerName区分Queue ○ TableQueue,以TableName区分Queue ○ PeerQueue,以PeerName(String)区分Queue ○ MetaQueue(Deprecated),以TableName区分Queue(只有一个)

7.ProcedureStore ● 有WAL,但不是LSM Tree ● 启动时把所有WAL都replay一遍来恢复数据 ● 过期的WAL直接删除 ● 通过一个Tracker来维护活跃的Procedure ● 相关类 ○ WALProcedureStore ○ ProcedureStoreTracker

8.AssignmentManager V2 ● 基于Procedure V2 ● ZK-Less ● Procedure Lock保护,防止double assign ● Procedure完成之后状态一定是一致的(解决之前zk,AM和RS状态不一致的问 题)

9.Region状态迁移 Create OPENING CLOSED OPENED Drop CLOSING

10.Region状态迁移 ● AssignProcedure ○ CLOSED => OPENING => OPENED ● UnassignProcedure ○ OPENED=>CLOSING=>CLOSED ● 都是RegionTransitionProcedure的子类 ● 无法回滚,会一直重试直到执行完成 ○ FAILED_OPEN ○ 有RS crash ● MoveRegionProcedure ○ 先Unassign,再Assign

11.ServerCrashProcedure SPLIT_META_LOG ASSIGN_META ASSIGN_REGIONS SPLIT_LOG GET_REGIONS

12.HandleRIT ● RIT是Region In Transition的意思 ● SCP需要打断仍然在重试的AssignProcdure/UnassignProcedure ● AM会为每个region保存当前正在执行的RegionTransitionProcedure,每个 region最多只能有一个 ● 不在RIT状态 ○ 直接schedule一个AssignProcedure ● UnassignProcedure ○ 直接退出 ○ 需要再schedule一个AssignProcedure ● AssignProcedure ○ 退回到初始状态重新开始

13.HandleRIT ● MergeRegionProcedure不是RegionTransitionProcedure的子类 ○ 无法直接打断MRP ○ 打断AssignProcedure没有问题 ○ 打断UnassignProcedure之后,MRP不会释放锁,会直接schedule一个AssignProcedure ○ 必须在split log完成之后才能打断,否则可能会丢数据 ● Merge/Split在Unassign时被打断 ○ UnassignProcedure退出时,region可能遗留了部分recovered.edits ○ Merge/Split时并不会对recovered.edits做处理 ○ Data loss! ○ 在Unassign之后检查region是否有recovered.edits,如果有则让procedure失败回滚 ○ HBASE-20878,BASE-20893

14.Master启动流程 ● AssignmentManager需要扫描meta恢复region状态 ○ 需要确保meta在线 ● RecoverMetaProcedure ○ 但在执行完成meta所在的RS依然有可能挂掉 ● 通过SCP来确保meta最终能够online ● 如何在启动时确定哪些RS crash了 ○ zk上注册着的RS是活着的 ○ AM扫描meta可以得到有region的RS列表 ○ 死锁! ○ 解决方案:通过扫描WAL目录来获得RS列表,再和zk上的列表比对

15.新的Master启动流程 ● 初始化ProcedureExecutor,load procedures,但是不启动worker ● 判断meta region是否存在,如果不存在的话schedule InitMetaProcedure(先检 查是否已经有InitMetaProcedure) ● 扫描WAL目录获得RS列表,和zk上的列表进行比对,schedule SCP(先检查对 应的RS是否已经有SCP) ● 启动ProcedureExecutor的Worker ● AssignmentManager开始尝试load meta,只要没有漏掉SCP,总是可以保证 meta最终会online

16.后续改进点 ● 重启时恢复Procedure Lock ○ HBASE-20846 ● 统一AssignProcedure/UnassignProcedure/MoveRegionProcedure ○ HBASE-20881 ● 关注 HBASE-20828

17.谢谢