从MySQL迁移到TiDB,横向扩展Hive Metastore数据库
工业:知识共享
作者:胡梦宇(知乎平台工程师)
Transcreator:佳林陈;编辑:汤姆政府高级官员
志湖“你知道吗?”在文言文里的意思是“你知道吗?”是中国的Quora:一个问答网站,用户社区在这里创建、回答、编辑和组织各种各样的问题。作为中国最大的知识共享平台,我们有220万人注册用户和3000万个问题,网站上有超过1300万次答案。2019年8月,我们完成了f轮融资4.5亿美元.
在芝华,我们用MySQL作为蜂巢转移。随着HIVE的数据增长,MySQL存储了大约60 GB的数据,最大的表格有超过2000万行数据。虽然数据卷不会过度对独立MySQL数据库过多,但在Hive中运行查询或写入数据导致Metastore频繁操作。在这种情况下,MySQL MySQL Metastore的后端数据库成为整个系统的瓶颈。我们比较了多种解决方案,发现了Tidb.,开源分布式混合交易/分析处理(HTAP)数据库是最佳解决方案。由于TIDB的弹性可扩展性,我们可以在不担心数据库容量的情况下水平衡我们的元数据存储系统。
去年,我们发表了一个帖子这表明我们如何在毫秒级别保持查询响应时间,尽管具有超过1.3万亿行的数据。这篇文章成为各种媒体平台的击中黑客新闻和Dzone..今天,我将与您分享我们如何使用TIDB来水平扩展蜂巢转移,以满足我们不断增长的业务需求。
我们的痛点
Apache Hive.是一个基于Apache Hadoop之上的数据仓库软件项目,提供数据查询和分析。Hive Metastore是Hive的元数据管理工具。它提供了一系列用于操作元数据的接口,其后端存储通常使用像Derby或MySQL等关系数据库。除了Hive之外,许多计算框架还支持使用Hive Metastore作为元数据中心来查询底层Hadoop生态系统中的数据,例如Presto,Spark和Flink。
在芝华,我们用MySQL作为蜂巢转移。随着数据在Hive中增长,单个表在MySQL中存储了超过2000万行数据。当用户的任务在转移中具有密集操作时,它通常会慢慢甚至超时。这极大地影响了任务稳定性。如果继续,MySQL将不堪重负。因此,优化蜂巢转移至关重要。
要减少MySQL的数据大小并缓解转移压力,我们经常在MySQL中删除元数据。但是,在实践中,此政策具有以下缺点:
- 数据增长得比删除的速度快得多。
- 当我们删除一个有数百万个分区的大分区表的分区时,会给MySQL带来压力。我们必须控制此类查询的并发性,并且在高峰时间一次只能执行一个查询。否则,会影响Metastore中的其他操作,如
选择
和更新
操作。 - 在Zhihu,当删除元数据时,还删除了相应的数据。(我们删除了Hadoop分布式文件系统中的过时数据以节省成本。)此外,Hive用户有时会不正确地创建表并设置错误的分区路径。这导致错误被错误删除。
因此,我们开始寻找另一种解决办法。
解决方案我们比较
我们比较了多个选项,最终选择TiDB作为我们的解决方案。
MySQL分片
我们考虑使用MySQL分片来平衡集群中多个MySQL数据库的负载。然而,我们决定反对这项政策,因为它存在以下问题:
- 为了分片MySQL,我们需要修改Metastore界面来操作MySQL。这将涉及许多高风险的变化,并将使未来的Hive升级更加复杂。
- 我们每天将MySQL数据复制到Hive,进行数据治理和数据生命周期管理。我们使用内部数据复制平台来复制数据。如果我们使用了MySQL分片,那么我们需要更新数据复制平台的复制逻辑。
使用Federation标度Metastore
我们认为我们可以使用联邦扩展蜂巢转移。我们可以构成一个由MySQL和多组Hive转移组成的架构,并在转移前添加代理以根据某些规则分发请求。
但经过调查,我们发现这一政策也存在缺陷:
- 要启用Hive Metastore的联合,我们不需要修改转移,但我们必须维护一组路由组件。更重要的是,我们需要仔细设置路由规则。如果我们将现有的MySQL商店划分为不同的MySQL实例,则划分可能不均匀。这将导致子平整板之间的不平衡负载。
- 与MySQL共享解决方案一样,我们需要更新数据复制平台的复制逻辑。
TiDB具有弹性可扩展性,是完美的解决方案
Tidb.是构建的分布式SQL数据库pingcap.它的开源社区。它兼容MySQL,具有水平可伸缩性、强一致性和高可用性。这是OLTP和OLAP工作负载的一站式解决方案。您可以了解有关TIDB的架构的更多信息在这里.
当您回忆中,我们的问题是,当数据大小增加时,MySQL,受其独立性能的限制,无法提供良好的性能。当各个MySQL数据库形成群集时,复杂性大大增加。如果我们找到分布式的MySQL兼容数据库,我们可以解决这个问题。因此,TIDB是一个完美的匹配。
我们选择了TIDB,因为它具有以下优势:
- TIDB与MySQL协议兼容。我们的测试表明,TiDB支持Metastore中的所有插入、删除、更新和选择。使用TiDB不会带来任何兼容性问题。因此,我们需要做的就是将MySQL数据转储到TiDB。
- 由于它的分布式架构,TIDB远远超过MySQL大量数据集和大量的并发查询.
- TiDB具有良好的横向可伸缩性。它支持弹性可扩展性。无论我们选择MySQL分片或蜂巢转移联邦,我们都可以再次遇到瓶颈。然后,我们需要再次进行分片或蜂巢转移联合会。但TIDB解决了这个问题。
- TiDB在知乎中被广泛使用,相关技术相对成熟,因此我们可以控制迁移风险。
蜂巢结构
迁移到TiDB之前
在我们从MySQL迁移到TiDB之前,我们的Hive架构如下。在这个架构中,Zue是知乎内部使用的可视化查询界面。
迁移到TIDB后
当我们从MySQL迁移到TiDB后,Hive的架构是这样的:
您可以看到,在我们将元数据迁移到TiDB之后,架构几乎没有变化。在一个MySQL节点上的查询请求现在分布在TiDB集群中。TiDB集群越大,查询效率越高,性能提升越大。
迁移过程
我们是这样从MySQL迁移到TiDB的:
我们使用MySQL作为主数据库和TIDB作为辅助数据库,以实时将数据从MySQL复制到TIDB。
我们将转移节点的数量减少到一个,以防止多个转移节点同时向MySQL和TIDB写入,这会导致不一致的元数据。
在应用程序的非高峰时间,我们从主数据库切换到辅助数据库。我们使用TiDB作为主节点,并重新启动Metastore。
我们添加了回转移节点。
在迁移过程中,应用程序没有受到影响。现在TiDB在我们的生产环境中成功运行。
应用程序的运行状态
应用程序峰值中的操作执行时间
我们从Hive级别测试了数据库,模拟了应用程序峰值,并同时删除并添加了数百万个分区的表的分区。我们执行了Hive SQL语句,如下所示:
改变桌子“$ {table_name}”下降如果存在划分(...);改变桌子“$ {table_name}”添加如果不存在划分(...);
操作执行时间从迁移到迁移后10秒以下的45-75秒。
大型查询对数据库的影响
在Metastore层面,我们测试了一些Metastore提交的SQL语句,特别是那些会对Metastore造成很大压力的SQL语句,例如:
选择`A0`.`零件名称`那`A0`.`零件名称`作为`nucorder0.`从`分区``A0`剩下外加入`TBLS.``B0.`在`A0`.`tbl_id.`=`B0.`.`tbl_id.`剩下外加入`星展银行``C0.`在`B0.`.`DB_ID`=`C0.`.`DB_ID`在哪里`C0.`.`的名字`='$ {database_name}'和`B0.`.`TBL_NAME`=“$ {table_name}”命令经过`nucorder0.`
当Hive表的分区数非常大时,此SQL语句会给Metastore带来很大的压力。在迁移到TiDB之前,这类SQL语句在MySQL中的执行时间为30-40秒。迁移后,执行时间为6-7秒。多么显著的进步啊!
复制时间
安全数据表(SDS)表,具有超过1000万行数据,是转移中最大的表之一。数据复制平台转发中的SDS表的复制时间从90秒减少到15秒。
接下来是什么
在Hive Metastore案例中,TIDB帮助我们水平缩放我们的元数据存储数据库,因此我们不再需要担心我们的数据库存储容量。我们希望,在未来,TIDB可以提供交叉数据中心(DC)服务:通过数据副本的Cross-DC部署,TIDB可以连接在线和离线方案,以便我们可以进行实时提取,转换,加载(ETL)离线任务而不会导致在线服务压力。这将改善脱机ETL任务的实时性能。因此,我们正在发展tibigdata..
这个项目是由晓光太阳,志湖的Tikv维护者。目前,这是一个潜入项目Pingcap孵化器.PINGCAP孵化器旨在为TIDB生态开源项目建立孵化系统。对于所有项目,见pingcap-incubator GitHub上.您可以查看PingCAP孵化器的文档在这里.
TiBigData项目为TiDB提供了Presto和Flink的只读支持。未来,我们希望在PingCAP孵化器计划的支持下,与社区共同打造TiBigData项目,努力提升TiDB的大数据能力。