Ch09-HBase 之 Procedure v2

Ch09-HBase 之 Procedure v2

March 7, 2021
Apache HBase
hbase

HBase Procedure V2 其主要目标是提供多步执行的事务能力,跨多节点的通知机制,长时间 Procedure 运行的协同机制。

1. 基本介绍 #

HBase Procedure v2 提供了一种对内的事务能力,注意这里是对内的事务。简单来说,这里不是 HBase 数据层面的事务,而是操作步骤层面的事务。在 Procedure v2 出来之前,HBase 的操作过程处于一种伪事务的状态,同步操作的流程也处于一种伪同步的流程。在分布式的环境下,如果一个操作环节出现了问题,那么处理起来也非常棘手。

create table no procedure

比如在 Master 中的 CreateHandler() 任务交给了线程池,并没有实现真正意义上的同步。而且如果 CreateHander() 的创建过程如果非常长,或者出现了失败,也没有足够的回滚机制来将 Master 中存储的信息会滚到之前的状态。这些在 HBase 的稳定性上面都存在极大的隐患,基于此,HBase 社区与 2.0.0 引入 Procedure V2 来解决这一系列问题。 比如上图的问题,采用 Procedure V2 就可以实现为如下,将这个“伪异步”的线程作为一个 procedure,当执行后,返回一个 procId,然后客户端就可以根据这个 procId 确认该步骤是否完成。

create table with procedure

2. 基本架构 #

prpcedure

整个 Procedure v2 模块分为图中所示的三大块,每块各司其主共同完成事务操作。 ProcedureExecutor 首先会将 Procedure 本身提交给 ProcedureStore 完成持久化,接着由 ProcedureExecutor 将该 Procedure Load 出来,push 到 ProcedureScheduler。ProcedureExecutor 然后从 ProcedureScheduler 的队列中 poll 出 Procedure 交由 WorkThread 执行,如果中间产生了若干状态或者中间结果,也会将其插入到 ProcedureStore 中暂存下来。

3. 核心组件 #

Procedure 相关的类均被定义在 hbase-procedure 包里面,目前也仅仅只有 HMaster 会用到。Procedure 的几个组成模块中,每个模块定义了几个非常重要的方法。

名称 方法 说明
Procedure execute(), rollback() 定义了具体的执行步骤,有点类似与执行模板/蓝图之类的概念
ProcedureExecutor sumitProcedure(Procedure), isFinished(procId), getResult(procId) 负责提交、执行 Procedure。Procedure 的执行操作主要由内部的多个 WorkerThread 来完成
ProcedureStore load(Proc), insert(Proc), update(Proc), delete(Proc) 用来持久化新提交的 Procedure 以及后续的每一次状态更新值,默认实现类为 WALProcedureStore
ProcedureScheduler enqueue(), dequeue() 负责调度一个集群内的各种类型的 Procedure 请求,支持按优先级调度,相同优先级的 Procedure 则支持公平调度。

注意:

  • Procedure##execute() 方法和 Procedure##rollback() 方法,实现要求必须具有幂等性,即无论执行多少次,其结果应该是一样的。也正是因为这两个方法的存在,使得 Procedure 可以保证事务性。
  • ProcedureStore 默认实现类为 WALProcedureStore。当文件超过一定大小后或者超过一定的时间周期后,会 roll 一个新的 WAL 文件出来,避免一个 WAL 文件过大;如果 WAL 日志无用的时候,会进行清理。。
  • ProcedureScheduler 共有两种,一种是 MasterProcedureScheduler,另一种是 SimpleProcedureScheduler(几乎弃用)。

4. 应用场景 #

名称 说明
Acls 访问控制
WAL Splitting 分配 WAL 文件,让 RegionServer 在启动的时候进行重放
AssignmentManager V2 将 Region 分配到不同的 RegionServer 上

5. 常见执行模型 #

条目 说明
StateMachineProcedure 主要基于状态机确定每个 Procedure 的执行状态是否正确,实际的应用比如 CreateTableProcedure
RemoteProcedureDispatcher 通过 RPC 确定每个 Procedure 的执行状态是否正确,实际的应用比如 ServerCrashProcedure

6. 参考文献 #