MySQL复制机制深入:半同步复制的两种模式、MGR的Paxos实现与GTID原理

简介: 半同步复制解决了异步复制的数据丢失风险,但AFTER_COMMIT和AFTER_SYNC两种等待模式的差异直接决定了故障切换时是否丢数据。MGR基于Paxos协议实现自动选主与脑裂防护,GTID则让主从切换不再依赖手工位点。本文从复制的基本原理出发,拆解MySQL复制的三层机制——异步复制的流程、半同步复制的等待模式、MGR的一致性协议与GTID的全局事务标识,并给出生产环境的选型建议。

大家好,我是小耶,写功课只是为了我踩过的坑,你们别再踩了!

MySQL的主从复制是最常用的高可用方案,但默认的异步复制有一个硬伤:主库写完即返回成功,binlog还没传到从库时主库宕机,这部分数据就丢了。

半同步复制解决了这个问题——主库等待至少一个从库确认收到binlog后才返回。但半同步复制有两种等待模式,选错了照样丢数据。

今天把MySQL复制这件事从基础到深入彻底讲清楚。

一、先搞清楚几个核心概念

Binlog(二进制日志) :MySQL Server层的日志,记录所有数据变更操作(INSERT、UPDATE、DELETE等)。Binlog以事件为单位,每个事件描述一个变更。它是主从复制的数据来源——从库通过读取主库的Binlog来同步数据。

Relay Log(中继日志) :从库上的日志。从库的I/O线程从主库拉取Binlog后,先写入本地的Relay Log,再由SQL线程读取Relay Log并重放。Relay Log相当于Binlog在从库上的中转站。

主库(Master) :接受写入操作的数据库实例,产生Binlog。

从库(Slave/Replica) :通过复制主库的Binlog来同步数据的数据库实例。

ACK(确认) :从库收到Binlog后向主库发送的确认信号。半同步复制依赖ACK来判断从库是否已收到数据。

SCN(System Change Number) :数据库系统的变更号,用于精确标识数据库在某个时间点的状态。在Oracle迁移场景中,SCN是增量同步的起始点。

GTID(Global Transaction Identifier) :全局事务标识符,格式为server_uuid:transaction_id,每个事务在提交时被分配一个全局唯一的GTID。

二、异步复制:基本流程与结构性问题

异步复制是MySQL默认的复制模式。它的工作流程分三步:

第一步:主库执行事务,写Binlog,存储引擎提交,返回客户端成功。

第二步:从库的I/O线程连接主库,请求从指定位置开始的Binlog。主库的Dump线程读取Binlog并发送给从库。从库I/O线程收到后写入本地的Relay Log。

第三步:从库的SQL线程读取Relay Log,重放其中的事件,更新从库数据。

异步复制的核心问题是数据丢失风险。 主库写完Binlog就返回客户端成功,完全不等待从库确认。如果主库在Binlog发送到从库之前宕机,这部分事务在从库上不存在。故障切换后,主库上已提交的数据在从库上消失了。

这个问题的本质是:异步复制的“复制”是一个后台过程,与主库的事务提交没有同步关系。

三、半同步复制:两种等待模式

半同步复制在异步复制的基础上增加了一个等待环节:主库在返回客户端之前,等待至少一个从库确认收到Binlog。

但“等待”发生在哪个环节,直接决定了故障切换时的数据一致性。MySQL 5.7引入了rpl_semi_sync_master_wait_point参数控制这个时机。

AFTER_COMMIT模式(MySQL 5.6默认)的执行顺序是:主库写Binlog → 主库存储引擎提交 → 发送Binlog到从库 → 等待从库ACK → 返回客户端。

问题出在第三步和第四步之间。主库已经提交了事务,其他客户端能看到这个事务的结果。但Binlog可能还没传到从库。故障切换到从库后,这个事务在从库上不存在——其他客户端在主库上看到的数据,在从库上消失了

AFTER_SYNC模式(MySQL 5.7+默认)把存储引擎的提交推迟到了ACK之后:主库写Binlog → 发送Binlog到从库 → 等待从库ACK → 主库存储引擎提交 → 返回客户端。

主库在等到从库确认之前,事务在存储引擎层面还未提交。其他客户端看不到这个事务的结果。主库宕机时,事务要么在从库上存在(ACK已发出),要么在主库上也不存在(ACK未发出)——两端数据始终一致

AFTER_SYNC模式解决的是主库崩溃时其他客户端看到的数据与从库不一致的问题。这也是MySQL 5.7之后默认使用AFTER_SYNC的原因。

四、MGR:基于Paxos的自动选主与脑裂防护

半同步复制解决了数据丢失风险,但故障切换仍然需要人工介入。MySQL Group Replication(MGR)在5.7.17引入,目标是实现自动选主和故障自愈。

MGR的核心是分布式状态机复制——组内所有服务器就数据库状态变更达成一致。每个事务在提交前,必须经过组内多数节点的认证和排序。这意味着MGR不依赖Binlog的异步传播,而是通过组通信协议保证数据一致性。

MGR的核心技术是Paxos算法的实现。Paxos充当组通信引擎,提供故障检测、组成员关系和全序消息传递。事务的提交顺序由组内多数节点投票决定,保证所有节点以相同顺序应用事务。

MGR支持两种运行模式:

单主模式:只有一个节点接受写入,系统自动选举主节点。主节点宕机后,组内自动选举新的主节点,无需人工介入。适合大多数生产场景。

多主模式:所有节点都可以接受写入。但多主模式对应用层有额外要求——并发写入可能产生冲突,需要应用层处理。适合对写入扩展要求极高的场景。

MGR内置了脑裂保护机制。如果网络分区导致组内成员无法达成多数一致,系统在问题解决之前不会继续处理事务。这种保护保证了数据不会因为网络问题而在两个分区上分别写入、产生冲突。

五、GTID:让主从切换不再依赖手工位点

传统复制依赖Binlog文件名和位点来定位同步位置。主从切换时,DBA需要手动查找从库的同步位点,操作复杂且容易出错。GTID解决了这个问题。

每个事务在提交时被分配一个全局唯一的GTID,格式是server_uuid:transaction_id。从库记录已执行的GTID集合,主从切换后,从库会自动跳过已执行的GTID,只同步缺失的事务。

GTID的核心价值是自动定位。不再需要手动指定MASTER_LOG_FILEMASTER_LOG_POS,从库通过GTID集合判断自己缺哪些事务,自动向新主库请求。

GTID的启用需要按顺序切换gtid_mode,不能直接跳变。gtid_mode有四个值:OFF(只能复制匿名事务)、OFF_PERMISSIVE(新事务匿名,可复制GTID或匿名)、ON_PERMISSIVE(新事务GTID,可复制GTID或匿名)、ON(所有事务必须GTID)。在线切换必须按OFF → OFF_PERMISSIVE → ON_PERMISSIVE → ON的顺序逐步过渡。

生产环境的最佳实践是:从一开始就启用GTID。 故障切换变得可靠,新副本创建不再是麻烦事,缺失的事务可以快速定位。

六、三种复制模式怎么选

复制模式 数据一致性 RTO 适用场景
异步复制 可能丢数据 分钟级(需人工切换) 非核心业务、日志同步
半同步复制 不丢数据(AFTER_SYNC) 分钟级(需人工切换) 大多数生产业务
MGR 不丢数据 + 自动选主 秒级 核心交易、金融级高可用

选型建议:非核心业务用异步复制或半同步复制;核心业务用MGR单主模式;已经部署了半同步复制但希望减少人工切换的,可以逐步迁移到MGR。

七、小结

MySQL复制的三层机制解决的是三个不同层面的问题。异步复制提供了基础的复制能力,但存在数据丢失风险;半同步复制的AFTER_SYNC模式解决了主库崩溃时的数据一致性问题;MGR的Paxos协议解决了自动选主和脑裂防护问题;GTID解决了主从切换时的手工位点问题。生产环境的最佳实践是:用GTID做基础,用AFTER_SYNC半同步做数据保障,核心系统升级到MGR。

小耶在手,SQL 不愁

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

相关文章
|
2天前
|
SQL 监控 关系型数据库
InnoDB MVCC机制全解析:版本链构建、Read View判断逻辑与RC/RR差异
InnoDB的并发控制核心就是MVCC——通过Undo Log版本链和Read View实现“读不阻塞写、写不阻塞读”。本文拆解版本链的构建方式、Read View的四个核心字段、RC与RR隔离级别下Read View生成时机的差异、快照读与当前读的底层区别,以及长事务导致undo log膨胀的根因。
|
7天前
|
SQL 测试技术 数据库连接
我用ChatGPT把回归测试从3天压到3小时,提示词全公开
本文分享如何用ChatGPT优化电商后台回归测试:通过提示词引导,实现用例梳理、自动化脚本生成与日志分析三步提效,将3天人工测试压缩至3小时。强调其辅助定位而非替代人力,聚焦释放工程师精力于高价值工作。
|
7天前
|
缓存 人工智能 测试技术
Codex 子 Agent 配置:config.toml 字段、并行判据与上下文管理
本文详解Codex子Agent配置要点:厘清`config.toml`作用域、`[agents]`字段语义(尤其`max_concurrent_threads_per_session`不含主Agent)、`max_depth=1`的必要性、官方并行判据、轮询开销、主线程模型选择策略、`reasoning.effort`五档含义及上下文管理开关等关键细节,助你规避常见配置陷阱。(239字)
|
2天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
290 0
|
7天前
|
人工智能 自然语言处理 API
阿里云Token Plan全面升级:模型 + Agent 工具,一次配齐千问、Qoder等各类 Agent工具
阿里云Token Plan完成重磅升级,原有价格不变、权益全面扩容,新增Harness Agent全链路开发权益,以Credits统一计量覆盖千问、DeepSeek等数十款主流模型与多模态能力。产品分为个人版与团队版两大序列,个人版三档39元/月起适配独立开发者,团队版按席位订阅提供企业级数据安全与多账号管理能力,搭配夜间五折、满减券等多重优惠,帮助用户低成本搭建全链路AI工作流。
|
7天前
|
弹性计算 监控 Linux
阿里云便宜云服务器汇总:38元、68元、99元、199元配置整理及购买条件详解
总而言之,这四档阿里云便宜云服务器套餐,覆盖从个人学习到小型初创项目的入门算力需求。在选购的时候,不能只看价格,要区分轻量应用服务器和ECS实例差异,重点关注带宽类型、续费规则、账号购买资格,结合业务访问规模、运行服务类型综合选择。利用Linux命令完成环境部署,搭配监控脚本实时观察服务器负载,就可以用极低的成本完成上云,搭建网站、开发调试各类应用。对于预算有限的开发者和小微企业,这几款特惠机型是低成本试水云计算的优质选择,合理规划资源,就可以控制云资源成本,避免不必要的资源浪费。
182 0
|
22天前
|
SQL 存储 关系型数据库
分区裁剪失效、DDL卡死、元数据爆炸:分区表的3个真实代价
很多人觉得分区表是“轻量级分库分表”——数据分开放、查询只扫一个区、过期数据直接DROP分区,听起来很完美。但分区表有严格的适用边界和隐藏代价:分区键选错导致所有查询都扫全部分区、分区数量过多导致DDL巨慢、跨分区查询比普通表还慢……本文从分区表的核心原理出发,拆解4种分区类型、3个真实踩坑场景,以及分区表与分库分表的本质区别,帮你一次性搞清楚到底该不该用。
|
23天前
|
SQL 运维 关系型数据库
2026年分布式数据库有哪些主流选择?先评估这5个维度再决定
分布式数据库选型,99%的文章在列表格比参数——但真正的决策关键不在厂商PPT里,在上线后的真实运维里。本文从网络延迟容忍度、SQL兼容性验证、在线扩容能力、全局索引代价、运维工具链成熟度5个维度出发,给出可落地的评估方法和决策建议,帮助你在选型阶段避开那些“只有上线后才会发现”的坑。
|
1月前
|
存储 架构师 数据库
从DBA到数据架构师:技术债务管理是分水岭
“架构债”在业务快速迭代中被不断放大,最终成为系统稳定性的定时炸弹。本文从数据架构的视角出发,拆解数据库技术债务的四种典型类型,提供识别、评估和偿还的完整方法论,帮助读者从“数据库管理员”升级为“数据架构师”。
|
1月前
|
SQL JSON 数据库
SQL性能调优进阶:从“会看执行计划”到“会诊断整个系统”
一条SQL慢,可能有一百种原因——SQL写法有问题、索引没建对、统计信息过旧、参数没调好、磁盘I/O满了、内存不够、网络抖动……很多DBA的做法是“先查SQL”,但真正的问题往往不在SQL本身。本文从“分层诊断”的思路出发,建立一套从SQL层→数据库层→操作系统层的逐层排查方法论,帮助读者在面对性能问题时不再“眉毛胡子一把抓”。