数据同步策略概览

news2025/1/16 19:12:55

数据同步在业务开发中比较普遍,例如 订阅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,用户体验不会差,同时极大程度减小同步延迟带来的影响。

写放大

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

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

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

相关文章

适合印刷企业使用的MES管理系统具备哪些特点

在当今竞争激烈的印刷行业中,提高生产效率、优化资源配置、确保产品质量与交期已成为企业生存与发展的关键。为此,引入一套高效、智能的印刷企业MES管理系统显得尤为重要。MES管理系统作为连接企业资源计划ERP系统与车间生产现场的桥梁,其设计…

Linux下的nc命令:网络工具的瑞士军刀

在 Linux 系统中,有许多强大的网络工具可用于网络连接、数据传输和端口扫描。其中一个非常强大的工具是 nc,也称为 Netcat,被称为网络工具的瑞士军刀,因为它可以执行各种网络任务。本文将深入探讨 nc 命令的使用方法,提…

第127天:内网安全-隧道搭建穿透上线FRPNPSSPPNgrokEW 项目

目录 案例一:内网穿透-Ngrok-入门-上线 案例二:内网穿透-Frp-简易型-上线 案例三: 内网穿透-Nps-自定义-上线 案例四:内网穿透-Spp-特殊协议-上线 案例一:内网穿透-Ngrok-入门-上线 这里我是用了一台云服务器&…

zy青岛实训day19 8/1

接着昨天的 npm run serve 构建项目 npm run build ls ls dist/ vim dist/index.html [rootweb eleme_web]# cd /usr/local/nginx/conf/ [rootweb conf]# ls 将静态的项目移动到nginx中 [rootweb nginx]# cd conf.d/ [rootweb conf.d]# ls qd.conf [rootweb conf.…

信息学奥赛初赛天天练-52-CSP-J2019基础题3-抽屉原理、鸽巢原理、乘法原理、二叉树遍历、前序遍历、中序遍历、后序遍历

PDF文档公众号回复关键字:20240801 2019 CSP-J 基础题3 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 11 新学期开学了,小胖想减肥,健身教练给小胖制定了两个训练方案。 …

个人的知识点小分享

type查看命令类型(内建命令/外部命令) [rootlocalhost ~]# type cd cd is a shell builtin [rootlocalhost ~]# type ls ls is aliased to ls --colorauto Ps 命令 --help 查看命令的常见选项 info 命令 #比man更详细的帮助命令。 回车…

arduino程序-MC猜数字1(基础知识)

arduino程序-MC猜数字1(基础知识) 1-18 MC猜数字0-介绍1-19 MC猜数字1-电路搭建电路图所需元件10根杜邦线(公对公)10根左右面包板跳线数码管按键电阻1个(200~500欧姆)面包板Arduino UNO R3*1 搭建电路相关程…

实验2-4-4 求简单交错序列前N项和

//实验2-4-4 求简单交错序列前N项和//计算序列 1 - 1/4 1/7 - 1/10 ... 的前N项之和。 #include<stdio.h> #include<math.h> int main(){int n;scanf("%d",&n);//输入在一行中给出一个正整数N。double sum0;for(int i1;i<n*3;i3){//i3>题目…

maven项目容器化运行之4-子模块利用Jenkins和maven使用docker插件调用远程docker构建服务

一.背景 之前期望把开发和部署分开&#xff0c;在上篇文章maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程docker构建服务并在1Panel中运行-CSDN博客已经实现了。主要思路是开发配置了pom文件&#xff0c;但是不管docker镜像打包。提交代码库后&#x…

马丁短链03用户信息脱敏

为什么后端脱敏&#xff1a; 因为如果给前端做&#xff0c;请求返回数据之后未脱敏&#xff0c;只在网页显示上脱敏&#xff0c;攻击者可以做一些简单请求直接看到返回信息&#xff0c;只能防一些小白。所以要在服务器这里做。 复杂的方法&#xff1a; 在controller层设置自定…

AI学习(1)软件的选择,cuda和pytorch的安装

文章目录 1.使用VScode开发&#xff0c;结合anaconda配置python环境2.安装pytorch库3.深度学习相关的库1.numpy&#xff08;科学计算库&#xff09;2.pandas(数据分析处理库)3.matplotlib&#xff08;可视化库&#xff09;4.seaborn&#xff08;可视化库&#xff09; 1.使用VSc…

VBA数据库解决方案第十三讲:如何获取数据库中表的相关信息

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

python lambda 表达式用法

1. lambda 表达式基础知识 python 含有 lambda 关键字&#xff0c;可使用 lambda 表达式创建匿名函数。 &#xff08;注&#xff1a;匿名函数可理解为没有函数名、函数体只包含一行代码的函数&#xff09; lambda 表达式的一般形式为&#xff1a;lambda arg_1, arg_2, …: ex…

2024年8月1日(前端服务器的配置以及tomcat环境的配置)

[rootstatic ~]# cd eleme_web/ [rootstatic eleme_web]# cd src/ [rootstatic src]# ls views/ AboutView.vue HomeView.vue [rootstatic src]# vim views/HomeView.vue [rootstatic src]# nohup npm run serve nohup: 忽略输入并把输出追加到"nohup.out" 构建项目…

定义和使用自己的子程序——函数的介绍

定义和使用自己的子程序——函数的介绍 1.函数基础语法1.1.基础语法1.2.例题1——距离函数题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示 2.void类型3.变量作用域和参数传递3.1.局部变量和全局变量3.2.形式参数和实际参数3.3.例题2——歌唱比赛题目描述输入格式输出…

ADSL常见故障及维护

ADSL常见故障及维护 ADSL的最简单故障判断方法&#xff1f; 解答&#xff1a;可根据ADSL Modem面板上的信号灯的显示情况进行问题的初步判断&#xff0c;如下&#xff1a; “ADSL”等&#xff1a;用于显示Modem的同步情况&#xff0c;常亮绿灯表示Modem与局端能够正常同步&…

JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存

文章目录 一、JVM基本介绍——概念、组成、重点1.1 JVM是什么1.2 JVM由哪些部分组成&#xff0c;运行流程是什么&#xff1f;1.3 JDK、JRE、JVM 关系1.4 学习什么 二、JVM组成2.1 什么是程序计数器2.2 你能详细地介绍堆吗2.3 什么是虚拟机栈2.4 垃圾回收是否涉及栈内存2.5 栈内…

2024.8.1(前端服务器的配置以及tomcat环境的配置)

回顾 [roottomcat ~]# cd eleme_web/public/img/ [roottomcat img]# ls 1.jpg [roottomcat public]# cd [roottomcat ~]# cd eleme_web/ [roottomcat eleme_web]# cd src [roottomcat src]# vim views/HomeView.vue [roottomcat src]# nohup npm run serve ctrlc后网页不出…

guitar pro为什么没声音 guitar pro8播放不了 Guitar Pro播放无声音或无光标解决办法

吉他是一种非常有魅力的乐器&#xff0c;用途也非常广泛&#xff0c;在吉他学习和训练过程中&#xff0c;我们会用到吉他打谱软件Guitar Pro。但有用户发现在使用Guitar Pro没有声音或无法播放的情况。下面我们看看Guitar Pro为什么没声音以及解决办法。 一、Guitar Pro为什么没…

8.1IO进程线程

笔记 进程 一.多进程引入 1.1引入目的 程序员写程序时&#xff0c;一个程序可能由多个任务组成&#xff0c;如果使用的是单进程&#xff0c;或单任务&#xff0c;那么该任务执行阻塞时&#xff0c;其他任务就无法执行&#xff0c;必须等到该任务解除阻塞后&#xff0c;才能…