NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 2020-06-18
  • 本文字数:2951 字

    阅读完需:约 10 分钟

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

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 版本仍然不够稳定”的担忧,我们一度有所犹豫。但最终基于“充分的准备与测试”带给我们的信心,最终我们仍然选择了滚动升级。


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


  1. 解决兼容性问题,主要体现在新建 rsgroup 元数据表并重写数据、挂载新的 coprocessor 等;

  2. 升级 master 节点;

  3. 升级 meta 分组;

  4. 依次升级业务分组;


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 服务及上下游生态的建设与维护。


本文转载自公众号滴滴技术(ID:didi_tech)。


原文链接


https://mp.weixin.qq.com/s?__biz=MzU1ODEzNjI2NA==&mid=2247492131&idx=1&sn=7dd0ea079f5290fe042da1d7b3a6597d&chksm=fc298c84cb5e0592390098c6746113e47794389c22b294d1b99575ebeec83a9733b3c525af1b&scene=27#wechat_redirect


2020-06-18 10:071797

评论 1 条评论

发布
用户头像
难度好大。
2020-06-22 10:31
回复
没有更多了
发现更多内容

不仅仅是一把瑞士军刀 —— Apifox的野望和不足

Liam

Java 程序员 Jmeter Postman swagger

2022年作为一个中年程序员写给35岁的自己

Linux服务器开发

c++ 程序员 架构师 Linux服务器开发 Linux后台开发

巧用对象存储回源绕过SSRF限制

火线安全

Web 云安全 web漏洞

Go Data Structures: Interfaces [中译]

hyx

源码 Go 语言

19 条有效的跨端 cpp 开发经验

阿里巴巴终端技术

cpp 跨端开发

华为云发布实时音视频行业加速器,为企业解决技术与商业双重难题

华为云开发者联盟

音视频 RTC 华为云 华为云实时音视频 DevRun

CSDN 数据库Meetup|OceanBase 技术专家讲述 SQL 的一生

OceanBase 数据库

oceanbase OceanBase 开源 OceanBase 社区版 OceanBase社区

想让DBA瞬间崩溃,那就让他去做SQL性能优化

华为云开发者联盟

数据库 sql 遍历 存储 优化SQL

高性能的连接管理和数据路由组件,OceanBase 生态工具 ODP 详解

OceanBase 数据库

oceanbase OceanBase 开源 OceanBase 社区版

8家正规云南等保测评机构名单看这里!

行云管家

等保 等保测评 等保2.0 云南

阿里本地生活端智能架构设计与技术探索

阿里巴巴终端技术

端智能

关于黑帕云用户迁移明道云的详细说明

明道云

直播预告 | PolarDB-X 动手实践系列——用 PolarDB-X + Flink 搭建实时数据大屏

阿里云数据库开源

数据库 阿里云 开源 分布式 polarDB

如何搭建B端产品帮助中心

小炮

帮助中心 B端用户

KubeVela: 如何用 100 行代码快速引入 AWS 最受欢迎的 50 种云资源

阿里巴巴云原生

谷歌云对象存储攻防

火线安全

安全攻防 对象存储 云安全

【性能测试工具lmbench】快来测测你的系统可以打几分

优麒麟

Linux 开源 系统管理 优麒麟

Web 键盘输入法应用开发指南(10)—— 性能与原理

天择

JavaScript 浏览器 键盘 输入法 3月月更

天翼云RDS数据库如何修改数据库参数

天翼云开发者社区

数据库 RDS

中国科协发布 2021 开源创新榜,阿里巴巴 2 大开源社区、5 大开源项目上榜

阿里巴巴云原生

明确生态边界的钉钉,让ToB从业者们松了口气

ToB行业头条

2022年网络运维必备软件和工具推荐

行云管家

运维 网络运维 IT运维 云管理

安全大讲堂 | 陈屹力:未来云原生安全能力建设将强调体系化的安全防护

腾讯安全云鼎实验室

云原生 安全大讲堂 云原生安全

如何选择天翼云云硬盘

天翼云开发者社区

云硬盘

天翼云虚拟IP地址及其在高可用集群中的应用

天翼云开发者社区

虚拟机

实现简易的 Vue 响应式

CRMEB

模块一作业

HZ

架构实战营

天翼云云硬盘的磁盘模式及共享盘

天翼云开发者社区

云存储 云硬盘

物理裸机配置如何转换为天翼云云主机配置

天翼云开发者社区

云主机

初创企业CRM系统解决方案

低代码小观

初创公司 企业微信 企业管理系统 CRM系统 客户关系管理系统

【OpenHarmony移植案例与原理】XTS子系统之应用兼容性测试用例开发

华为云开发者联盟

测试 OpenHarmony XTS 应用兼容性测试

滴滴HBase大版本滚动升级之旅_架构_唐天航_InfoQ精选文章