0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

亿级别大表拆分心路历程

马哥Linux运维 来源:马哥Linux运维 2023-05-17 10:17 次阅读

# 前言

笔者是在两年前接手公司的财务系统的开发和维护工作。在系统移交的初期,笔者和团队就发现,系统内有一张5000W+的大表。

跟踪代码发现,该表是用于存储资金流水的表格,关联着众多功能点,同时也有众多的下游系统在使用这张表的数据。

进一步的观察发现,这张表还在以每月600W+的数据持续增长,也就是说,不超过半年,这张表会增长到1个亿!

这个数据量,对于mysql数据库来说是绝对无法继续维护的了,因此在接手系统两个月后,我们便开起了大表拆分的专项工作。(两个月时间实际上主要用来熟悉系统、消化堆积需求了)

# 拆表前系统状态

涉及到流水表流水的接口超时频发,部分接口基本不可用

每日新增流水缓慢,主要是插入数据库的时候非常慢

单表占用空间过大,DBA的数据库监控经常报警

无法对表进行变更,任何alter操作都会引起主从的高延迟和长时间锁表

# 拆表的目标

将流水大表数据拆分至各个分表,保证每张分表数据在1000W左右(经验上看单表1000W的量对mysql来说没啥压力)

在拆表的前提下,针对不同接口的查询条件进行优化,保证各个对外、对内接口的可用性。彻底杀死mysql慢查询。

# 难点分析

该表的数据可以说是整个财务系统最基础的数据,相关功能和下游系统非常多。这要求开发、测试和上线流程必须极其严密,任何小失误都会引起大问题。

涉及的场景非常多。统计下来,一共有26个场景,需要改造32个mapper方法,具体需要改造的方法就更加无计其数了。

数据量非常大,迁移数据的过程必须保证系统稳定。

用户较多且功能重要。分表功能上线时,必须尽量压缩系统无法使用时长,同时需要保证系统可用性。这要求团队必须设计完整可靠的上线流程、数据迁移方案、回滚方案、降级策略。

上文提到,表的拆分势必带来部分接口的变化,接口的变化又会带来其他系统的改造。如何推动其他系统进行改造,如何协调多方合作的开发、测试和上线是另一个难点。

# 整体过程

028f9f34-f44d-11ed-90ce-dac502259ad0.jpg

# 具体细节

分表中间件调研

分表插件:采用sharding-jdbc作为分表插件。

其优势如下:

1、支持多种分片策略,自动识别=或in判断具体在哪张分表里。

2、轻量级,作为maven依赖引入即可,对业务的侵入性极低。

为提升查询速度,在整个项目的初期,团队成员考虑引入ES存储流水以提升查询速度。

经过与ES维护团队的两轮讨论,发现公司提供的ES服务对于我们的业务场景并不匹配(见表),经过反复考量,最终我们放弃了引入ES的计划,直接从数据库查询数据,采用每张表设置一个查询线程的方式提升查询效率。

02a1c092-f44d-11ed-90ce-dac502259ad0.png

分表依据的选择

分表的方式有很多种,有纵向分表,有横向分表,有分为固定的几个表存储然后取模进行表拆分等等。总的来说,适合我们具体业务的分表方式只有横向分表。

因为对于资金流水这种特殊数据来说,是不能清理数据的,那么纵向分表和拆成固定的几个表都不能解决单表数据无限膨胀的问题。而横向分表,可以把每张表的数据量恒定,到一定时间后可以进行财务数据归档。

分表的依据一般都是根据表的某个或者某几个字段进行拆分,最终其实是对数据和业务分析综合出来的结果。总的来说,原则有这几个:

尽可能选择查询条件里最常出现的字段,这样能够减少方法改造的工程

需要考虑根据某个字段拆分数据是否能够均匀分布,是否能够满足单表1000W左右的要求

该字段必须是必现字段,不允许出现空值

综合分析我们的数据以及业务需要,“交易时间”这个分表依据就呼之欲出了。

首先,这个字段作为流水最重要的字段之一一定会出现;

第二,如果按照交易月份进行拆表,每张表大概也就是600W-700W的数据;

最后,有70%的查询都附带“交易时间”作为查询条件。

威廉希尔官方网站 难点

多数据源事务问题

sharding-jdbc在使用的时候是需要用自己的独立数据源的,那么就难免出现多数据源事务问题。

这个我们通过自定义注解,自定义切面开启事务,通过方法栈逐层回滚or提交的方式解决的。出于保密原则,具体代码细节不再展开。

多表的分页问题

拆表一定会引起分页查询的难度增加。由于各个表查出来的数据量不等,原始的sql语句limit不再适用,需要设计一个新方法便捷的获取分页信息

在此介绍一个分页的思路供大家参考(团队共同的成果,笔者不敢私自占有):

综合考虑业务实际与开发的复杂程度,项目团队决定在出现跨表查询的情况下,每一张表采用一个线程进行查询,以提高查询效率。

这个方案的难点在于分页规则的转换。例如,页面传入的offset和pageSize分别为8和20。各分表中符合条件的数量分别为10,10,50。那么我们需要将总的分页条件转化为三个分表各自的分页条件,如图

02a96fa4-f44d-11ed-90ce-dac502259ad0.jpg

通过上图可以看到,大分页条件(offset=8,pageSize=20),转换为(offset=8,pageSize=2),(offset=0.pageSize=10),(offset=0,pageSize=8)三个条件。

整个计算过程如下:

1) 多线程查询各个分表中满足条件的数据数量

2) 将各个表数量按照分表的先后顺序累加,形成图 8的数轴

3) 判断第一条数据和最后一条数据所在的表

4) 除第一条和最后一条数据所在表外,其他表offset=0,pageSize=总数量

5) 计算第一条数据的offset,pageSize

计算最后一条数据的pageSize,同时将该表查询条件的offset设置为0

数据迁移方案

在数据迁移前,团队讨论过两套迁移方案:

1)请DBA迁移数据;

2)手写代码迁移数据,他们各有自己的优缺点:

02b0a292-f44d-11ed-90ce-dac502259ad0.png

综合考虑时间成本和对线上数据库的影响,团队决定采用两种方案结合的方式:

交易时间为三个月前的冷数据,由于更新几率不大,采用代码的方式迁移,人为控制每次迁移数量,少量多次,蚂蚁搬家;

交易时间为三个月内的热数据,由于会在上线前频繁出现更新操作,则在上线前停止写操作,而后由DBA整体迁移。这样将时间成本平摊到平时,上线前只有约2个小时左右迁移数据时系统无法使用。

同时,除了最后一次DBA迁移数据外,能够人为控制每次迁移的数据量,整体避免数据库实例级别的高延迟。

整体上线流程

为保证新表拆分功能的稳定性和大表下线的稳定,团队将整个项目分为三个阶段:

第一阶段:建立分表,大表数据迁移分表,线上数据新表老表双写,所有查询走分表(验证观察)

第二阶段:停止写老数据表,其他业务直连数据库改为资金提供对外接口(验证观察)

第三阶段:大表下线

# 总结

应再进一步调研分表相关中间件。由于项目分表依据的特殊性,导致sharding-jdbc的很多功能无法利用,其对于简化查询逻辑的帮助低于预期。并且sharding-jdbc独立数据源的特性,引发了多数据源事务问题,反而增加了开发的工作量。

多线程需要仔细分析线程池核心线程的大小,同时分析多线程池同时存在的时候是否会引起核心线程数过多,避免机器线程打满。

如果是一个已有的项目,在进行分表改造时,一定要将各种场景都罗列清楚,将各个场景细化到程序中的每个类、每个方法中,将所有业务场景都覆盖到。

在迁移历史数据时,一定要做好迁移数据方案,以及应对出现数据不一致时的处理方案。要综合考虑时间成本、数据准确性、对线上功能的影响等诸多因素。

在上线一个比较复杂的方案时,一定要提前设计好回滚方案和降级措施,能够极大保证稳定性。

# 说点儿题外话

为啥说想说点儿题外话呢,主要是对这次延续了5个多月的项目有感而发。项目进行过程中,难免会与其他系统的维护团队有工作上的交集,有需要其他团队配合的地方。

这个时候非常考验程序员的沟通能力,最优秀的程序员能够通过话术把对方拉到自己的阵线当中,让对方感到这项工作对自己也是有好处的。这样能够让对方心甘情愿的配合你的工作,达到双赢的目的。

如果程序设计和学习能力是程序员的硬实力,那沟通技巧就是程序员的软实力,硬实力能够保障你的下线,而决定上线的恰恰是软实力。

因此很多程序员不注重沟通技巧的培养,其实是相当于瘸腿的,毕竟现在凭单打独斗是不大可能做出事情的。

另外,至少对于我们单位来说,对后端程序员的综合素质其实要求最高。后端程序员集业务、威廉希尔官方网站 于一身。需要有比较强的业务把控能力,还要有过硬的威廉希尔官方网站 素质。

同时,大多数工作的主owner是后端,一般都是后端程序员把控前端、后端、QA的开发节奏,协调好各个时间点,做好风险反馈。

这就要求后端程序员既要懂业务,还要懂威廉希尔官方网站 ,还需要有一定的管理能力。这其实对人的锻炼还是很可观的。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7022

    浏览量

    89018
  • 数据库
    +关注

    关注

    7

    文章

    3799

    浏览量

    64381
  • MySQL
    +关注

    关注

    1

    文章

    809

    浏览量

    26559

原文标题:麻了!亿级别大表拆分心路历程

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    今年就有L5级别自动驾驶?马斯克表示有信心

    特斯拉创建的任何模拟都是现实世界复杂性的子集,因此公司目前非常专注于处理L5级别自动驾驶的细节问题,而且他相信这些问题完全可以基于特斯拉车辆目前搭载的硬件版本来解决,而未来特斯拉的车辆只需要通过软件升级就可以实现L5级别自动驾驶
    的头像 发表于 07-10 09:44 4420次阅读

    解决Labview报表问题的一般思路

    执行创建excel时软件会卡死。心路历程1:软件报表工具坏了?遂用 NIPackage Manager 修复了报表工具包。但是无效问题依然存在。心路历程2:经过查询怀疑是注册问题,但没找到网上
    发表于 04-07 11:18

    【睿赛德 RW007 WiFi 模块试用连载】RW007模块调试心路历程

    本篇帖子是我拿到RW007后的试用记录,也算是心路历程了吧,我的试用文章:https://bbs.elecfans.com/jishu_2099349_1_1.html,欢迎各位去逛逛。2021
    发表于 07-12 22:20

    一个AVR新手蓝牙模块调试的心路历程简介遇到的问题

    一个AVR新手蓝牙模块调试的心路历程简介遇到的问题1——网上的例程不好用遇到的问题2——烧录串口与蓝牙通信串口共用导致乱码遇到的问题3——波特率导致乱码调试成功代码简介我在最近做了一个蓝牙小车,选用
    发表于 11-23 08:25

    学习单片机的心路历程分享

    本人是单片机学习的萌新一枚,学习单片机等知识目的就是提升自己专业方面的综合的素质修养,我将会把自己的每次的学习的内容和心理历程记录下来,分享给大家的同时也加深自己的理解。众所周知,单片机的入门51
    发表于 01-17 06:31

    手机界最防水机型:苹果8防水达IP68级别

    1月16日消息,去年推出的苹果7在防水性能上达到了IP67级别防水功能,苹果为此在苹果7广告上大力宣传防水功能,据苹果8最新消息称,苹果8在防水性能上得到升级,苹果8配置将达到IP68级别防水。
    发表于 01-17 09:01 4636次阅读

    3DMark的可变着色率测试加入Tier 2级别

    今年8月底,3DMark新增了一项VRS可变速率着色功能测试,可比较使用Tier 1级别VRS时的性能、画质差异,现在又更新加入了Tier 2级别
    的头像 发表于 12-06 09:41 2554次阅读

    元一能源从分布式光伏业务到综合能源业务的心路历程

    、产业和威廉希尔官方网站 进步态势等焦点话题,共迎分布式光伏发展的新契机。 在模式创新及业务探索分论坛上,元一能源副总裁陆少聪发表了《从1到N,元一能源从分布式光伏业务到综合能源业务的心路历程》演讲,分析行业面临的痛点难点,介绍元一能源
    的头像 发表于 11-28 09:41 1911次阅读

    上海将允许L3级别以上的自动驾驶车辆,在高速高架上行驶

     虽然当前各大车企相继宣称,都掌握开发除了L2级别以上的自动驾驶或者辅助自动驾驶威廉希尔官方网站 。
    的头像 发表于 12-15 14:34 2160次阅读

    黄仁勋分享作为工程师的心路历程

    获得者、宇航员和台积电创始人张忠谋等大型企业高管。 黄仁勋凭借“在加速人工智能计算实现的并行计算威廉希尔官方网站 领域所具有的远见卓识和创新精神”而荣获该奖。黄仁勋在线上的颁奖仪式上,回顾了他一路作为工程师的心路历程。 从热爱到深度
    的头像 发表于 08-02 11:36 3784次阅读

    一个AVR新手蓝牙模块调试的心路历程

    一个AVR新手蓝牙模块调试的心路历程简介遇到的问题1——网上的例程不好用遇到的问题2——烧录串口与蓝牙通信串口共用导致乱码遇到的问题3——波特率导致乱码调试成功代码简介我在最近做了一个蓝牙小车,选用
    发表于 11-15 09:51 36次下载
    一个AVR新手蓝牙模块调试的<b class='flag-5'>心路历程</b>

    【职场心灵鸡汤】以多年来拿最佳来复盘【工程师如何成为优秀的5%】

    【职场心灵鸡汤】以多年来拿最佳的心路历程来复盘【工程师如何成为优秀的5%】
    的头像 发表于 07-10 22:42 751次阅读
    【职场心灵鸡汤】以多年来拿最佳来复盘【工程师如何成为优秀的5%】

    编程的威廉希尔官方网站 |艺术|术术(上篇)骨灰程序员的心路历程

    分片编程等不太一样。我理解我们程序员编程面向的对象是人,是开发者,是程序员。用户并不看代码,看代码的都是我们的同行,所以我们要多一个面向开发者的思维角度来看待编程。 一位骨灰程序员的历程回顾 15岁开始编程序
    的头像 发表于 12-06 19:15 997次阅读

    亿级别拆分——记一次分表工作的心路历程

    这个数据量,对于mysql数据库来说是绝对无法继续维护的了,因此在接手系统两个月后,我们便开起了大拆分的专项工作。(两个月时间实际上主要用来熟悉系统、消化堆积需求了)
    的头像 发表于 05-18 11:03 445次阅读
    <b class='flag-5'>亿</b><b class='flag-5'>级别</b>大<b class='flag-5'>表</b><b class='flag-5'>拆分</b>——记一次分表工作的<b class='flag-5'>心路历程</b>

    l4级别自动驾驶的特点是什么

    L4级别自动驾驶作为自动驾驶威廉希尔官方网站 的一个重要里程碑,代表了高度自动化的驾驶模式,能够在无需驾驶员持续监控或介入的情况下,完成大部分的驾驶任务。 一、高度自动化与智能化 L4级别自动驾驶威廉希尔官方网站 的核心特点
    的头像 发表于 10-22 14:41 812次阅读