MySQL到TiDB:Hive Metastore横向扩展之路


MySQL到TiDB:Hive Metastore横向扩展之路

文章插图
一、背景大数据元数据服务Hive Metastore Service(以下简称HMS),存储着数据仓库中所依赖的所有元数据并提供相应的查询服务,使得计算引擎(Hive、Spark、Presto)能在海量数据中准确访问到需要访问的具体数据,其在离线数仓的稳定构建上扮演着举足轻重的角色 。vivo离线数仓的Hadoop集群基于CDH 5.14.4版本构建,HMS的版本选择跟随CDH大版本 , 当前使用版本为1.1.0-cdh5.14.4 。
vivo在HMS底层存储架构未升级前使用的是MySQL存储引擎,但随着vivo业务发展,数据爆炸式增长,存储的元数据也相应的增长到亿级别(PARTITION_PARAMS:8.1亿、
PARTITION_KEY_VALS:3.5亿、PARTITIONS:1.4亿),在如此大量的数据基数下,我们团队经常面临机器资源的性能瓶颈 , 往往用户多并发的去查询某些大分区表(50w+分区),机器资源的使用率就会被打满,从而导致元数据查询超时,严重时甚至整个HMS集群不可用,此时恢复手段只能暂时停服所有HMS节点 , 直到MySQL机器负载降下来后在逐步恢复服务 。为此,针对当前MySQL方案存在的严重性能瓶颈,HMS急需一套完善的横向扩展方案来解决当前燃眉之急 。
二、横向扩展技术方案选型为解决HMS的性能问题,我们团队对HMS横向扩展方案做了大量的调研工作,总体下来业内在HMS的横向扩展思路上主要分为对MySQL进行拆库扩展或用高性能的分布式引擎替代MySQL 。在第一种思路上做的比较成熟的方案有Hotels.com公司开源的Waggle Dance,实现了一个跨集群的Hive Metastore代理网关,他允许用户同时访问多个集群的数据 , 这些集群可以部署在不同的平台上,特别是云平台 。第二种思路当前主流的做法是用分布式存储引擎TiDB替换传统的MySQL引擎,在Hive社区中有不少公司对hive 2.x接入TiDB做了大量的测试并应用到生产中(详情点击) 。
2.1 Waggle DanceWaggle-dance向用户提供统一的入口 , 将来自Metastore客户端的请求路由到底层对应的Metastore服务,同时向用户隐藏了底层的Metastore分布,从而在逻辑层面整合了多个Metastore的Hive库表信息 。Waggle-dance实现了Metastore的Thrift API,客户端无需改动 , 对用户来说 , Waggle-dance就是一个Metastore 。其整体架构如下:
MySQL到TiDB:Hive Metastore横向扩展之路

文章插图
从Waggle-dance的架构中最突出的特性是其采用了多个不同的MySQL实例分担了原单MySQL实例的压力,除此之外其还有如下优势:
  1. 用户侧可以沿用Metastore客户端的用法,配置多台Waggle-dance的连接,在当前Waggle-dance连接服务不可用的时候切换到其他的Waggle-dance服务上 。
  2. Waggle-dance只需几秒即可启动 , 加上其无状态服务的特性,使得Waggle-dance具备高效的动态伸缩性,可以在业务高峰期快速上线新的服务节点分散压力,在低峰期下线部分服务节点释放资源 。
  3. Waggle-dance作为一个网关服务,除了路由功能外,还支持后续的定制化开发和差异化部署 , 平台可根据需要添加诸如鉴权、防火墙过滤等功能 。
2.2 TiDB【MySQL到TiDB:Hive Metastore横向扩展之路】TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性 。在TiDB 4.x版本中 , 其性能及稳定性较与之前版本得到了很大的提升并满足HMS的元数据查询性能需求 。故我们对TiDB也做了相应的调研及测试 。结合HMS及大数据生态,采用TiDB作为元数据存储整体的部署架构如下:
MySQL到TiDB:Hive Metastore横向扩展之路

文章插图
 
由于TiDB本身具有水平扩展能力,扩展后能均分查询压力,该特性就是我们解决HMS查询性能瓶颈的大杀器 。除此外该架构还有如下优势:
  1. 用户无需任何改动;HMS侧面没有任何改动 , 只是其依赖的底层存储发生变化 。
  2. 不破坏数据的完整性,无需将数据拆分多个实例来分担压力,对HMS来说其就是一个完整、独立的数据库 。


    推荐阅读