当前位置: 首页 > news >正文

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

原文来源: https://tidb.net/blog/ccbaeda2

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

导读

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

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

no-alt

中欧财富从 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 。

no-alt

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

no-alt

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

no-alt

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

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

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

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

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

no-alt

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 会导致我们部分业务的分页逻辑无法实现,需要开发同学对业务逻辑进行调整。有了全局自增列后,后面的业务上线时无需再对分页逻辑进行改造,进一步减少了开发成本。

no-alt

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

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

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

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

相关文章:

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

原文来源: https://tidb.net/blog/ccbaeda2 作者:张政俊, 中欧财富数据库负责人 导读 中欧财富是中欧基金控股的销售子公司,旗下 APP 实现业内基金品种全覆盖,提供基金交易、大数据选基、智慧定投、理财师咨询等…...

树莓 LUMA-OLED.EXAMPLE使用

详细介绍在文件目录下的README.rst中 第一步 $ sudo usermod -a -G i2c,spi,gpio pi //好像没什么用 $ sudo apt install python3-dev python3-pip python3-numpy libfreetype6-dev libjpeg-dev build-essential //安装依赖包,树莓派中好像已经有了 $ sudo a…...

C#,《小白学程序》第十一课:双向链表(Linked-List)其二,链表的插入与删除的方法(函数)与代码

1 文本格式 /// <summary> /// 改进的车站信息类 class /// 增加了 链表 需要的两个属性 Last Next /// </summary> public class StationAdvanced { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; ///…...

java IDEA文件路径分层级

如下图这样 在设置里找到Compact Middle Packages&#xff0c;去掉勾选就行了...

Spring AOP+Redis实现接口访问限制

目录 一、需求二、实现思路三、代码实现3.1 导入依赖3.2 配置redis3.3 自定义注解3.4 定义切面类3.5 自定义异常类3.6 全局异常处理器 一、需求 在我们程序中&#xff0c;有时候需要对一些接口做访问控制&#xff0c;使程序更稳定&#xff0c;最常用的一种是通过ip限制&#x…...

互联网后端技术大全!

互联网后端技术大全&#xff01; 一. 系统开发 高内聚/低耦合 高内聚 高内聚指一个软件模块是由相关性很强的代码组成&#xff0c;只负责一项任务&#xff0c;也就是常说的单一责任原则。模块的内聚反映模块内部联系的紧密程度。 低耦合 模块之间联系越紧密&#xff0c;其…...

Android SDK 上手指南||第九章 Manifest文件

第九章 Manifest文件 到目前为止&#xff0c;我们已经熟悉了Android项目中的各个组成部分&#xff0c;包括其资源。在今天的文章中&#xff0c;我们将以项目Manifest文件作为核心内容。 对于一个项目来说&#xff0c;Manifest既可以很简单、也可以很复杂&#xff0c;其具体情…...

CVE-2023-3450:锐捷 RG-BCR860 命令执行漏洞复现

锐捷 RG-BCR860 命令执行漏洞(CVE-2023-3450)复现 0x01 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本文作者无关&#xff0c;需自行负责&#xff01;&#xff01;&#xff01; 0x02 漏洞描述 Ruijie Networks RG-BCR860是中国锐捷网络&#xff08;R…...

【ES】elasticsearch8.3.3

这里仅实践操作并根据实际问题进行记录笔记。 运行 ES8 我们需要在自己的电脑上安装好 Docker Desktop。接着我们运行如下的命令&#xff1a;出现两个异常&#xff0c;一个是需要使用winpty因为我使用win的docker desktop&#xff0c;另外一个问题是docker启动elasticsearchE…...

2023年下半年广州/深圳软考(中/高级)认证报名,当然弘博创新

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…...

2017. 网格游戏;2397. 被列覆盖的最多行数;2202. K 次操作后最大化顶端元素

2017. 网格游戏 核心思想&#xff1a;前缀和枚举。读完题后可以发现&#xff0c;第一个机器人走的路线就像一条分割线&#xff0c;第二个机器人只能获得上面白色部分或者下面白色部分的最大值。这个最大值怎么求&#xff0c;我们可以通过前缀和来求&#xff0c;然后通过枚举转…...

专访远航汽车远勤山:踏踏实实做好产品 直面挑战乘风远航

8月25日&#xff0c;第二十六届成都国际汽车展览会在中国西部国际博览城隆重开幕。车展举办期间&#xff0c;远航汽车董事长远勤山先生、产品研发总监王震先生向媒体分享了远航汽车品牌发展、产品研发、技术创新以及市场布局等内容。 “通过我们的付出和努力&#xff0c;让我们…...

Redis基本了解

Redis 基于内存进⾏存储&#xff0c;⽀持 key-value 的存储形式&#xff0c;底层是⽤ C 语⾔编写的。 基于 key-value 形式的数据字典&#xff0c;结构⾮常简单&#xff0c;没有数据表的概念&#xff0c;直接⽤键值对的形式完成数据的管理&#xff0c;Redis ⽀持 5 种数据类型…...

Seata处理分布式事务之1.7.0

https://blog.csdn.net/zhang33565417/article/details/122768300 1.5.0之后版本发生了很大改变 1.seata安装 1.1官网地址 http://seata.io/zh-cn/ 1.2下载地址 https://github.com/seata/seata/releases 下载的是seata-server-1.7.0.zip 1.3seata相关配置的修改 seata-…...

在k8s中用label控制Pod部署到指定的node上

案例-标注k8s-node1是配置了SSD的节点 kubectl label node k8s-node1 disktypessd 查看标记 测试 将pod部署到disktypessd的节点上&#xff08;这里设置了k8s-node1为ssd&#xff09; 部署后查看结果-副本全都运行在了k8s-node1上—符合预期 删除标记 kubectl label node k8…...

vue3 搭配ElementPlus做基础表单校验 自定义表单校验

<script setup> import { ref, reactive } from vue// 表单元素 const dom ref(null) // 校验规则 const rules {name: [{ required: true, message: 请输入活动名称, trigger: blur }],//校验手机号格式phone: [{ required: true, message: "请输入电话", t…...

Vue项目中处理key=value格式的数据-案例

返回值 {qrCode: expiredAt1693821779265&token449d599830b8486a9c7b15e0bc3f036c, listenUri: wss://ws.abcdtest.link/?token0f63c64883ed7ea338e100a28946aba654165ad0f} expiredAt1693821779265&token449d599830b8486a9c7b15e0bc3f036c 需要处理上面的字符串 co…...

如何截取视频中的一段视频?分享几种视频分割方法

当处理长视频时&#xff0c;视频分割可以使您更加高效。如果您只需要处理其中的一部分&#xff0c;而不是整个视频&#xff0c;那么分割视频可以使您更容易找到需要处理的部分。而且&#xff0c;分割视频还可以使您更容易在不同的项目之间重复使用视频片段。教大家几种简单的视…...

《Go 语言第一课》课程学习笔记(十四)

接口 认识接口类型 接口类型是由 type 和 interface 关键字定义的一组方法集合&#xff0c;其中&#xff0c;方法集合唯一确定了这个接口类型所表示的接口。type MyInterface interface {M1(int) errorM2(io.Writer, ...string) }我们在接口类型的方法集合中声明的方法&#…...

windows下配置pcl-python

1.前提概要 python版本的pcl基本上只有3.6的能用&#xff0c;本人3.7/3.8均进行了尝试。 因为很多博主提到的Gtk已经下载不了了&#xff0c;实在是维护人员太懒了。如果你看到这里&#xff0c;可以试试下面这个链接&#xff0c;说不定又能用了呢。 Gtk下载&#xff1a;http:…...

CNN详细讲解

CNN(Convolutional Neural Network) 本文主要来讲解卷积神经网络。所讲解的思路借鉴的是李宏毅老师的课程。 CNN&#xff0c;它是专门被用在影像上的。 Image Classification 我们从影像分类开始说起。 我们举例来说&#xff0c;它固定的输入大小是100*100的解析度&#x…...

pdf怎么编辑文字?了解一下这几种编辑方法

pdf怎么编辑文字&#xff1f;PDF文件的普及使得它成为了一个重要的文件格式。然而&#xff0c;由于PDF文件的特性&#xff0c;它们不可直接编辑&#xff0c;这就使得PDF文件的修改变得比较麻烦。但是&#xff0c;不用担心&#xff0c;接下来这篇文章就给大家介绍几种编辑pdf文字…...

MASM32编程状态栏显示字符动画,按钮跑马灯

一、需求分析 由于sysInfo扫描的内容比较多&#xff0c;打算为它增加一点动画效果&#xff0c;提醒用户程序正在运行&#xff0c;耐心等待。 二、构建测试窗口 测试窗口上放置有一个按钮&#xff0c;按钮上的初始文字是“开始扫描”&#xff1b;并使用状态栏&#xff0c;状态…...

Pytorch-以数字识别更好地入门深度学习

目录 一、数据介绍 二、下载数据 三、可视化数据 四、模型构建 五、模型训练 六、模型预测 一、数据介绍 MNIST数据集是深度学习入门的经典案例&#xff0c;因为它具有以下优点&#xff1a; 1. 数据量小&#xff0c;计算速度快。MNIST数据集包含60000个训练样本和1000…...

微服务--服务介绍

Spring Cloud实现对比 Spring Cloud 作为一套标准&#xff0c;实现不一样 Spring Cloud AlibabaSpring Cloud NetflixSpring Cloud 官方Spring Cloud Zookeeper分布式配置Nacos ConficArchaiusSpring Cloud ConfigZookeeper服务注册/发现Nacos DiscoveryEureka--Zookeeper服务…...

自定义线程池-初识

自定义线程池-初步了解 创建一个固定大小的线程池 在Java中&#xff0c;你可以通过自定义线程池并指定线程的名称来实现你的需求。下面是一个简单的示例&#xff0c;展示了如何创建一个固定大小的线程池&#xff0c;并给每个线程指定一个名称&#xff1a; import java.util.…...

低代码平台:IVX 重新定义编程

目录 &#x1f36c;一、写在前面 &#x1f36c;二、低代码平台是什么 &#x1f36c;三、为什么程序员和技术管理者不太可能接受“低代码”平台&#xff1f; &#x1f36d;1、不安全&#xff08;锁定特性&#xff09; &#x1f36d;2、不信任 &#x1f36c;四、IVX低代码平台 &a…...

Android之自定义时间选择弹框

文章目录 前言一、效果图二、实现步骤1.自定义Dialog2.xml布局3.背景白色转角drawable4.取消按钮背景drawable5.确定按钮背景drawable6.NumberPicker样式和弹框样式7.弹框动画8.Activity使用 总结 前言 随着产品人员不断变态下&#xff0c;总是会要求我们的界面高大上&#xf…...

异地容灾系统和数据仓库系统设计和体系结构

&#xff08; 1&#xff09;生产系统数据同步到异地容灾系统 生产系统与异地容灾系统之间是通过百兆网连接的&#xff1b;生产系统的数据库是 Oracle 9i RAC&#xff0c;总的数据量大约为 3 TB&#xff0c;涉及五千多张表。对这些表进行分析归 类&#xff0c;发现容灾系统真正…...

【pytest】tep环境变量、fixtures、用例三者之间的关系

tep是一款测试工具&#xff0c;在pytest测试框架基础上集成了第三方包&#xff0c;提供项目脚手架&#xff0c;帮助以写Python代码方式&#xff0c;快速实现自动化项目落地。 在tep项目中&#xff0c;自动化测试用例都是放到tests目录下的&#xff0c;每个.py文件相互独立&…...