业务技术 | 线上单表数据量超过1亿,如何做分表迁移

news/2024/11/7 23:51:07/

问:在一个业务系统有一张表,里面的数据已经过亿了,使得在业务查询的过程中就越来越慢,如何进行优化?

首先说一下分表方案的基本思路。在分表之前,需要对我们原有的表做一个数据观察(或者说数据分析),是否满足分表的特性,也就是要看表中属性是否有一些共性或者分布均匀的一些字段。这样就可以作为hash的一个路由基础。

同时还需要综合考虑对业务的影响。那么我们如何判断表中是否有共性或者分布均匀的一些字段?比如一张表中有用户ID,订单ID和商户ID等字段,结合实际的业务场景,查看用户ID吗,订单ID等那个查询的次数更多,根据具体的场景制定一个具体的分表路由。

再形象一些,假设这张表是一张用户的明细表,那么表中记录用户的入账和出账等交易流水,在这样的维度下,我们一般从用户的角度去分析。比如去查询用户的信息、交易记录等等,根据这个分析,我们假设要把这过亿的数据分为256张表,就是通过用户ID来做,使 用户ID的hash值%256 ,用这种方式来判断用户记录的落表位置这,就使得同一个用户在同一张表上,从而简化业务逻辑的交互。

还有一些统计表是按时间维度来统计的,那么我们也可以使用年、月、日的形式来拆分表。

问:分表之后新数据写入新库,老数据也要迁移,那这个迁移如何实现?

一种效率较差的方案是停机迁移。在日常生活中见的比较多,也就是某些网站在凌晨0~6点进行系统维护,这就可能在做数据迁移,暂停整个网站的服务。这保证数据在迁移的过程中,没有新数据写入,这种模式如果在该过程中有新数据写入,可能就会导致数据丢失的情况。在停机之后,就运行早已写好的迁移脚本进行数据迁移,从单表中读出数据写入新的数据表中,同时修改数据库连接,最后重启项目。但是这种方式十分影响用户体验,同时也存在风险,比如一旦出现异常或者插入数据失败,此时由于时间比较紧迫,无法及时修复,使得整个迁移失败,比如出现停电或者服务器故障等等。

一种更加通用的方式是双写+同步迁移。它的实现思路是,在所有的主库中,只要是产生写入操作的地方,都进行双写处理。也就是说,新的数据不仅要写入到新表中,也要写入到老表中。而新表写入就用新的规则进行,查询正常还是查的是老表,当程序运行一段时间之后,如果发现新写入的数据都正常,就可以开始执行脚本,对老数据进行迁移,最后就是对数据的校验。这样我们的服务就不需要停机了。

实现双写的方式一般有两种,一种是使用MyBatis拦截器,去拦截修改操作,在拦截器中增加按照新表规则去修改,这样就不要去修改原来的代码了。另一种是通过canel+MQ 通过订阅的方式做数据同步。Canel可以理解为伪装成一个从数据库,只要主数据库有数据变更,Canel就会拿那条变更的SQL语句,然后操作的数据就会同步到比如kafka或者MQ中。然后再写一个程序去MQ上消费,来完成双写操作。老数据迁移还是使用脚本的方式,但是值得注意的是,不要一次性去跑完所有的数据,在开启双写之前,去记录双写开始的时间点,然后从这个时间点开始慢慢去分批去迁移,考虑服务的高峰期,错峰迁移。

最后,完成迁移之后,需要做一个切库切表的开关,把老表的访问切断。然后直接去访问新的数据库。这样对整个系统的性能提升。


http://www.ppmy.cn/news/67969.html

相关文章

yolov5检测小目标(附源码)

yolov5小目标检测(图像切割法附源码) 6.30 更新切割后的小图片的label数据处理 前言 yolov5大家都熟悉,通用性很强,但针对一些小目标检测的效果很差。 YOLOv5算法在训练模型的过程中,默认设置的图片大小为640x640像…

解密网站401错误:了解发生原因和修复方法

​  每个网站都会有不同的错误码,其中,401错误被认为是相对常见的错误码。那么,什么是网站401错误呢?在摸清了这一点之后,我们也需要学习一下如何解决它。 什么是 401 状态码? 401 状态代码是 Web 服务器发送给浏览器的 HTTP …

种棉12载的他,为何最终选择千耘导航?

边休息边种地,每天还能提升近四十亩作业量,是怎么做到的? 种地十二三年,为何最终选择了千耘农机导航? 千耘导航使用前后的工作状态究竟相差了多少? 让我们走进新疆阿克苏,听一听任师傅的“种…

CTFshow pwn03

题目: 在做本道题前,我们先了解所必要的知识 Libc是什么? 英文名字:Standard C library,其翻译过来,C语言标准库 它是符合ANSI C标准的一个函数库 学过C语言会明白 ANSI C标准又是什么? 198…

linux常见指令以及权限理解

1.linux下基本指令: ls指令: 查看文件的属性 ls-l:文件的属性 ls-la:显示所有文件的属性 ls *: linux任何一个目录下面都有两个隐藏文件: ..:表示当前路径的上级路径,可以原路返回 .&…

Red Hat Enterprise Linux (RHEL) 9.2 (x86_64, aarch64) - 红帽企业 Linux 9.2 发布

Red Hat Enterprise Linux (RHEL) 9.2 (x86_64, aarch64) 红帽企业 Linux 9.2 请访问原文链接:https://sysin.org/blog/rhel-9/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 红帽企业 Linux 9 红帽企业 Linux 9.…

【学习笔记】CF627E Orchestra

感觉最近似乎做不出什么题。 耐人寻味的数据范围。熟悉的问题。但是要 结合数据范围 自己编一个做法出来还挺难的。 我太菜了啊 我尝试去感知这道题目。对于二维坐标的限制无疑是困难的,不妨考虑当固定上下边界时,每一列点的数目为定值,那…

Flink从入门到精通之-09状态编程

Flink从入门到精通之-09状态编程 Flink 处理机制的核心,就是“有状态的流式计算”。我们在之前的章节中也已经多次提到了“状态”(state),不论是简单聚合、窗口聚合,还是处理函数的应用,都会有状态的身影出…