整体架构变化
引入新的组件CompactionServer(以下简写为CS),将Compaction任务从RegionServer中剥离出来。新的HBase架构包含组件为:Master、RegionServer、CompactionServer。同时为了管理CS,在Master中增加CompactionServer Manager(以下简写为CS Manager)模块,如图.4 所示。
CompactionServer可以代替RegionServer执行Compaction操作,它使用HDFS Client与HDFS进行交互,从HDFS中读取需要执行Compaction文件的内容,并将Compaction产生的新文件写入HDFS。CompactionServer是无状态的,易于扩展。CS Manager管理CS并维护Region到CS的映射,使每个CS执行某些Regoin的Compaction操作,这类似于Master将Region分配给RegionServer提供读写服务。
在实现CS和CS Manager的过程中,我们复用了RegionServer和RegionServerManager的代码,例如从HDFS中Scan Storefile以及对这些文件执行Compaction并写回HDFS,同时对于Compaction的核心—Compaction策略,我们将其视为黑盒,保持原先的执行逻辑,不做修改。
新的架构可以带来如下好处:
1、CompactionServer可以部署在独立机器上,不与RegionServer产生资源竞争,优化读写毛刺。
2、加强存储计算资源分离,将RegionServer计算任务进一步分离到多个Server上,CS可以独立于RegionServer进行扩缩容,便于容器化部署。
3、有了中心化的CS Manager, Master可以对Compaction任务进行整体限速。
Compaction逻辑的变化
图.5 CompactionOffload模块交互图
增加CompactionServer后,执行Compaction时各模块功能发生变化:
1、RegionServer
2、Master
新增类CompactionServerManager,用来管理CS以及转发Compaction请求。
接受RegionServer的Request Compaction请求,并转发给相应CS,这里同一个Region的请求会转发到同一个CS(图.5中②)。
响应CS的心跳请求,返回对CS的限速信息(图.5中⑤)。
页面展示CS列表以及Compaction Task汇总信息。
3、CompactionServer
接受Master转发来的Request Compaction请求,执行选择文件和Compact逻辑(Compaction现有逻辑中2)。
发送CompleteCompaction请求给相应的Regionserver,请求参数包括参与执行Compaction的文件列表和Compaction生成文件列表(图.5中③)。
给Master发送心跳并汇报Compaction Task信息(图.5中④)。
获取Master的汇报答复,其中包含限速信息,对Compaction任务进行限速调整。
Compaction Offload功能开关
集群级别:在HBase Shell中执行enable_compaction_offload/disable_compaction_offload命令开启或关闭整集群Compaction Offload功能。
表级别:创建/修改表时设置表的COMPACTION_OFFLOAD_ENABLED的属性为true或false。
只有集群和表级别开关同时开启,才会执行Compaction Offload逻辑。
Compaction Offload功能Failover
1、Master宕机
RegionServer请求Master失败,会回退到原先的本地执行Compaction方式。
对于已经在CS执行完毕的Compaction任务,会直接请求RegionServer(图.5中③),不会受到Master不可用的影响。
2、CompactionServer宕机
CS宕机后,CS Manager会将请求发送到其他可用的CS,若全部CS都不可用,RegionServer会回退到本地执行Compaction的方式。
3、RegionServer宕机或Region移动
在CS执行完Compaction并请求RegionServer时(图.5中③),若发生RegionServer宕机或Region移动,我们会等待Region重新Online,从Master中获取Region最新所在RegionServer,然后重试Compaction Complete请求。
Compaction Offload功能兼容性
1、FavoredNodes/Locality
若某个Region开启了FavoredNodes特性,CompactionOffload功能会进行兼容,在文件写回HDFS时使用FavoredNodes特性,保证Compaction生成的文件副本在指定DataNode列表上。
若未开启FavoredNodes特性,会将发送RequestCompaction请求的RegionServer地址设置为HStore的FavoredNodes,在写回HDFS时写入RegionServer所在机器的DataNode,保证Locality。若RegionServer所在机器未部署DataNode,则会随机选择DataNode进行写入。
2、MOB
CompactionServer在执行Compaction时会创建HStore对象,复用Compaction逻辑。若RequestCompaction请求中Family是开启MOB特性的,我们会创建HMobStore,从而兼容MOB Compaction。
3、RegionCoprocessor
HBase用户通过定制Coprocessor可以在Compaction操作过程中执行自定义逻辑,Compaction Offload功能需要兼容Coprocessor保证Compaction的语义正确。我们引入RegionCoprocessorService接口,使Region可以在CompactionServer上打开时挂载Compaction相关的Coprocessor。