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

单库平滑迁移至分库分表架构方案

背景

在我们完成新旧系统迁移之后(《系统重构新旧流量平滑迁移方案》),发现随着业务的不断发展,流量愈发的高出预期,原本新架构的单点数据库就有些吃力了。

此时我们需要将新交易平台的单点数据库升级为分库分表架构。

如何将同一个交易系统的数据由单数据库表平滑迁移至分库分表的数据库表中,成了目前主要的问题。

架构图

在这里插入图片描述

问题点

  1. 关于存量数据和增量数据如何处理
  2. 数据完整性如何保证?不能丢数据
  3. 数据实时性如何保证?订单临界点?订单的生命周期?(订单初始化 -> 订单交易完成)
  4. 数据校验:数据同步之后,是否有问题?新旧数据不一致?
  5. 容错保证?灰度?监控?回滚?告警?

方案

读旧写旧、双写读旧、增量数据一致性校验、存量数据同步(DataX)、存量数据一致性校验、双写读新、全量数据一致性校验、旧数据库下线。

数据双写一定要伴随着整个方案的生命周期,考虑到异常可以随时回滚。

读旧写旧

系统原本的方案

双写读旧

此时,我们增加了分库分表,对于我们的应用就有了两个数据源。

针对两个数据源同时进行订单写入操作,但此时我们读的还是旧库。

双写的方案有很多:

  1. 基于中间件读binlog日志同步到新库中
  2. 代码双写,在基础设施层加一层就可以了,数据量级大,加个MQ,削一下峰。

双写过程中,存在更新操作,我们如何判断是存量数据还是增量数据呢?
可以加一层判断,判断新库里面是否存在数据即可。

增量数据一致性校验

针对已经新库的增量订单,做好数据核对,可以及时发现系统问题。

  1. 量级不大,在本地库表写个定时任务写代码(连接双库客户端)比对就可以。
  2. 量级大,将双份数据同步到离线数仓,写sql比对也可以
  3. 如果考虑到实时性,可以在从库做sql比对
  4. 旁路验证策略:在旧系统每个交易节点读取数据的时候,发送一个旁路验证事件,去查一遍新库,做一下数据比对,如果不一样,及时告警,及时处理。

存量数据同步

  1. 数据完整性(数据打标)
  2. 不能覆盖增量数据(判断新库是否存在)

存量数据一致性校验

  1. 量级不大,在本地库表写个定时任务写代码(连接双库客户端)比对就可以。
  2. 量级大,将双份数据同步到离线数仓,写sql比对也可以
  3. 如果考虑到实时性,可以在从库做sql比对

双写读新

  1. 切流要逐步放量,可以根据指定业务字段,做动态配置容器。
  2. 读的时候要加开关,增加容错,出现问题,第一时间切回旧库。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数字营销中的人工智能 --- 完整指南 (By Hubspot)
  • 从0开始搭建vue + flask 旅游景点数据分析系统(九):旅游景点管理之增删改查
  • @Async 异步注解使用
  • 基于YOLOv10深度学习的草莓成熟度检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、人工智能
  • C# VideoCapture 多路视频播放
  • uniapp粘贴板地址识别 address-parse插件的使用
  • 20240810在荣品RK3588S-AHD开发板的预置Android13下挂载exFAT的256GB的TF卡
  • 十二、OpenCVSharp 中的图像匹配与模板匹配
  • buildroot是啥,用来干什么?怎么用
  • ImportError: DLL load failed: 找不到指定的程序的解决方案
  • GLM4 API 调用方法
  • CH07_数据绑定
  • 电子电气架构 --- 座舱域控制器:一芯多屏快速渗透
  • 【定稿】英飞凌Aurix2G TC3XX CAN模块详解
  • extern在头文件中添加是否必要?(C/C++)
  • 深入了解以太坊
  • [数据结构]链表的实现在PHP中
  • Angular 响应式表单 基础例子
  • FineReport中如何实现自动滚屏效果
  • HTTP请求重发
  • js数组之filter
  • Laravel 实践之路: 数据库迁移与数据填充
  • LeetCode18.四数之和 JavaScript
  • vue数据传递--我有特殊的实现技巧
  • 搞机器学习要哪些技能
  • 关于字符编码你应该知道的事情
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 自定义函数
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #565. 查找之大编号
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1)(1.11) SiK Radio v2(一)
  • (1)常见O(n^2)排序算法解析
  • (a /b)*c的值
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)fiber的基本认识
  • (二开)Flink 修改源码拓展 SQL 语法
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)Scala的“=”符号简介
  • .cfg\.dat\.mak(持续补充)
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)