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

数据同步策略概览

数据同步在业务开发中比较普遍,例如 订阅MySQL的binlog将数据同步至异构数据库。数据同步方案需要考虑一下几点:

  • 数据实时性要求
  • 数据量级
  • 是否有数据转换逻辑

可分为两种模式

  • 发布订阅模式:分为订阅数据库log还是订阅应用层发的消息
  • 点对点模式:分为推和拉

以下讨论几种比较通用的方法:

  1. 日志订阅:订阅数据生产方库表日志,如mysql的binlog
  2. 双写:数据生产方应用层双写,直接写入数据消费方或写入mq
  3. 定时批量select:基于updateTime等字段定时批量推送/拉取数据

同时,数据同步会存在以下几个普遍问题:

  1. 延迟
  2. 写放大

日志订阅

订阅db的日志,如mysql的binlog,进行数据同步,其他的异构数据源均以db数据作为 source-of-truth。

该方法实现了应用层的解耦,但系统复杂度增加。

MySQL 主从同步

主从同步Chapter 19 Replication

同步进度跟踪方式分为:

  • binary log based replication
  • global transaction identifiers (GTIDs) based replication

同步ack策略分为:

  • one way (asynchronous) replication
  • semi-synchronous replication
  • delayed replication

同步数据格式:

  • Statement Based Replication (SBR)
  • Row Based Replication (RBR)
  • Mixed Based Replication (MBR)

主从同步同步数据格式一般为Row Based,同步ack策略根据从库读写要求,一般主库备库设为semi-sync方式,其他RO库、大数据抽数库设为one way sync。

日志订阅中间件

databus, flink cdc, canal

数据同步工具之FlinkCDC/Canal/Debezium对比

双写

在应用层执行数据落库之后可以进行数据同步操作,比如直接调数据接口、发mq消息。
该方法实现简单、灵活性高, 但数据不一致的风险增加,需要配合巡检任务等兜底校验来减小不一致对业务的影响。

消息订阅

rocketMQ kafka …

本地消息表

基于本地消息表确保业务数据落库和消息发送的原子性,开源组件可参考spring-tx-message

Spring Event扩展点

基于Spring Event实现双写

参考:SpringEvent扩展性利器

MyBatis 拦截器

基于 MyBatis Interceptor实现双写

参考:Mybatis plugins

定时批量select

数据消费方可以定时拉取数据生产方的数据,批量导入消费方的本地库。

该方法同样可以自定义条件拉取数据并做逻辑转换,相当于定时ETL。

定时任务

Xxl-Job ElasticJob

任务执行需要保证幂等

批量

Spring Batch

同步延迟

同步延迟无法避免,在使用同步时需要考虑场景,强一致要求的场景还是得读数据源头。

此外,可以通过一些妥协避免延迟带来的业务影响,比如:前端调写库接口,写库后需要将数据同步到ES,ES本身也是准实时的(写入后1s内能查到),如果前端写完返回成功直接读后台接口,后台接口在ES查不到数据,就很奇怪。这时可以在前端写完后转圈圈1~2s,用户体验不会差,同时极大程度减小同步延迟带来的影响。

写放大

微批处理,根据业务主键只写最新数据

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算机网络-IGMP Snooping特性
  • python 参数输入
  • 【黄啊码】Gradio配合Openai接口实现机器人问答对话
  • JAR文件中混淆和加密class文件
  • Linux系统编程-多路IO套接字
  • GenAI 会消灭软件开发人员的工作吗?
  • Modbus通讯协议
  • linux top
  • 蓝牙网关北京厂家_蓝牙网关型号价格介绍
  • 软件安全测试内容和方法大揭秘,湖南软件测评公司推荐
  • ubuntu22安装k8s-1.24.17
  • 07 Redis List类型操作与使用场景
  • 【Vulnhub靶场AI-WEB-1.0打靶教程】
  • MySQL——日期与时间类型
  • 1000W长连接,如何建立和维护?千万用户IM 架构设计
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • angular2开源库收集
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • PHP的Ev教程三(Periodic watcher)
  • php的插入排序,通过双层for循环
  • spring学习第二天
  • ViewService——一种保证客户端与服务端同步的方法
  • vue中实现单选
  • 安装python包到指定虚拟环境
  • 汉诺塔算法
  • 检测对象或数组
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 力扣(LeetCode)56
  • 学习JavaScript数据结构与算法 — 树
  • 在weex里面使用chart图表
  • 正则表达式
  • 积累各种好的链接
  • 交换综合实验一
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • !$boo在php中什么意思,php前戏
  • ![CDATA[ ]] 是什么东东
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #Z2294. 打印树的直径
  • #微信小程序:微信小程序常见的配置传值
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (第61天)多租户架构(CDB/PDB)
  • (十五)使用Nexus创建Maven私服
  • (算法)N皇后问题
  • (一)WLAN定义和基本架构转
  • (转)可以带来幸福的一本书
  • .ai域名是什么后缀?
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET Core 项目指定SDK版本
  • .Net mvc总结
  • .NET6 命令行启动及发布单个Exe文件
  • @property括号内属性讲解
  • @RequestParam详解