热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HBaseCompactionOffload功能的实现与应用

文|牛豫林小米云平台工程师,ApacheHBaseCommitter导读本文介绍了

文|牛豫林
小米云平台工程师,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 功能实现

整体架构变化

引入新的组件CompactionServer(以下简写为CS),将Compaction任务从RegionServer中剥离出来。新的HBase架构包含组件为:Master、RegionServer、CompactionServer。同时为了管理CS,在Master中增加CompactionServer Manager(以下简写为CS Manager)模块,如图.4 所示。

图.4 HBase新整体架构

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

  • 需要执行Compaction时,发送Request Compaction请求到Master,请求中携带Region、Family等信息(图.5中①)。

  • 接受CS的CompactionComplete请求(图.5中③),然后进行原先的逻辑(Compaction现有逻辑中3)。

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。

3、
Compaction Offload 功能应用

YCSB测试

RegionServer:Num = 2、 MaxHeap = 25g、MaxDirectMem = 25g、HDD

CompactionServer:Num = 1、MaxHeap = 25g、HDD5M Records and Operations 

Wordload A

Wordload B

YCSB测试表明,开启Compaction Offload对吞吐和P99延迟有10%左右提升。


上线效果

小米推送集群:60个RegionServer节点,单节点128G内存、10T SSD。单机读/写QPS均值:40k/2.5k;单机读/写QPS峰值:90k/10k。

我们在该集群上线Compaction Offload功能,将5个RegionServer服务器替换为部署CS,每个服务器部署4个CS。上线时间为7月18日,我们分别截取了服务端和客户端对访问延时的监控如图6、7、8所示。发现开启Compaction Offload功能可以显著降低P99延时,但是对于平均延迟和P999优化效果不明显。

图.6 HBase服务侧监控:请求排队时间(P99)

图.7 HBase服务侧监控:请求处理时间(P99)

图.8 业务侧监控:Get请求HBase集群耗时(P99)

4、
未来规划

Compaction Offload功能同步到社区

目前Compaction Offload功能在小米内部分支开发完毕,正在同步到社区,参考HBASE-25714。

支持异构Compaction Offload功能

目前Compaction Offload功能只能在CS上执行,后续可以考虑将Compaction提交到YARN上执行,获得更高的资源利用率。由于Minor Compaction对实时性有较高要求,可以使用Spark Streaming或者Flink计算框架对Compaction任务进行处理。

CompactionServer支持BlockCache

图.2 Compaction任务造成读写毛刺不仅仅是因为其与RegionServer产生资源竞争,另一个原因是Compaction结束时替换文件造成RegionServer BlockCache失效,这时需要重新从HDFS读取文件并加载到BlockCache,Compaction Offload功能目前只能解决Compaction任务与RegionServer资源竞争的问题。我们计划在CS中引入BlockCache,在Compaction执行过程中缓存需要的HFile Block,当Compaction任务结束替换文件后,RegionServer可以从CS的BlockCache中读取相应Block,减轻读文件造成的延时毛刺。

参考 
  • https://issues.apache.org/jira/browse/HBASE-25714

  • http://www.vldb.org/pvldb/vol8/p850-ahmad.pdf

  • https://hbase.apache.org/book.html

  • 《HBase原理与实践》

喜欢此内容的人还喜欢
【Doris全面解析】Doris SQL 原理解析
米家插件平台的技术实践之路
日志异常检测初步实践与探索
基于chaosblade的故障注入平台实践







推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 本文详细介绍了如何在 Django 项目中使用 Admin 管理后台,包括创建超级用户、启动项目、管理数据模型和修改用户密码等步骤。 ... [详细]
  • 本文介绍了如何通过Sybase Central连接到示例数据库,并查看其中的表和其他对象。主要内容包括启动Sybase Central、建立连接、查看表列表及表的具体信息。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • Workbench 流固耦合分析:选择经典APDL还是现代Workbench?一文帮你做出明智决策
    随着ACT插件的推出,经典版APDL的大部分高级功能已成功迁移至现代Workbench平台。本文将深入探讨Workbench在流固耦合分析中的应用,帮助读者在经典APDL与现代Workbench之间做出明智的选择。通过对比两者的功能、易用性和扩展性,我们将为用户提供全面的参考信息,助力其在工程仿真领域取得更好的成果。 ... [详细]
author-avatar
nzl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有