数据分库分表和迁移方案

在我们业务快速发展的过程中,数据量必然也会迎来突飞猛涨。那么当我们的数据量百倍、千倍、万倍、亿倍增长后,原有的单表性能就不能满足我们日常的查询和写入了,此时数据架构就不得不进行拆分,比如单表拆分成10张表、100张表、单个月分多张表等等。下面我们针对具体案例分析下这种情况。

一、现状分析

直播签到业务中,有如下两张表,签到表和用户签到记录表。其中用户签到记录表t_sign_in_record现有数据量达到了18亿,数据占用空间为233G,索引占用空间为310G,总占用空间为543G。单表数据量太大,导致数据查询和写入性能过低。如果某条sql查询未使用到索引,很容易就会将数据库打挂。所以对t_sign_in_record的单表拆分很迫切

CREATE TABLE `t_sign_in` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id',`sign_in_id` varchar(64) NOT NULL DEFAULT '' COMMENT '签到id',`shop_id` varchar(64) NOT NULL DEFAULT '' COMMENT '商家id',`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_shop_sign` (`shop_id`,`sign_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='签到表';CREATE TABLE `t_sign_in_record` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增id',`sign_in_id` varchar(64) NOT NULL DEFAULT '' COMMENT '签到id',`shop_id` varchar(64) NOT NULL DEFAULT '' COMMENT '商家id',`user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '用户id',`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_shop_sign_user` (`shop_id`,`sign_id`,`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户签到记录表';

二、数据库设计

1、分表实例:依现有的存储空间做10倍的余量参考,所需空间大小为5.3T左右。而腾讯云MySQL最高支持存储空间上限是6TB,所以原有的腾讯云MySQL实例能满足需求。如果数据量更大,超过6TB的话,可以考虑将数据库迁移至TDSQL-C MySQL 版,最高支持至400TB。参考文档:https://cloud.tencent.com/document/product/1003/30488

2、分表数量:按照业务增长规模,每个月增量7千万-1亿,预计分10张表,平均单表数量在700万-1000万左右

3、分表算法:根据签到表t_sign_in的created_at中的年月日做如下算法,能让数据较均匀的落入每个月的10个分表中。分表的10张表名为t_sign_in_record_0、t_sign_in_record_1…t_sign_in_record_9
在这里插入图片描述

三、迁移方案

1、第一阶段:
双写数据,即将数据同时写入旧表t_sign_in_record和分表t_sign_in_record_0、t_sign_in_record_1、t_sign_in_record_2…中,此时需要去代码层创建和更新t_sign_in_record表的地方做处理,写入旧表的同时,写一份数据到新的分表。

2、第二阶段:
双写数据一致性校验,经过第一阶段的双写后,我们的新数据已经同时存在于新表和旧表中了,这个时候需要去check一下数据在旧表t_sign_in_record和分表t_sign_in_record_0…中是不是保持一致。有两个常用的检验方法:
(1)第一种是人工校验,即随机挑选一些签到,去check对应的签到记录条数和数据记录是否一致;
(2)另一种是写脚本去校验(全量数据或部分数据),将其中新老表中数据不匹配的记录输出到日志中,再去排查。

3、第三阶段:
写脚本,将旧表t_sign_in_record的存量数据都刷到分表t_sign_in_record_0…中。

4、第四阶段:
跟第二阶段的方式一样,去check第三阶段刷入的分表存量数据是否和旧表一致

5、第五阶段:
切读,将现网读 t_sign_in_record 表的地方都改为读新分表 t_sign_in_record_0、t_sign_in_record_1、t_sign_in_record_2…

6、第六阶段:
确认旧表 t_sign_in_record没有新的读请求。可通过DBA审计的方式。

7、第七阶段:
停止双写,即将代码改为只往新分表 t_sign_in_record_0、t_sign_in_record_1、t_sign_in_record_2… 里面写数据。

如上所述,迁移方案大概分为7个阶段,其中有三个阶段都是check数据一致性,在实际迁移时可以和其它步骤同时进行。拆分的整体时间周期一般为半个月到一个月之间,主要是其中为了确保数据一致性,需要灰度比较久

上面就是我们工作中常用的数据库表迁移方案了,有同学可能会甩锅给最初设计库表的同学,为啥当初设计的时候不考虑下分表呢?其实,这个是很难预估的,谁能知道最初一年只有几万数据的签到业务,现在每年会新增十来亿呢?这个主要取决于公司的发展了。

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

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

相关文章

线上突发:MySQL 自增 ID 用完,怎么办?

线上突发:MySQL 自增 ID 用完,怎么办? 1. 问题背景2. 场景复现3. 自增id用完怎么办?4. 总结 1. 问题背景 最近,我们在数据库巡检的时候发现了一个问题:线上的地址表自增主键用的是int类型。随着业务越做越…

Java导出通过Word模板导出docx文件并通过QQ邮箱发送

一、创建Word模板 {{company}}{{Date}}服务器运行情况报告一、服务器:总告警次数:{{ServerTotal}} 服务器IP:{{IPA}},总共告警次数:{{ServerATotal}} 服务器IP:{{IPB}},总共告警次数:{{ServerBTotal}} 服务器IP:{{IPC}}&#x…

【22】Word:小李-高新技术企业政策❗

目录 题目​ NO1.2 NO3 NO4 NO5.6 NO7.8 NO9.10 若文章中存在删除空白行等要求,可以到最后来完成。注意最后一定要检查此部分!注意:大多是和事例一样即可,不用一摸一样,但也不要差太多。 题目 NO1.2 F12Fn&a…

自动化部署(三):项目管理平台

一、项目管理平台作用 帮助团队高效规划、执行和监控项目进度,确保任务按时完成并实现目标 敏捷开发:提供标准敏捷研发管理,支持Scrum 与 Kanban 规模化敏捷:支持大型研发团队跨项目协同,实现多项目路线图规划和资源管…

常用集合-数据结构-MySql

目录 java核心: 常用集合与数据结构: 单例集合: 双列集合: 线程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue队列: ConcurrentSkipListMap和ConcurrentSkipListSet&…

IP属地与视频定位位置不一致:现象解析与影响探讨

在数字化时代,IP属地和视频定位位置已成为我们获取网络信息、判断内容真实性的重要依据。然而,有时我们会发现,某些视频内容中展示的定位位置与其发布者的IP属地并不一致。这种不一致现象引发了广泛的关注和讨论。本文旨在深入剖析IP属地与视…

计算机毕业设计hadoop+spark股票基金推荐系统 股票基金预测系统 股票基金可视化系统 股票基金数据分析 股票基金大数据 股票基金爬虫

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

机器学习-数据集划分

文章目录 一. 为什么要划分数据集二. 数据集划分的方法1. 留出法:2. 交叉验证:将数据集划分为训练集,验证集,测试集3. 留一法:4. 自助法: 一. 为什么要划分数据集 为了能够评估模型的泛化能力,可…

Vue 拦截监听原理

Vue 渐进式JavaScript 框架 学习笔记 - Vue 拦截监听原理 目录 拦截监听原理 如何跟踪变化 拦截监听示例 观察者 注意:vue3的变化 总结 拦截监听原理 如何跟踪变化 当你把一个普通的Javascript 对象传入 Vue 实例作为data选项,Vue 将遍历此对象所有的proper…

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析

本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中,我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现,以及基本的系统性能指标,包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…

基于JAVA的校园二手商品交易平台的设计与开发

摘 要:政府政策引导与社会观念的转变使得国内大学生的创业意识逐渐提高,很多高校大学生开始自主创业。目前我国各大高校暂且还没有较为成型的针对校内学生创业者的校园网络服务平台。本文首先主要是介绍了关于java语言以及web开发的相关技术,…

HarmonyOS Next 应用UI生成工具介绍

背景 HarmonyOS Next适配开发过程中难买难要参考之前逻辑,但是可能时间较长文档不全,只能参考Android或iOS代码,有些逻辑较重的场景还可以通过AI工具将Android 的Java代码逻辑转成TS完成部分复用。对于一些UI场景只能手动去写,虽…

总结6..

背包问题的解决过程 在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同…

【数据结构篇】顺序表 超详细

目录 一.顺序表的定义 1.顺序表的概念及结构 1.1线性表 2.顺序表的分类 2.1静态顺序表 2.2动态顺序表 二.动态顺序表的实现 1.准备工作和注意事项 2.顺序表的基本接口: 2.0 创建一个顺序表 2.1 顺序表的初始化 2.2 顺序表的销毁 2.3 顺序表的打印 3.顺序…

上位机工作感想-2024年工作总结和来年计划

随着工作年限的增增长,发现自己越来越不喜欢在博客里面写一些掺杂自己感想的东西了,或许是逐渐被工作逼得“成熟”了吧。2024年,学到了很多东西,做了很多项目,也帮别人解决了很多问题,唯独没有涨工资。来这…

阿里云-银行核心系统转型之业务建模与技术建模

业务领域建模包括业务建模和技术建模,整体建模流程图如下: 业务建模包括业务流程建模和业务对象建模 业务流程建模:通过对业务流程现状分析,结合目标核心系统建设能力要求,参考行业建 模成果,形成结构化的…

【C++笔记】红黑树封装map和set深度剖析

【C笔记】红黑树封装map和set深度剖析 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】红黑树封装map和set深度剖析前言一. 源码及框架分析1.1 源码框架分析 二. 模拟实现map和set2.1封装map和set 三.迭代器3.1思路…

win32汇编环境,怎么得到磁盘的盘符

;运行效果 ;win32汇编环境,怎么得到磁盘的盘符 ;以下代码主要为了展示一下原理,应用GetLogicalDrives、GetLogicalDriveStrings函数、屏蔽某些二进制位、按双字节复制内容等。以下代码最多查8个盘,即返回值中的1个字节的信息 ;直接抄进RadAsm可编译运行。…

mybatis(19/134)

大致了解了一下工具类,自己手敲了一边,java的封装还是真的省去了很多麻烦,封装成一个工具类就可以不用写很多重复的步骤,一个工厂对应一个数据库一个environment就好了。 mybatis中调用sql中的delete占位符里面需要有字符&#xf…

重学SpringBoot3-WebClient配置与使用详解

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备 2.1 依赖配置 3. WebClient配置 3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例 4.1 基本请求操…