免费试用
作者:段勇
案例实践
2024-06-04

导读

在 TiDB 走进多点活动中,来自马上消费金融的 DBA 段勇老师分享了《TiDB vs MySQL:消费金融公司在高并发、跨中心热备场景下的实践探索》,本文为分享实录。

段老师是一枚 TiDB 粉丝,在公司内部主要负责 TiDB 的维护管理工作,他分享了马上消费金融在选型、使用 TiDB 过程中遇到的一些经验和问题,包括高并发、多活热备等场景下的使用实践,您可以从中了解到 TiDB 和 MySQL 各自应用场景以及优劣势。相较于 MySQL,TiDB 在水平扩展能力、高可用性和简化数据栈等方面的优势。希望本文在数据库选型和应用层面对您有所裨益。

马上消费金融-段勇

马上消费金融股份有限公司(简称“马上消费”)是一家经原中国银保监会批准,持有消费金融牌照的科技驱动型金融机构。从 2015 年 6 月成立以来,完成三次增资扩股,注册资本金达到 40 多亿,累计交易额超过万亿。随着业务数据量的增长,马上消费使用的数据库面临着新的挑战。

消费金融机构为什么使用 MySQL?

MySQL 是一个典型的关系型数据库,经过多年深耕发展,已成为业内应用最广泛的数据库。它提供了关系型数据库里典型的功能,如数据安全性、事务处理、高可用以及性能优化等。其稳定性经过多年的考验,不论中小型企业,还是传统金融行业,都有很多的应用场景。

MySQL 应用场景

大家都知道金融机构对数据安全性的要求非常严苛,MySQL 之所以能够成为金融行业的选择对象,首先是因为它具有很高的可靠性和稳定性,这对于涉及大量交易记录、账户管理和风险管理的金融行业来说至关重要。其次是扩展性、性能表现、成本效益以及安全合规。这里重点介绍扩展性,MySQL 支持主从复制、读写分离、集群部署等多种高可用架构设计,可以有效应对金融行业日益增长的数据处理需求和并发访问量。但 MySQL 如果不做分库分表,就只能通过增加从库的方式进行只读扩展,写扩展需要做分库分表,实现难度大大增加。

金融行业选择MySQL

在使用 MySQL 过程中遇到的问题

MySQL 存在很多局限性,第一是大数据集处理,第二是高并发处理,第三是高可用与容灾恢复。前两个问题可以归结为一个,就是无法突破单机性能瓶颈的问题。高可用和容灾恢复同样也存在问题,比如异步复制,如果主节点的压力过大,就会存在主从延迟。如果选择高一致性,比如 MGR,那性能就会有损耗,这是一个两难的选择。

MySQL局限性

基于这三个痛点,我们在日常使用 MySQL 的时候,都会经历过三个阶段:首先是单机多库拆分,单库多表拆分,然后到冷热数据分离,最后到表数据分片。这三个处理方案其实都有各自的缺陷,下面一一展开:

集群拆分

集群拆分

在企业起步阶段,单个集群可能融合了多个数据库。随着业务量的增加,单个集群无法承载压力时,就会做库的拆分,按业务类型各自使用单独的集群,从而分散压力。如果是单库没法拆的情况下,我们会按照业务场景去分拆表,比如说 a 业务使用三个表, b 业务也使用三个表,那 a 业务的三个表就放到一个集群, b 业务放到另一个集群。这个方案局限性在哪?主要是单库的并发量,即使做了拆分,表的数据量达到一定程度之后,也无法满足业务的并发需求。此外,有的业务模型拥有几百张表,它们平常在处理业务的过程中,之间是有相互 join 的,这种情况就不满足拆分场景。还有一种是跨库关联,多个库里的一些表,需要去做一些 join,拆分之后显然无法实现了。

数据归档

数据归档

当单库的数据量已经到达一定规模,拆无可拆时,就需要做历史数据归档。比如说三个月前的数据可能用得不是特别频繁,那就可以把这三个月的数据直接放到归档平台。上图是一个典型的数据归档处理逻辑,首先提供一个归档平台,热数据放到在线的数据库集群,历史数据放到归档平台。但这个方案也有一些局限,比如历史数据保存了 3 年,但这 3 年的数据都有比较高频的访问,而且数据量特别大,数据没法做冷热分离,这个场景下归档就无法实现。我们的归档平台很多时候是基于 HBase 大数据平台搭建,对于高频的查询需求无法满足。此外,如果是单集群,近三个月的热点数据已经超过了单机性能瓶颈,这个方案也无法适用。

分库分表

分库分表

在 MySQL 层面,最终的解决方案就是大家常说的分库分表。它的基本逻辑就是把一个库拆成多个库,按这个库的 ID 取哈希,取模,然后分成若干个库。这个方案也存在一些难点,一是聚合查询,这么多库如果要关联查询怎么办?二是增加分片的时候,业务改造难度太大,也会导致运维成本增高。比如说有 64 个分片,如果要添加一个字段,在没有自动化管理平台的情况下,需要一个个手动添加这个字段。此外,从单库拆库时的业务改造难度也特别大,每一次拆库都会面临着业务的改造。

数据库选型关注事项

基于以上这些问题,我们迫切地想要引入分布式数据库。当时,我们做数据库选型主要关注以下几个方面:

  1. 开源社区活跃度。社区活跃度直接反映了这个数据库的成熟度,以及它在市场上的使用量;
  2. 读写协议兼容统一。我们之前的所有业务基本都是在 MySQL 上使用,要迁到一款新的分布式数据库,必须要兼容 MySQL 所有协议,尽量降低代码改造量;
  3. 有明确的服务边界。锚定分布式数据库的使用场景,我不想去挑战数据库的极限,如果这个数据库不支持我的业务场景,那也是不行的;
  4. 高可用。这款分布式数据库一定要满足业务对 PTO 和 RTO 的要求。

TiDB 与 MySQL 的关键特性对比:Why TiDB?

TiDB架构特点

基于上述这些选型标准,我们来看 TiDB 的架构特点:

  • 首先,TiDB 在数据一致性、可靠性、高可用以及可扩展性等方面表现成熟,与金融行业的属性比较吻合。
  • 其次,TiDB 完全能够满足可扩展性和并发要求高的 OLTP 场景。很多行业可能都把 TiDB 用在 OLAP 场景里,但其实对于大并发的 OLTP 场景,TiDB 也是不错的选择。
  • 第三,TiDB 满足 HTAP 场景需求,既做 OLTP 业务,也做 OLAP 业务。
MySQL与 TiDB对比

基于 TiDB 的这些特性,我们将 TiDB 与 MySQL-MGR 做了关键特性对比。对于 MySQL,我们有完整的 SOP,比如开发规范有严格的标准,数据量必须在什么范围内来使用 MySQL。超过了这个范围,就要去做拆分。此外,哪些参数必须满足,也都形成了严格的规范,比如说关联查询限制在多少个表,这些都是基于 MySQL 的局限性来考虑的。

支持场景类型:MySQL 支持 OLTP 的小并发场景,而 TiDB 对于 OLTP、OLAP 都能够支持。如果落地场景是 SQL 并发小,低延迟的交易系统,MySQL 的性能其实相对 TiDB 来说是要更优一点,而对于对账、跑批、归纳分析,以及并发量比较大的交易场景,TiDB 都有比较大的优势。

数据量要求:我们在生产环境中对数据量的要求是在 2TB 以下时使用 MySQL,大于 2T 小于 200T 使用 TiDB。目前,我们交易系统的数据量要求是在 50T 范围内,超过 50T 做归档的业务必须拆出去。在 TPS 层面,小于 2, 000 的 TPS 在 MySQL 上表现相对良好。如果业务增长特别快,必须在线扩展,对于 MySQL 来说相对比较困难,TiDB 就可以支持在线横向扩展。

单表大小:对单表的限制,我们现在一般在 MySQL 层面要求 5,000w 以内,在 TiDB 层面不会做太多限制。

总体而言,MySQL 在单机性能和成熟度上有明显优势,而 TiDB 在处理分布式、高并发、大规模数据场景下展现出卓越的扩展性和强一致性保证。

真实场景下的应用实践

TiDB 应用实践

我们对 TiDB 的应用实践,主要分为以下四个场景:

  1. 作为 MySQL 分片数据的聚合库。实现复杂的跨库、跨表、跨业务的实时查询。
  2. 三中心多活容灾。MySQL 在实现多活跨中心部署的时候,难度相对来说比较大。因为跨中心访问,要不建立主从,要不引入第三方同步工具,对它的主从延迟都是比较大的考验。而 TiDB 天然支持两地三中心的部署,每一个 zone 可以分别在自己的数据中心部署,任何一个数据中心宕机,数据完整性不受影响。
  3. 作为分库分表的替代方案。MySQL 需要做分表的时候,用 Sharding 选取相对比较复杂,分片的扩容难度相对来说也较高,用 TiDB 的话就可以规避这些问题。
  4. HTAP 混合计算。TiDB 作为典型的 OLTP 行存数据库,同时又兼具 OLAP 能力,比如 TiFlash、TiSpark 等,我们在真实的生产环境中也在使用。

海量交易数据存储与检索

海量交易数据存储与检索

上图是马上消费金融比较典型的在线业务系统消息平台,也是我们的 13 大核心系统之一。当前总数据量三副本已经达到 39 TB,最大表过了上百亿,每个月的增量差不多在 1.9T 左右。

消息平台的业务特点主要有两个:

  • 日增量大:每天的数据增量大约有 1, 000 多万,推送的跑批数据也有 1, 000 多万。热度数据按三个月计算,已超 18 亿。
  • 数据生命周期内高频访问:热数据量大,需要对 7 天内的数据进行多维度的统计计算;对近 2 个月的数据做频繁变更;对 3 个月内的数据进行频繁查询,日访问量达 20 万。

如果这个业务使用 MySQL 会特别困难,需要及时做分库分表,当时估算下来的成本差不多是 TiDB 的 2-3 倍。引入 TiDB 之后,我们使用了 36 个 TiKV,服务器规格都是 40C/128G/2TB,延迟控制在 500 毫秒以内。QPS 虽然看着并不高,但实际这个表都是上百亿的大表,这个 QPS 其实并不小,任何一点波动,它的延迟至少是两三倍。

数据仓库与分析平台

数据仓库与分析平台

第二个场景是数据仓库与分析平台。我们的数据库是做了分片的,线上的数据做了 64 个分片,数据通过 DM 汇聚到 TiDB 做分析查询。这个方案特点是 TiDB 横向扩展比较方便,不管业务数据怎么增长,通过 DM 同步过来之后,只要堆机器就行了。使用 DM 合并比较容易,无需通过 HBase 归档平台做复杂的关联查询,不用去想那些复杂的架构去做同步方案。

多中心部署

多中心部署

上图是我们目前的多中心部署架构。a 机房作为一个主机房,部署 3 个 TiDB,TiKV 每个分片按 3 个机房部署。其中,第三个机房作为多数派的投票机房,但它也真实存了数据。第二个机房作为热备机房。每个机房的 TiDB 数量一样,TiKV 数量一样。据我所知,目前国内很多金融机构也都是按照这套方案部署的。对于一写多读、双活、多活、RTO、RPO 这些标准,TiDB 都能够非常好地满足。

如果用 MySQL 实现多中心部署是比较困难的,因为主从延迟就没法规避,如果要减降低主从延迟,就得拆库,实现难度很高。对于这个架构而言,选择 TiDB 部署方案就会简单很多,但也有几个难点:

  • 第一,对网络的延迟要求很高。当时线上跨机房的网络延迟过高时,业务上对延迟的感知会成倍增长。
  • 第二,因为涉及到跨中心的网络访问,PD leader 要做合理规划。主机房的 PD leader 肯定要在自己的机房内,所以要做合理的策略调整。
  • 第三,TiKV leader 规划和成本间的衡量,需要根据自己的业务做合理的平衡。

总结

总结来说,MySQL 在单机性能和成熟度上有明显优势,这毋庸置疑,毕竟 MySQL 在各个行业都有使用场景,而且深耕了多年。而 TiDB 在处理分布式、高并发、大规模数据场景下展现出卓越的扩展性和强一致性保证。TiDB 的 Raft 协议、多副本原理对一致性都有不错的保证。两者在具体使用时应根据项目需求、数据规模、团队技能等因素综合考量。由于金融行业的特殊性,数据库的选择还要满足监管要求、稳定性、性能、安全性和技术支持等多个因素。

关于数据库选型,我认为没有更好的数据库,适合自己业务的,就是最好的数据库。

金融行业内容专区上线,为金融机构数据库选型和应用提供深入洞察和可靠参考路径。