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

数据双向复制中的6个数据冲突场景和解决思路

这是学习笔记的第 2162 篇文章


640?wx_fmt=gif

 

 在双向复制,数据多活中,核心的一个部分就是数据处理,如何保证数据的如下几个问题,是整个方案设计的关键技术。 

  • 数据错乱

  • 数据冲突

  • 数据回环

  • 数据一致性

数据错乱的部分主要是基于消息队列的处理内容,可以转化为基于消息队列的消息延迟,消息丢失,消息重复这几个场景进行细化。 

其中数据回环的部分可以参考之前的一篇文章。

在整个数据流转的过程中,如何处理数据冲突问题,我设定了如下的几个场景,欢迎留言补充。

场景1: INSERT导致的唯一性冲突

同步INSERT语句时违背了唯一性约束,例如双向同步的两个节点同时或者在极为接近的时间INSERT某一个主键值相同的记录,那么同步到对端时,会因为已经存在相同主键值的记录,导致Insert同步失败。

解决思路:

① 使用分布式ID的方案来规避,对于失败的写入,生成新的分布式ID重新应用

② 对于流水型数据,ID自增的方式,可以在写入时不解析id列,采用目标端和消费端的业务ID一致性

③ 对于流行型数据,ID自增的方式,写入采用了id列的方式,可以生成新的异常域(比如9999999999开头的ID列)消费应用

场景2: 表结构不同步导致的数据写入失败

在表结构变更过程中,可能因为同步延时问题,出现部分字段,约束不一致导致的数据写入失败

解决思路:

① 表结构变更过程需要避免DML写入,新增字段如果不为空,需要考虑设置默认值

② 数据应用解析需要指定字段名和字段顺序

③ 对于新增字段的操作,比如数据字段约束(如不为空)写入失败,需要重新修改JSON数据,重新推送消费

④ 对于删除字段的操作,比如字段不一致导致写入失败,需要重新修改JSON数据,重新推送消费

场景3: 字段顺序不一致导致的数据写入失败

解决方法:

① 需要在初始化时维护两端的字段顺序,确保一致

② 通过后端的服务进行字段稽核,分为周期性或者主动监测

③ 对于insert语句,在消费数据时,需要指定字段顺序

场景4:UPDATE更新的记录不完全匹配

1) UPDATE要更新的记录在同步目标实例中不存在

解决思路:数据操作转换为幂等SQL,转换为INSERT ON DUPLICATE模式

2) UPDATE要更新的记录出现主键或唯一键冲突

解决思路:

对于状态型数据,如果存在update操作中的唯一性冲突,需要对该记录进行持久化,并阻塞后续对于此记录的事务处理操作,结合业务场景进行分析

场景5: DELETE对应的记录不存在

DELETE要删除的记录在同步的目标实例中不存在。

解决思路:出现这种冲突时,不论配置何种冲突修复策略,可以选择忽略DELETE此类操作。

场景6:表不存在

对一些数据存在周期性管理,可能会触发drop类操作,导致两端的表结构信息丢失

解决思路:

① 对于状态型数据,如果存在DML操作失败,需要对该记录进行持久化,并阻塞后续对于此记录的事务处理操作,稍后结合业务场景进行分析

② 对于流水型数据,如果存在DML操作失败,需要对该记录进行持久化,不阻塞后续对于此记录的事务处理操作,稍后结合业务场景进行分析

在这个基础上,对于数据消费方案和一致性方案,我们在明天给出一些设计方案。

近期热文:

转载热文:

QQ群号:763628645

QQ群二维码如下, 添加请注明:姓名+地区+职位,否则不予通过

640?wx_fmt=png

640?wx_fmt=png

相关文章:

  • MySQL多活数据消费服务设计方案
  • 数学有趣地超乎你的想象
  • MySQL中10多张表关联要做优化,怎么理解逻辑幂等
  • 回答:我不小心把公司的数据库给删了,该不该离职?
  • 医院门诊透视的生活万花筒
  • 图数据库Neo4j学习笔记系列
  • MySQL的主键命名挺任性,就这么定了
  • 运维开发和测试中常见的8个问题
  • MySQL数据清理有技巧,这么破
  • 《奇葩说》救猫还是救画,我做了认真的分析
  • 程序员开发效率神器汇总!
  • 瞎忙之余的一些小结
  • 关于高可用,我们关注得好像有点窄
  • 去IOE or Not?
  • 拉里·佩奇(Larry Page)的伟大归来
  • Angular数据绑定机制
  • Cumulo 的 ClojureScript 模块已经成型
  • es6要点
  • HTTP--网络协议分层,http历史(二)
  • Linux后台研发超实用命令总结
  • Redis学习笔记 - pipline(流水线、管道)
  • springMvc学习笔记(2)
  • 阿里研究院入选中国企业智库系统影响力榜
  • 观察者模式实现非直接耦合
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 开源地图数据可视化库——mapnik
  • 聊聊sentinel的DegradeSlot
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何设计一个比特币钱包服务
  • 使用agvtool更改app version/build
  • 双管齐下,VMware的容器新战略
  • 思维导图—你不知道的JavaScript中卷
  • 温故知新之javascript面向对象
  • 用mpvue开发微信小程序
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 在weex里面使用chart图表
  • 自制字幕遮挡器
  • 带你开发类似Pokemon Go的AR游戏
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # 达梦数据库知识点
  • #QT(串口助手-界面)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (剑指Offer)面试题34:丑数
  • (力扣)循环队列的实现与详解(C语言)
  • (区间dp) (经典例题) 石子合并
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)Unity3DUnity3D在android下调试
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算