滴滴HBase大版本滚动升级之旅
桔妹导读:滴滴HBase团队日前完成了0.98版本 -> 1.4.8版本滚动升级,用户无感知。新版本为我们带来了丰富的新特性,在性能、稳定性与易用性方便也均有很大提升。我们将整个升级过程中面临的挑战、进行的思考以及解决的问题总结成文,希望对大家有所帮助。
1. 背景
目前HBase服务在我司共有国内、海外共计11个集群,总吞吐超过1kw+/s,服务着地图、普惠、车服、引擎、金融等几乎全部部门与业务线。
然而有一个问题持续困扰着我们:版本较社区落后较多——HBase线上集群使用0.98版本,而社区目前最新的release版本为2.3。这为我们的工作带来了很多额外的掣肘与负担,主要包括以下几点:
- 新特性引入成本极高:
0.98版本可以算是HBase第一个稳定版本,但过于老旧,社区已经不再维护。想要backport新特性难度越来越大。 - 自研patch维护成本较高:
我们基于0.98版本有数十个大大小小的自研patch,涵盖了从label分组、ACL鉴权等大的feature到监控体系建设、审计日志优化等Improvement以及各种bug fix。这些patch或是新版本中已支持但和我们实现有差异,或是由于版本差异过大无法合入社区,而且随着时间线的拉长,这种问题只会进一步恶化。 - 上层组件对于HBase存在一定需求:
得益于活跃的HBase生态圈,目前我们的用户使用形态也比较丰富,OLAP(Kylin)、时空索引(GeoMesa)、时序(OpenTSDB)、图(JanusGraph)等等场景不一而足。然而这些上层引擎无一例外,最新版本没有任何一款是依赖0.98版本HBase的。
因此对于HBase团队而言,升级迫在眉睫刻不容缓。
2.挑战
首先简单介绍一下HBase的架构。HBase是一个典型的主从结构——主备Master用于管理集群;RegionServer用于响应处理用户读写请求;使用ZooKeeper保障集群内的一致性;节点间通过RPC通信;底层数据文件HFile存储于HDFS中。
此外HBase具有相当丰富的上下游生态,从以StreamingSQL为代表的实时任务到Spark、MR等批处理任务,通过下图可以得窥一二:
基于以上对集群架构和上下游生态的梳理,可以明确升级过程中我们主要面临的挑战有:
- RPC接口兼容性问题:
升级不可能一蹴而就,因此我们需要确保所有RPC通信接口新旧版本完美兼容。 - HFile兼容性问题;
不同版本中底层文件的数据格式有差异。1.4.8版本默认使用HFile v3,幸运的是0.98版本虽然使用HFile v2,但已经可以兼容v3。这样我们就不需要再额外backport相关patch到0.98版本。此外也是基于这方面的因素,官方文档中说明0.98版本想要升级到2.x版本,必须以1.x版本作为过渡——这也是我们本次升级选择1.4.8版本的原因。 - 自有patch兼容性问题:
如上文所述,我们需要全量梳理自研的数十个patch——高版本是否有替代方案、替代方案是否兼容、是否需要移植到新版本、移植后的功能/性能/兼容性测试等。 - 上下游兼容性问题:
这一点大家看上图就好不需再赘述,每一种引擎的应用都需确保完全兼容。 - 可能引入的新问题:
HBase的社区release版本迄今仍然非常活跃,但同时这也意味着可能存在很多潜藏的问题(事实上我们在升级过程中也遇到了,解决了并反哺给社区)——这一点其实没有什么太好的办法,只能要求我们随时紧密跟进社区,洞察新进展,即时发现问题修复问题。
基于以上这些挑战点,其实不难得出一个结论:我们需要设计并实施大量的前置准备工作以保证升级过程的可靠性,但这并不是什么坏消息,因为只要我们的准备工作足够细致完善,顺利升级的把握和信心也就越强——这个思路在我们今后的工作中也同样适用。
下面简单列举了我们完成的准备工作:
- Release Note review
- 自研patch移植与测试
- 基础功能测试、性能测试
- 高阶功能测试(Bulkload,Snapshot,Replication,Coprocessor等)
- 社区后续小版本patch梳理跟进(截止目前实际合入的有100余个)
- 跨版本兼容性测试、RPC接口兼容性梳理
- 全量测试集制定与实施,涵盖HBase ,Phoenix,GeoMesa,OpenTSDB,Janusgraph等所有使用场景
- 软件包及配置文件准备
3. 升级方案
升级方案主要有两种:新建集群+数据迁移 和 滚动升级。
实际上滚动升级的方案一定是最优选,主要是出于对“release版本仍然不够稳定”的担忧,我们一度有所犹豫。但最终基于“充分的准备与测试”带给我们的信心,最终我们仍然选择了滚动升级。
简单说明滚动升级的大致步骤:
- 解决兼容性问题,主要体现在新建rsgroup元数据表并重写数据、
- 挂载新的coprocessor等;
- 升级master节点;
- 升级meta分组;
- 依次升级业务分组;
4. 实操及问题
我们从19年下半年启动了这一轮滚动升级的调研与准备,今年3月下旬正式开始线上操作,截至5月初已完成了国内外共计9个集群的升级工作,用户无感知。
在此期间我们也遇到了不少未解问题,这里摘取一个Critical问题做简单介绍:
region split过程中叠加RS宕机引发数据丢失:
region split是一个相当复杂的事务过程,大体可分为以下几步:
- RegionServer开始执行split事务,在ZK region-in-transition下创建该region的节点,标记为SPLIT;
- Master监听到新的split节点,开始做一些初始化工作,并修改内存状态,完成后将节点状态改为SPLITING;
- RS监听到节点状态变为SPLITING,开始正式执行split——关闭父region、创建子region文件夹并添加引用文件、修改meta表记录两个子region并将父region下线;
- 子region上线;
当父region下线、子region还未正式上线时RegionServer宕机,master上的ServerCrashProcedure线程开始进行回滚,会将子region删除;此外master上还有一个CatalogJanitor线程做数据清理,正常split过程中由于ZK上存在对应节点,这个线程会被阻塞;然而由于RS宕机,临时节点也随之消失,该线程正常工作,判断meta表中父region已经下线,从而将父region删除——至此父子region皆被删除,导致数据丢失。
修复方案已提交社区:HBASE-23693
其它patch list:
- HBASE-22620 修复replication znode积压问题;
- HBASE-21964 支持按Throttle Type取消quota设置;
- HBASE-24401 修复 hbase.server.keyvalue.maxsize=0 时append操作失败的问题;
- HBASE-24184 修复只使用simple ACL时snapshot相关操作的鉴权问题;
- HBASE-24485 Backport,优化堆外内存初始化时间;
- HBASE-24501 Backport,去除ByteBufferArray中非必要的锁;
- HBASE-24453 Backport,修复挪动表分组时缺少校验逻辑的问题;
5. 总结
本次升级工作从立项到完结耗时近一年,能够成功完成非常开心。一方面本次升级极大拉进了内部版本与社区release版本的距离,为更加良性的版本迭代及社区互动夯实了基础;另一方面新版本引入了诸多新特性,在稳定性、易用性方面都为我们带来了更为广阔的成长空间;更重要的是在这个过程中我们自身也沉淀出了一套系统的工作思路与方法论,期待后续可以更好的为业务赋能,为公司创造价值。
作者简介
滴滴资深猫奴,专注于HBase内核研发,滴滴HBase服务及上下游生态的建设与维护。
**欢迎关注滴滴技术公众号!
本文由博客群发一文多发等运营工具平台 OpenWrite 发布
滴滴HBase大版本滚动升级之旅的更多相关文章
- Kakfa集群(2.11-0.10.1.0)版本滚动升级方案
Kafka集群版本升级(2.11-0.10.1.0)升级(2.11-0.10.2.2) 官网升级说明: 一.系统环境Zookeeper集群:172.16.2.10172.16.2.11172.16.2 ...
- 入门Kubernetes - 滚动升级/回滚
一.前言 上一篇文章中对yaml文件格式进行了解,并对k8s中各种主要资源通过yaml创建时的定义模板.接来下就进一步学习k8s的各种特点.并应用在示例中. 接下来先实现.Net Core Api程序 ...
- HBase版本进化史及大版本特性
HBase 2.0 新特性介绍 2018年4月30日HBase发布了2.0的Release版本.HBase的2.0版本承载了太多的Features,共包含4551个Issues,可以说是迄今最大的一个 ...
- 10. 选主算法、多版本兼容性及滚动升级 | 深入浅出MGR
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 选主算法 2. 多版本兼容性 3. MGR 5.7滚动升级至8.0 4. 小结 参考资料.文档 免责声明 文章 ...
- SequoiaDB版本在线升级介绍说明
1.前言 在SequoiaDB数据库发展过程中,基本保持每半年对外发行一个正式的Release版本.并且每个新发布的Release版本相对老版本而言,性能方面都有很大的提高,并且数据库也会在新版本中加 ...
- kafka线上滚动升级方案记录
kafka升级方案 为什么进行kafka升级 一.修改unclean.leader.election.enabled默认值Kafka社区终于下定决心要把这个参数的默认值改成false,即不再允许出现u ...
- PostgreSQL版本快速升级
PostgreSQL版本快速升级 写在前面 PostgreSQL9.5版本支持数据分片的功能,为以后做分布式考虑,准备将生产环境的9.1版本升级至9.5.中间需要做数据迁移. 在迁移操作中,为保证数据 ...
- kubernetes云平台管理实战: 滚动升级秒级回滚(六)
一.nginx保证有两个版本 1.查看当前容器运行nginx版本 [root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS REST ...
- 一脸懵逼学习HBase的搭建(注意HBase的版本)
1:Hdfs分布式文件系统存的文件,文件存储. 2:Hbase是存储的数据,海量数据存储,作用是缓存的数据,将缓存的数据满后写入到Hdfs中. 3:hbase集群中的角色: ().一个或者多个主节点, ...
随机推荐
- 王艳 201771010127《面向对象程序设计(java)》第六周学习总结
实验六 继承定义与使用 一:理论部分: 第五章:继承类. 1.继承:已有类来构建新类的一种机制.档定义了一个新类继承另一个类时,这个新类就继承了这个类的方法和域,同时在新类中添加新的方法和域以适应新的 ...
- springboot连接数据源,配置数据库
Spring官方DriverManagerDataSource的配置 修改yml #配置数据源的属性 spring: datasource: driver-class-name: com.mysql. ...
- Spring MVC介绍和第一个例子
1.Spring mvc概述 spring mvc是spring提供给web应用框架设计,实际上MVC框架是一个设计理念.它不仅存在java世界中而且广泛在于各类语言和开发中,包括web的前端应用.对 ...
- rancher证书过期
背景 无法打开rancher服务,报错如下截图,可以看出是证书过期了无法连上k8s,注意这里的证书是rancher自身证书并非k8s证书. 解决方法 rancher升级:https://rancher ...
- Map.Entry的作用
一般情况下,要输出Map中的key 和 value 是先得到key的集合,然后再迭代(循环)由每个key得到每个value 而Entry可以一次性获得这两个值 Set set = map.keySet ...
- win上的python
#启用浏览器,最大化窗口 #coding = utf-8 from selenium import webdriver class MyClass(object): ''' classdocs ''' ...
- String类练习
1.模拟一个trim方法,去除字符串两端的空格 2.将一个字符串进行反转.将字符串中指定部分进行反转 3.获取一个字符串在另一个字符串中出现的次数 4.获取两个字符串中最大相同子串 5.对字符串中字符 ...
- Linux目录遍历opendir()
头文件:#include<dirent.h> DIR *opendir(const char *dirname); 打开目录 struct dirent *readdir(DIR *dir ...
- 【zookeeper】安装教程文档需下载
请查看文件https://download.csdn.net/download/qq_42158942/11846847 zookeeper的作用 • ZooKeeper 是一个开源的分布式协调服务, ...
- SpringBoot学习笔记(十五:OAuth2 )
@ 目录 一.OAuth 简介 1.什么是OAuth 2.OAuth 角色 3.OAuth 授权流程 4.OAuth授权模式 4.1.授权码 4.2.隐藏式 4.3.密码式 4.4.凭证式 二.实践 ...