文|牛豫林
小米云平台工程师,Apache HBase Committer
导读
本文介绍了HBase Compaction Offload功能的设计与实现,以及在小米的应用。HBase Compaction操作会造成读写服务响应毛刺,我们通过引入CompactionServer组件,将Compaction任务剥离到CompactionServer上执行,避免与RegionServer产生资源竞争,优化读写毛刺。同时Compaction Offload功能加强存储计算分离,CompactionServer可以独立于RegionServer进行扩缩容,便于云原生容器化部署。
背景
HBase是基于LSM-Tree架构的分布式数据库,对于数据写入不会原地更新,而是在内存(Memtable)中创建更新键的新值,然后定期将内存中的数据刷新为只读的存储文件(HFile),读取数据就需要遍历多个文件找到该键所对应的正确值。随着存储文件不断增加,读性能会因为需要读取的文件数增多而下降(如图.1所示)。HBase会执行Compaction操作将多个文件合并,使文件个数基本稳定,进而使读取IO的次数趋于稳定,将延迟控制在一定范围内(图.2)。在现有HBase架构中,Compaction操作在RegionServer上执行,合并文件会带来很大的带宽以及IO压力,同时也会消耗CPU和内存资源,造成读取响应延迟增大,出现毛刺。
图.1 读取延时随数据写入时间增加而不断增加
图.2 开启Compaction情况下读取延迟随写入时间变化
1、
Compaction 现有逻辑
目前Compaction相关逻辑都是在RegionServer中执行的,如图.3所示。
图.3 Compaction执行流程
Compaction的执行流程可以分解为多个子流程:
1、触发条件:Flush、Open Region、CompactionCheckerChore、Admin操作
2、执行Compaction
根据Compaction策略选择要合并的文件
选择合适的线程池,执行Compact
3、完成Compaction
将Compact产生的新文件从tmp目录移动到Region相应目录,并加载新文件
将参与Compact的输入文件标记为Compacted
CompactedHFilesDischarger线程定期扫描并删除Compacted文件
Compaction Offload功能将步骤2中的部分从RegionServer中移出,在CompactionServer上执行。
2、
Compaction Offload 功能实现
整体架构变化