滴滴HBase大版本滚动升级之旅

2020-06-10  本文已影响0人  滴滴技术

桔妹导读:滴滴HBase团队日前完成了0.98版本 -> 1.4.8版本滚动升级,用户无感知。新版本为我们带来了丰富的新特性,在性能、稳定性与易用性方便也均有很大提升。我们将整个升级过程中面临的挑战、进行的思考以及解决的问题总结成文,希望对大家有所帮助。

1. 背景

目前HBase服务在我司共有国内、海外共计11个集群,总吞吐超过1kw+/s,服务着地图、普惠、车服、引擎、金融等几乎全部部门与业务线。

然而有一个问题持续困扰着我们:版本较社区落后较多——HBase线上集群使用0.98版本,而社区目前最新的release版本为2.3。这为我们的工作带来了很多额外的掣肘与负担,主要包括以下几点:

因此对于HBase团队而言,升级迫在眉睫刻不容缓。

2.挑战

首先简单介绍一下HBase的架构。HBase是一个典型的主从结构——主备Master用于管理集群;RegionServer用于响应处理用户读写请求;使用ZooKeeper保障集群内的一致性;节点间通过RPC通信;底层数据文件HFile存储于HDFS中。

此外HBase具有相当丰富的上下游生态,从以StreamingSQL为代表的实时任务到Spark、MR等批处理任务,通过下图可以得窥一二:

基于以上对集群架构和上下游生态的梳理,可以明确升级过程中我们主要面临的挑战有:

基于以上这些挑战点,其实不难得出一个结论:我们需要设计并实施大量的前置准备工作以保证升级过程的可靠性,但这并不是什么坏消息,因为只要我们的准备工作足够细致完善,顺利升级的把握和信心也就越强——这个思路在我们今后的工作中也同样适用。

下面简单列举了我们完成的准备工作:

3. 升级方案

升级方案主要有两种:新建集群+数据迁移 和 滚动升级。

实际上滚动升级的方案一定是最优选,主要是出于对“release版本仍然不够稳定”的担忧,我们一度有所犹豫。但最终基于“充分的准备与测试”带给我们的信心,最终我们仍然选择了滚动升级。

简单说明滚动升级的大致步骤:

  1. 解决兼容性问题,主要体现在新建rsgroup元数据表并重写数据、
  2. 挂载新的coprocessor等;
  3. 升级master节点;
  4. 升级meta分组;
  5. 依次升级业务分组;

4. 实操及问题

我们从19年下半年启动了这一轮滚动升级的调研与准备,今年3月下旬正式开始线上操作,截至5月初已完成了国内外共计9个集群的升级工作,用户无感知。

在此期间我们也遇到了不少未解问题,这里摘取一个Critical问题做简单介绍:

region split过程中叠加RS宕机引发数据丢失:

region split是一个相当复杂的事务过程,大体可分为以下几步:

当父region下线、子region还未正式上线时RegionServer宕机,master上的ServerCrashProcedure线程开始进行回滚,会将子region删除;此外master上还有一个CatalogJanitor线程做数据清理,正常split过程中由于ZK上存在对应节点,这个线程会被阻塞;然而由于RS宕机,临时节点也随之消失,该线程正常工作,判断meta表中父region已经下线,从而将父region删除——至此父子region皆被删除,导致数据丢失。
修复方案已提交社区:HBASE-23693

其它patch list:

5. 总结

本次升级工作从立项到完结耗时近一年,能够成功完成非常开心。一方面本次升级极大拉进了内部版本与社区release版本的距离,为更加良性的版本迭代及社区互动夯实了基础;另一方面新版本引入了诸多新特性,在稳定性、易用性方面都为我们带来了更为广阔的成长空间;更重要的是在这个过程中我们自身也沉淀出了一套系统的工作思路与方法论,期待后续可以更好的为业务赋能,为公司创造价值。


作者简介

滴滴资深猫奴,专注于HBase内核研发,滴滴HBase服务及上下游生态的建设与维护。

**欢迎关注滴滴技术公众号!

滴滴技术 出品

上一篇 下一篇

猜你喜欢

热点阅读