分布式环境下的主从数据同步

news2025/4/2 22:32:02

目录

1. 数据同步的推/拉方式

1.1 主节点推送

1.2 从节点拉取

1.3 常见组件的推拉方式

2.复制方式

2.1 同步复制

2.2 异步复制

2.3 半同步复制

2.4 常见组件的同步方式

3.日志格式

3.1 基于语句复制 SBR

3.2 基于行复制 RBR

3.3 基于预写日志 WAL

3.4 基于触发器复制

4.不同复制架构下的同步机制

4.1 单主复制 Single Leader

4.2 多主复制 Multi Leader

4.3 无主复制 LeaderLess

4.4 分片集群 Sharding

5.主从数据一致性问题

5.1 写后读一致性

5.2 单调读

5.3 一致前缀读


1. 数据同步的推/拉方式

从数据同步如何触发的角度来看,有两种常见模式。根据实时性要求、系统规模、网络条件等进行选择。

1.1 主节点推送

当主节点数据变更时,主动向所有从节点推送新数据。

优点:

  • 实时性好:主节点有数据变更时可以立即通知从节点,减少延迟。
  • 负载均衡:主节点可以根据从节点的状态(如网络状况、处理能力等)分配任务。
  • 降低从节点负担:从节点不需要定期轮询主节点,减少网络和CPU占用。

缺点:

  • 复杂度高:需要维护一个可靠的通信机制,并且要处理可能出现的网络问题、同步丢失问题。
  • 扩展性挑战:随着从节点数量的增加,主节点可能成为瓶颈。

1.2 从节点拉取

从节点定期询问主节点是否有数据更新,有则拉取新数据。

优点:

  • 灵活性好:从节点轮询请求主节点,可根据自身情况调整拉取频率。
  • 易扩展:新增从节点时,只需配置好拉取逻辑即可,对主节点的影响较小。

缺点:

  • 存在延迟:取决于从节点设置的检查间隔,不能保证数据的即时一致性。
  • 增加主节点压力:频繁的轮询会增加主节点的负载。
  • 效率较低:即使没有新数据更新也需要发起查询请求,浪费资源。

1.3 常见组件的推拉方式

组件
同步方式
MySQL
从节点拉取(通过 binlog 实现)
Etcd
主节点推送(raft 协议同步数据) + 从节点拉取(心跳)
MongoDB副本集
从节点拉取(通过 oplog 实现)
Redis
从节点拉取(异步复制) + 主节点推送(首次全量同步)
ZooKeeper
主节点推送(ZAB 协议同步数据) + 从节点拉取(心跳)

2.复制方式

2.1 同步复制

leader 节点等待所有 follower 节点确认已接收到并处理完数据后,才执行后续操作。

优点:数据高度一致性

缺点:可能会导致性能瓶颈,特别是在网络延迟较高的情况下

适用场景:高一致性要求、分布式协调(如 etcd 的 raft 协议)

2.2 异步复制

leader 节点不需等待 follower 返回,直接继续后续操作。

优点:性能好,实时性高

缺点:数据同步有延迟,数据一致性较低

适用场景:日志分析、社交媒体等一致性要求不高的系统

2.3 半同步复制

介于同步复制和异步复制之间的一种折衷方案。在这种模式下,只要一个 follower 返回之后,leader 就可以进行下一步操作。

这种方式既保证了一定程度的数据一致性,又避免了完全同步复制带来的性能损耗。

适用场景:MySQL 半同步复制、MongoDB 的 w:majority 模式

注意:共识算法并不是半同步模式而是强同步模式,因为半同步只需 1 个节点返回即可,存在数据丢失风险;但是共识算法要求多数节点返回,是严格保证一致性的。

2.4 常见组件的同步方式

组件

默认同步方式

一致性级别

其他同步方式支持

MySQL

异步

可调(最终→强)

支持半同步(插件配置,需至少1个从节点确认),

组复制(多数节点同步)

PostgreSQL

同步(流复制)

可调

可配置为异步(synchronous_commit=off),

支持同步提交(remote_apply严格同步)

MongoDB

异步

可调(w:1→w:majority)

通过写关注(Write Concern)配置半同步(如w:majority+j:true)

Redis

异步

弱一致性

可使用WAIT命令,手动等待指定个数的节点复制完成,但本质还是异步的

Etcd

同步(Raft)

强一致性

不支持

Kafka

异步(acks=1)

可调

acks=all(等待所有节点确认),

min.insync.replicas控制最小同步副本数

比如查询 mysql binLog 的同步方式

SHOW VARIABLES LIKE 'sync_binlog';

有三种配置:

  • 0 - 不主动刷盘,由操作系统决定何时刷盘(安全性差,数据易丢失)
  • 1 - 每次提交事务时刷盘(安全性高,性能差)(默认值)
  • N - 每N次提交后刷盘(平衡安全性和性能)

3.日志格式

3.1 基于语句复制 SBR

基于语句的复制(SBR, Statement-Based Replication):leader 记录下它执行的每个语句(INSERT/UPDATE/DELETE)的日志,把日志发给 follower,每个 follower 解析并执行语句。

优点:生成的数据量小, 磁盘 IO 次数少,性能好

缺点:会导致 follower 上生成不同的数据(如使用 NOW()、RAND()、自增 ID、基于现有数据 UPDATE)

基于语句的复制在 mysql 5.1 之前使用,现在默认已经不再使用。

3.2 基于行复制 RBR

基于行的复制(RBR, Row-Based Replication):记录每行数据的变化,当数据被修改时,生成的日志包含被修改行的唯一标识,以及所有列的新值。

优点:由于复制的是原始数据,不会出现数据不一致的情况

缺点:数据量大,磁盘 IO、网络开销高

这种方式现在是 mysql binLog 默认的日志格式。可以通过命令查询:

SHOW VARIABLES LIKE 'binlog_format’;

有三种配置:

  • Statement: 基于语句复制
  • Row: 基于行复制(默认值)
  • Mixed: Statement 与 Row 混合(默认使用 Statement,涉及日期、函数相关时用 Row)

可以看出 mysql binLog 和 redis 复制方式刚好对应,redis 也是三种:

  • RDB:全量同步
  • AOF:增量同步
  • 混合模式

3.3 基于预写日志 WAL

预写日志(WAL, Write-Ahead Logging):在数据实际写入存储之前,先记录所有变更到日志(prepare状态),等待后台异步刷盘后,再将日志中的变更更新到数据文件(commit状态),所以 WAL 本质上是一种两阶段提交

这种方式适用于大多数类型的数据库。如 mysql 的 redoLog,etcd 的 raft log,pg 的 WAL,都是用的预写日志方式。

注意:WAL 和 RBR/SBR 并不冲突,比如 mysql 就是两种协调工作的: 

  • binLog 使用 RBR/SBR,工作在 Server 层,用于确保数据在多个节点上的一致性
  • redoLog 使用 WAL,工作在 InnoDB 引擎层,用于确保数据在单个节点上不丢失

关于 mysql 的几种日志可以看: (十一)MySQL日志篇,总结得相当之好了。

3.4 基于触发器复制

利用数据库的触发器功能,在特定事件发生时自动触发复制逻辑。虽然灵活性强,但由于依赖于数据库内部机制,维护成本较高。

4.不同复制架构下的同步机制

4.1 单主复制 Single Leader

只有一个主节点负责写操作,其余节点均为只读副本。

典型应用:mysql、pg、mongoDB副本集、etcd。

这是最常见也是最简单的复制模型,易于管理和维护,数据一致性强,但在高并发写入场景下可能存在瓶颈。

4.2 多主复制 Multi Leader

允许多个节点同时接受写操作。

典型应用:CouchDB、Cassandra、多活MySQL集群。

这种架构提高了系统的可用性和容错能力,但数据一致性较差,需要解决冲突

冲突检测与解决机制:

  • 最后写入胜利(LWW):基于时间戳选择最新值(可能丢数据)
  • 客户端解决:应用层合并冲突(如Git的合并冲突)
  • CRDTs(无冲突数据类型):数据结构本身支持自动合并(如计数器、集合)

4.3 无主复制 LeaderLess

没有明确的主节点概念,所有节点地位平等,均可接受读写请求。

典型应用:Dynamo、Cassandra、ScyllaDB。

此架构容错性高,非常适合分布式环境下的大规模部署,但同样数据一致性差

常用技术:

  • 读写仲裁(Quorum):写入时需成功W个节点,读取时需查询R个节点,满足W + R > N(N为副本总数)以保证一致性
  • hinted handoff:节点不可达时,其他节点暂存数据并在恢复后转发
  • 反熵(Anti-Entropy):后台进程定期同步节点间的差异数据

4.4 分片集群 Sharding

分片是一种水平拆分数据的架构模式,将数据集按特定规则(如哈希、范围)分布到多个节点上,每个节点只存储部分数据。

常见分片方式:

  • 哈希分片: 对分片键(如用户ID)计算哈希值,按哈希范围分配数据。如 redis、mongoDB、es
  • 范围分片: 按分片键的范围(如时间戳、ID区间)分配数据。如 mysql 分库分表
  • 目录分片: 维护一个动态查找表,记录数据与分片的映射关系。如 zookeeper

分片通常与复制结合使用,构成分片+副本的混合架构:

  • 分片层: 数据水平拆分到多个逻辑组
  • 副本层: 每个分片由一个主节点和多个从节点组成

5.主从数据一致性问题

5.1 写后读一致性

场景:用户写入数据后立刻读取,读到了 follower 节点,此时这条数据尚未同步,导致读到旧数据。

解决:

  • 如果是读用户自己的数据,则强制读主
  • 写入时记录时间戳,读取时确保从节点的数据时间 ≥ 写入时间戳
  • 写入后客户端将数据缓存,优先从缓存查询

5.2 单调读

场景: 同一用户连续多次读取时,可能看到数据回退(先读到新值,再读到旧值)。

解决:

  • 会话粘滞: 同一用户的请求始终路由到同一个节点
  • 客户端记录上次读取的版本号(时间戳),后续只接受 ≥ 该版本的数据

5.3 一致前缀读

场景:不同写入操作因网络乱序到达从库,导致读取到因果颠倒的数据。比如先看到 B 回复 A,再看到 A 的发言。

解决:

  • 跟踪写入的因果依赖关系(如向量时钟),确保从库按顺序更新
  • 使用全局有序日志(如共识算法),保证所有节点顺序写入

参考:

https://dev.mysql.com/doc/refman/8.0/en/replication-formats.html

(十一)MySQL日志篇之undo-log、redo-log、bin-log.....傻傻分不清!任何项目都会有日志,M - 掘金

(二十四)全解MySQL之主从篇:死磕主从复制中数据同步原理与优化主从复制是一种十分常见的高可用手段,MQ、Redis、 - 掘金

两万字长文解析raft算法原理

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

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

相关文章

蓝桥杯杯赛-日期模拟

知识点 处理日期 1. 按天枚举日期:逐天遍历起始日期到结束日期范围内的每个日期。 2. 处理闰年:正确判断闰年条件。闰年定义为:年份 满足以下任意一个条件:(闰年的2月只有29天) 满足下面一个条件就是闰年 1> 是 400 的倍数…

搭建开源笔记平台:outline

折腾的意义 为什么要自己搭建一个笔记平台?没理由,就是突然想试试。有时候突然有个想法,搜了一下正好有合适的方案,就顺手试一下。 其实已经有很多成熟的笔记软件,例如Notion/OneNote,但谁不想要一个数据完…

Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能

Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具,帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API,或者叫做一个工具类,包含一系列静态…

电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法

调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中,合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一:使用快捷键 大多数笔…

presto行转列

presto的行列转换和spark、hive一样也是通过外链语句实现的,只不过语法和关键子有点不同,如下 with tmp1 as (select 1,2,3 as a1,4,5,6 as a2 ) select * from tmp1 cross join unnest(split(tmp1.a1, ,),split(tmp1.a2, ,) ) as b(a1s,a2s) 结果如下

51c自动驾驶~合集15

我自己的原文哦~ https://blog.51cto.com/whaosoft/11720657 #DRAMA 首个基于Mamba的端到端运动规划器(新加坡国立) 运动规划是一项具有挑战性的任务,在高度动态和复杂的环境中生成安全可行的轨迹,形成自动驾驶汽车的核心能…

拼多多 anti-token unidbg 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 版本7.3-7.4 都试过加密没什…

【Git】5 个分区的切换方式及示例

目录 1. **工作区(Working Directory)**2. **缓存区(Stage/Index)**3. **本地仓库(Local Repository)**4. **远程仓库(Remote Repository)**5. **贮藏区(Stash&#xff0…

Java高频面试之并发编程-02

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:进程和线程的区别是什么? 1. 资源分配与独立性 进程: 独立性:每个进程拥有独立的内存…

openwebui和keycloak集成,使用keycloak的用户名和密码登录

1,实现效果 使用keycloak定义的用户名和密码,直接登录openwebui 2,实现原理 keycloak中用户信息中包含用户名和密码,以及email。 使用keycloak中的用户名和密码登录之后,会用email创建一个openwebui的账号。之后每次…

【区块链安全 | 第八篇】多签机制及恶意多签

部分参考:慢雾科技 文章目录 为什么需要多签多签机制Tron钱包下的恶意多签Tron 钱包多签权限分类Tron 多签机制的运作方式 恶意多签的过程黑客通过多签机制控制账户黑客剥夺用户权限,完全控制账户 恶意多签成因 在区块链中,多签(M…

二月公开赛Web-ssrfme

目录 环境搭建 题目分析 分析代码 解题过程 Redis未授权访问 寻找Flag 环境搭建 进入含有docker-compose.yml的文件内,拉取容器镜像 docker-compose up -d 题目分析 访问容器地址172.25.254.200:8091查看题目 分析代码 url通过GET请求访问界面&#xff0c…

告别枯燥工作,走向自动化

嘿,小伙伴们!今天给你们介绍两款超实用的RPA办公自动化软件,用它们,再也不用像机器一样做重复劳动啦,超省时间! 工具名称:影刀RPA(类似产品,八爪鱼 RPA,操作上…

可信数据空间:构筑安全可控数据流通

前言:可信数据空间是一种数据基础设施,发展可信数据空间是全国及各地数据基础设施建设的重要方面。国内数据空间的探索和实践仍然数据探索阶段。本期分享:可信数据空间构筑安全可控数据流通,包括可信数据空间技术介绍、如何助力数…

Zookeeper特性与节点数据类型

数据结构和监听机制 CP 文件系统形式存储 观察者模式监听节点数据变化、 临时节点客户端超时或发生异常节点就会删除 2888同步数据 3888选举端口 1.什么是Zookeeper ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来…

处理 Linux 信号:进程控制与异常管理的核心

个人主页:chian-ocean 文章专栏-Linux 前言: 在 Linux 操作系统中,信号是用于进程间通信的一种机制,能够向进程发送通知,指示某些事件的发生。信号通常由操作系统内核、硬件中断或其他进程发送。接收和处理信号是 Li…

【蓝桥杯每日一题】4.1

🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x "今日秃头刷题,明日荣耀加冕!" 今天我们来练习二分算法 不熟悉二分算法的朋友可以看:【C语言刷怪篇】二分法_编程解决算术问题-CSDN博客 …

分享系列项目的基础项目

本人分享了一系列的框架项目,它们共同需要依赖这个公共基础,结构如下图所示: 其中: audit: JPA的审计信息基础类auth:认证授权相关类config: 包括redis配置,client中token配置,openai文档配置…

为 MinIO AIStor 引入模型上下文协议(MCP)服务器

Anthropic 最近宣布的模型上下文协议 (MCP) 将改变我们与技术交互的方式。它允许自然语言通信替换许多任务的复杂命令行语法。不仅如此,语言模型还可以总结传统工具的丰富输出,并以人类可读的形式呈现关键信息。MinIO 是世界领先的…

数据结构实验1.1: 顺序表的操作及其应用

这里写自定义目录标题 一、实验目的二、注意事项三、实验内容(一)问题描述(二)基本要求 四,操作步骤(一)使用visual studio集成环境编写程序 五,示例代码六,运行效果 一、…