中欧财富:分布式数据库的应用历程和 TiDB 7.1 新特性探索

作者:张政俊 中欧财富数据库负责人

中欧财富:分布式数据库的应用历程和 TiDB 7.1 新特性探索

中欧财富是中欧基金控股的销售子公司,旗下 APP 实现业内基金品种全覆盖,提供基金交易、大数据选基、智慧定投、理财师咨询等投资工具及服务。中欧财富致力为投资者及合作伙伴提供一站式互联网财富管理解决方案,自 2015 年成立以来业务持续保持稳健的增长。

本文介绍了中欧财富在分布式数据库领域的探索历程,以及如何成功将业务系统迁移到 TiDB 平台的实践。文章详述了中欧财富采用 TiDB 的四个上线阶段,展现了 TiDB 在应对数据增长、处理 DDL 挑战以及优化写入性能等方面的卓越表现。此外,文章还特别强调了 TiDB 7.1 LTS 版本所带来的新特性,包括资源管控、Partitioned Raft KV 等,这些创新极大地提升了中欧财富的业务效益和性能水平。

分布式数据库的应用历程

中欧财富从 2021 年开始调研分布式数据库,希望通过使用分布式数据库来实现原有 MySQL 数据库不能满足的需求,从而解决业务层面遇到的技术难题。期间对 TiDB 做了全方位测试,证实了 TiDB 从架构角度是兼容的、从性能角度是达标的。2022 年,我们采购服务器开始部署 TiDB 集群,逐步将一些周边系统迁移到 TiDB 上 。今年,我们做了更详细的测试和验证,将更多更复杂的业务系统切换到 TiDB,上半年上线了四个系统,下半年计划再上线六个系统。

中欧财富的分布式数据库上线工作可以分为四个阶段:

第一阶段是业务的深度测试 。通过搭建和生产配置相同的并行环境,使用生产数据进行深度的测试。每个业务系统有各自的特点,场景都不一样。每次上线前,必须要保证测试是充分的:业务层面的测试要保证所有的业务都可以跑通;性能方面,每个业务的性能指标不能低于其原先在 MySQL 上的性能指标。横向对实时业务和跑批任务的效率进行对比,找出慢 SQL 并进行优化。

第二阶段是进行数据的同步 。通过 TiDB 提供的 DM 工具,将数据从生产 MySQL 实时同步至 TiDB 集群。当数据完成实时同步之后,再将原架构中 MySQL 下游的同步链路(MySQL 原生同步、Canal、FlinkCDC 等)全部切至 TiDB(通过 TiCDC 输出) ,之后进行两到三周的数据同步观察,校验数据的一致性。

第三阶段是应用上线 。一般会找一个小的停机窗口,关闭 DM 同步,确保数据的一致性之后,把应用切到 TiDB 上。

第四阶段就是上线后的保障工作 ,对已上线应用的运行情况和数据库的性能表现做跟踪观察。有些业务上线之后,可能会遇到一些测试上没有遇到的问题,也可能突然会有执行计划跳变这样的特殊情况,需要人工去进行处理。基本上我们每个系统上线,都会遵循这四个步骤去做。

下图是目前中欧财富 TiDB 集群的架构示意图。存储层采用 3 台 TiKV 每台 3 副本的配置,一共 9 个 TiKV 节点。3 个 TiDB 节点,TiDB 和 PD 采用混合部署模式。另外准备了两台内存配置较高的 TiDB 节点,将一些特殊的、较大的 SQL、比较占内存的 SQL 和慢 SQL 单独扔到这两台 TiDB Server 上去跑,一定程度上起到资源隔离的作用(生产使用 V6 版本暂时没有资源隔离功能)。此外,还有 3 台 TiFlash 节点,两台物理机用做 TiCDC 。

下面具体讲下业务的上线步骤。业务 A 和 业务 B 做了一些分表分库,分完库之后还需要做数据聚合,再同步到 MySQL 汇总库。除了汇总库之外,我们还有大数据平台,通过 Canal 去 MySQL 里面抽一些同步的数据,处理之后扔到大数据库。当要切到 TiDB 上的时候,我们先把 MySQL 的数据通过 DM 同步到 TiDB,TiDB 再通过 TiCDC 将数据写入到下游的汇总库,另一端输出到 Kafka 同步到大数据库。这个架构跑了一段时间,验证了数据同步是没问题后,就会把业务应用真正切到 TiDB 集群上。切换到时候只需要把 JDBC 链接内的地址配成 HAProxy 的地址,就完成一个业务系统的上线。

目前,中欧财富已经在 TiDB 集群上线了多套业务系统,包括费率系统、基金数据系统、风控系统、大事件系统、渠道系统和会员系统。我们计划在下半年上线更多的业务系统。TiDB 的应用正在向核心场景延伸,我们最新的组合投顾系统、营销系统、产品系统、用户系统,包括交易系统都已经在计划之中。

使用分布式数据库的收益

2021 年我们调研分布式数据库的时候,主要是因为我们的业务遇到了三个方面的挑战。

首先, 单表的数据增长非常迅速 ,我们开发和运维经常要配合着做各种分库分表,有些时候一个业务库没办法再分了。分表分库非常耗费人力成本,有些表刚分完没多久,单表数据量又很快增长到 5 亿+,数据需要再重新分片,这个工程量是非常巨大的。

其次,就是 大表的 DDL 。上两周就遇到这个问题,某个业务场景发生了变更,需要扩长字段,一张分表的 DDL 就要跑 6 小时,然后一共有十张分表,非常浪费时间。而且 DDL 在业务繁忙时间还不能跑,所以一个业务逻辑的 DDL 变更,DBA 可能需要拆分成几天,甚至几周去完成,对于运维的负担非常大。

第三,是 单节点写入 的问题。在 MySQL 传统的一主多从架构下,只有一个主节点可以写入,当遇到清算、调仓、跑批任务时,不能满足业务对写入吞吐量的要求。TiDB 是存算分离的架构,能在线扩容缩容,可以支撑高并发的 OLTP 场景,且满足金融级的高可用要求。

业务上线 TiDB 后,完美地解决了上述 3 个问题,从人力到成本都取得了非常大的收益。

TiDB V7.1 新特性探索

TiDB 每次大版本迭代,我们都会第一时间关注,因为一些新功能确实能解决一些用户的痛点。像我们以前用 MySQL 的话,没有遇到灾难级 BUG 的情况下,基本不会去升级 MySQL 的版本。因为我们觉得很久能带来的收益并不是很大,没必要去冒着风险。而 TiDB 的升级迭代,推出的新功能还是非常吸引人的。

比如 TiDB 7.1 LTS 版本,我们就发现里面的一些新特性非常有用。于是开始搭建环境进行探索,这里例举了四个我们的业务场景比较看重,而且后续会用到的新功能。

首先, 最重要是资源管控,也就是多租户功能 。数据库集群被划分为多个逻辑单元,可以将多个不同的应用放入一个集群中,即使某个业务应用出现负载飙升的情况,也不会影响其他业务的正常运行。金融业务场景下,统一集群启用资源管控之后,可以保证在线交易业务不会受批量或分析类业务的影响。

原有的 MySQL 架构还是一主两从,因为写入量比较大,而且还开着半同步复制,处理量大的时候,MySQL 主库还是有些延迟的,导致读写分离功能并不适用,两个从库基本上就是做灾难恢复用的,所以整体的资源使用率非常低。另外一些业务的流量高峰期是不同的,白天可能大家都在进行买卖,或者各渠道在推送数据,到了晚上可能就清算跑批。TiDB 可以通过多租户实现削峰填谷,提升整体资源使用率,降低运维成本。

另外资源管控还能起到限流的作用。生产上遇到 Bad SQL,或者是超级慢的 SQL 是很常见。如果遇到这种情况,我们在通过 SQL binding 的功能和资源管控的功能,结合起来使用,就能起到临时限流的作用。一般来说,限流做在 Proxy 层会比较多一点,但是我们现在不具备这种能力,如果数据库层遇到突发情况能做一个 SQL 级的、针对单 SQL 的限流,这是非常好的一个功能,不用去改代码重发应用,直接在数据库侧通过简单的 SQL Binding 和资源组就能做到。

第二个是 Partitioned Raft KV ,每个 Region 的数据都可以独立存储在单个实例中。这样每个 TiKV 实例可以存储更多的数据,我们比较关注的写入性能提升是非常大的,缩容扩容的速度也得到了显著提升。

第三个是负载自适应读取 。我们现在的业务包括之后要上的一些比较大的业务,都会出现读热点的情况,之前的打散热点方案都不适合我们的业务。有了负载自适应读取功能后,请求可以从其他 TiKV 节点读取副本,无需在热点 TiKV 节点排队等待。热点情况下,读取吞吐量可以提升 70% 到 200%,这个提升非常可观。

第四个是全局递增列 。这是 TiDB 6.5 的一个功能,但是我们生产在使用 6.1.2 版本,还没用上这个特性。全局递增列能保证 ID 唯一且单调递增,与 MySQL 的自增键完全一致了。之前预分配 ID 会导致我们部分业务的分页逻辑无法实现,需要开发同学对业务逻辑进行调整。有了全局自增列后,后面的业务上线时无需再对分页逻辑进行改造,进一步减少了开发成本。

未来展望

最后谈谈对 TiDB 的未来展望。

首先是希望推出 TiProxy,用来替代我们正在使用的 HAproxy。当前情况下如果 3 台 TiDB-server 进行升级,应用可能会连断三次,非常不友好,而 TiProxy 可以做到无损升级或重启。另外可以在 TiPrxoy 加上熔断和限流的功能,让整个架构更加灵活、可靠。TiProxy 甚至可以抓起整个数据库流量,并重放到其他环境或其他高版本的 TiDB 上,以检测新版本集群的稳定性,尤其在数据库版本迭代快速的情况下,让用户能更好地评估新版本是否可以用于生产。

第二,希望 TiDB 可以把功能平台进行集成。TiDB 提供很多工具平台,例如 Dashboard、TiUniManager、DM-web 等都是独立的平台,希望把这些工具都集成在一个集中管理平台上,甚至加上 TiCDC 的管理,这样对于运维人员的使用来说会更加便捷。

第三,希望提供巡检功能。系统上线之后查看问题都是靠人去 Dashboard 或 Grafna 平台查看具体情况,如果有巡检功能的话,可以省去人力开销。结合现在的 AI 技术,让 TiDB 出具一份集群的运行情况报告和优化建议,对用户来说是非常有意义的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis缓存雪崩、穿透、击穿解决方案

redis缓存雪崩、穿透、击穿解决方案 背景缓存雪崩缓存击穿缓存穿透总结背景 关于缓存异常,我们常见的有三个问题:缓存雪崩、缓存击穿、缓存穿透。这三个问题一旦发生,会导致大量请求直接落到数据库层面。如果请求的并发量很大,会影响数据库的运行,严重的会导致数据库宕机…

C++ Day6

目录 一、菱形继承 1.1 概念 1.2 格式 二、虚继承 2.1 作用 2.2 格式 2.3注意 三、多态 3.1函数重写 3.2 虚函数 3.3 赋值兼容规则 3.4 多态中,函数重写的原理 3.5 虚析构函数 3.5.1 格式 3.6 纯虚函数 3.6.1格式 四、抽象类 五、模板 5.1模板的特…

C#_GDI+ 绘图编程入门

官网提供相关API GDI 基本图形功能_drawing 高级二维和矢量图形功能_drawing2D GDI 图像处理功能_Imaging GDI 排版功能_text Windows 窗体应用程序提供打印功能_Printing 像素 构成图像的最小单位就是像素;屏幕上显示不管是位图或者矢量图,当描述…

计算机竞赛 基于GRU的 电影评论情感分析 - python 深度学习 情感分类

文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖,适合作为竞…

IP协议分片重组问题

分片是什么&&为什么会有分片 IP数据报分片的主要目的是为了防止IP数据报文长度超过下一跳链路MTU(最大传输单元)。 数据链路层之MTU 数据链路层中有一个东西叫做MTU(最大传输单元),它的作用主要是控制上层给的数据报不要太大&#…

LabVIEW | 串口基础【自学】

转载 B站   up:不烧板子 地址:https://www.bilibili.com/read/cv9435378 原博图片不清楚,自己重新跟学截图自留,侵删 文章目录 一、串口基础1.串口发送(1)简单发送(2)循环发送&…

〔019〕Stable Diffusion 之 单图中绘制多人分区域写提示词 篇

✨ 目录 🎈 下载区域绘制插件🎈 区域绘制使用🎈 参数讲解和基础使用🎈 Lora 自组🎈 Lora 自组的使用🎈 分区扩散🎈 分区域提示 🎈 下载区域绘制插件 在绘制图片时,经常绘…

解决博客不能解析PHP直接下载源码问题

背景: 在网站设置反向代理后,网站突然不能正常访问,而是会直接下载访问文件的PHP源码 解决办法: 由于在搞完反向代理之后,PHP版本变成了纯静态,所以网站不能正常解析;只需要把PHP版本恢复正常…

【ARMv8 SIMD和浮点指令编程】NEON 乘法指令——乘法知多少?

NEON 乘法指令包括向量乘法、向量乘加和向量乘减,还有和饱和相关的指令。总之,乘法指令是必修课,在我们的实际开发中会经常遇到。 1 MUL (by element) 乘(向量,按元素)。该指令将第一个源 SIMD&FP 寄存器中的向量元素乘以第二个源 SIMD&FP 寄存器中的指定值,将…

IDEA软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 IntelliJ IDEA是一款流行的Java集成开发环境(IDE),由捷克软件开发公司JetBrains开发。它专为Java开发人员设计,提供了许多高级功能和工具,使得开发人员能够更高效地编写…

stm32----SPI协议

一、概述 SPI(Serial Peripheral Interface,串行外围设备接口),是Motorola公司提出的一种同步串行接口技术,是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,节约…

C语言 - 结构体、结构体数组、结构体指针和结构体嵌套

结构体的意义 问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构: 学号(num): int 型姓名(…

2.Redis 通用命令

Redis 中最核心的两个命令: set 作用:设置 key 对应的 value 值并存储进去。若key已包含一个值,则无论其类型如何,都会覆盖该值。在SET操作成功时,将丢弃与密钥相关联的任何先前生存时间。 对于上述这里的 key和val…

五、Kafka消费者

目录 5.1 Kafka的消费方式5.2 Kafka 消费者工作流程1、总体流程2、消费者组原理3、消费者组初始化流程4、消费者组详细消费流程 5.3 消费者API1 独立消费者案例(订阅主题)2 独立消费者案例(订阅分区)3 消费者组案例 5.4 生产经验—…

Linux内核学习(十二)—— 页高速缓存和页回写(基于Linux 2.6内核)

目录 一、缓存手段 二、Linux 页高速缓存 三、flusher 线程 Linux 内核实现了一个被叫做页高速缓存(page cache)的磁盘缓存,它主要用来减少对磁盘的 I/O 操作。它是通过把磁盘中的数据缓存到内存中,把对磁盘的访问变为对物理内…

聚类分析 | MATLAB实现基于AHC聚类算法可视化

聚类分析 | MATLAB实现基于AHC聚类算法可视化 目录 聚类分析 | MATLAB实现基于AHC聚类算法可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 AHC聚类算法,聚类结果可视化,MATLAB程序。 Agglomerative Hierarchical Clustering(自底…

JVM ZGC垃圾收集器

ZGC垃圾收集器 ZGC(“Z”并非什么专业名词的缩写,这款收集器的名字就叫作Z Garbage Collector)是一款在JDK 11中新加入的具有实验性质[1]的低延迟垃圾收集器,是由Oracle公司研发的。 ZGC收集器是一款基于Region内存布局的&#…

为什么深度网络(vgg,resnet)最后都不使用softmax(概率归一)函数,而是直接加fc层?

这个问题很简单,并不是没有使用softmax,而是没有显式使用softmax。 随着深度学习框架的发展,为了更好的性能,部分框架选择了在使用交叉熵损失函数时默认加上softmax,这样无论你的输出层是什么,只要用了nn.…

Linux 打开U盘硬盘等报错 file type exfat not configured in kernel

目录 原因: 查看系统文件系统和当前系统版本 回归正题,如何解决报错 在centons 7中打开U盘,报错file type exfat not configured in kernel。 原因: 这是因为Linux采用的文件系统和我U盘的文件系统不一致引起。如下图&#xf…

2023蓝帽杯初赛ctf部分题目

Web LovePHP 打开网站环境,发现显示出源码 来可以看到php版本是7.4.33 简单分析了下,主要是道反序列化的题其中发现get传入的参数里有_号是非法字符,如果直接传值传入my_secret.flag,会被php处理掉 绕过 _ 的方法 对于__可以…