目录

      • 深入分析与利弊对比
        • 1. `AFTER_COMMIT` (不推荐)
        • 2. `AFTER_SYNC` (强烈推荐,MySQL 8.0 默认)
      • 总结与强烈建议
      • 最佳实践

MySQL 半同步复制主要有两种实现方式,其核心区别在于主库何时回复客户端事务提交成功(即何时认为事务完成),这直接影响了数据安全性和性能。这两种方式由参数 rpl_semi_sync_master_wait_point 控制(在 MySQL 5.7 及以后版本中,推荐使用 AFTER_SYNC):

  1. AFTER_COMMIT (MySQL 5.6 / 5.7 早期默认,现已不推荐)
  2. AFTER_SYNC (MySQL 5.7 及以后推荐配置,MySQL 8.0 默认)

深入分析与利弊对比

特性AFTER_COMMITAFTER_SYNC (推荐)
等待点主库事务提交后等待ACK主库事务写入Binlog后、提交前等待ACK
控制参数rpl_semi_sync_master_wait_point = AFTER_COMMITrpl_semi_sync_master_wait_point = AFTER_SYNC
数据安全性较低 (存在数据丢失风险)较高 (强一致性保障)
数据一致性主库可见数据 != 从库已接收数据主库可见数据 == 从库已接收数据
故障切换风险 (可能导致数据丢失) (保障故障切换数据一致)
性能相对稍好相对稍差 (但差距通常很小)
客户端感知延迟提交后等待ACK,延迟较大写入Binlog后等待ACK,提交在ACK后,延迟稍小
推荐版本MySQL 5.6 / 5.7 早期MySQL 5.7+ (强烈推荐), MySQL 8.0 (默认)
1. AFTER_COMMIT (不推荐)
  • 工作流程:

    1. 客户端发起 COMMIT
    2. 主库在存储引擎内部提交事务,使事务对主库上的其他会话可见。
    3. 主库将事务的 Binlog 发送给从库。
    4. 主库等待至少一个启用了半同步复制的从库返回 ACK 确认(表示该从库已接收写入其自己的 Relay Log)。
    5. 主库收到 ACK 后,回复客户端 COMMIT 成功。
    6. 从库的 SQL 线程异步应用 Relay Log 中的事务。
  • 优点:

    • 相对于 AFTER_SYNC,在等待 ACK 期间主库上的锁(如 InnoDB 行锁)可能释放得更早(因为事务已在主库提交),理论上在高并发、锁竞争激烈的场景下对主库的吞吐量有轻微优势(但实际差距通常很小)。
  • 缺点 (重大风险 - 主要不推荐的原因):

    • 数据丢失风险: 这是最核心的问题。如果在主库提交后(步骤2)、但在收到从库 ACK 之前(步骤4-5之间)主库发生崩溃且无法恢复,那么:
      • 主库上该事务已提交,对客户端来说是成功的。
      • 客户端认为数据已安全存储。
      • 但该事务的 Binlog 可能尚未发送到从库,或者从库接收到了但尚未写入 Relay Log 并返回 ACK
      • 故障切换到新的主库(原从库)时,这个“已提交”的事务会丢失!因为它在新主库上不存在。这违反了用户对“半同步”保障数据安全的预期。
    • 数据不一致窗口: 在主库提交后(客户端可见数据)、到从库确认并应用事务之前,主库和从库的数据是不一致的。其他在主库上读取到该数据的会话,如果查询从库,会看到旧数据。
    • 客户端感知延迟: 客户端需要等待主库提交 网络往返(等待 ACK)的时间,感知到的提交延迟较长。
2. AFTER_SYNC (强烈推荐,MySQL 8.0 默认)
  • 工作流程:

    1. 客户端发起 COMMIT
    2. 主库将事务写入 Binlog 文件(通常是 fsync 到磁盘)。
    3. 主库将事务的 Binlog 发送给从库。
    4. 主库等待至少一个启用了半同步复制的从库返回 ACK 确认(表示该从库已接收写入其自己的 Relay Log)。
    5. 主库收到 ACK 后,在存储引擎内部提交事务,使事务对主库上的其他会话可见。
    6. 主库回复客户端 COMMIT 成功。
    7. 从库的 SQL 线程异步应用 Relay Log 中的事务。
  • 优点:

    • 强数据安全保证 (核心优势): 这是推荐 AFTER_SYNC 的根本原因。只有在确保事务 Binlog 至少已安全传递到一个从库(写入其 Relay Log)后,主库才提交事务并对客户端报告成功。因此:
      • 如果主库在回复客户端成功之前崩溃,事务在主库上未提交(虽然 Binlog 已写入),客户端知道失败。
      • 如果主库在回复客户端成功之后崩溃(即已提交),那么该事务的 Binlog 必定已存在于至少一个从库的 Relay Log 中。故障切换到该从库后,这个事务一定能被新主库应用,不会丢失。这满足了半同步复制防止数据丢失的设计目标。
    • 数据一致性窗口更小: 一旦主库提交(步骤5),数据在主库可见,此时确认该数据已存在于至少一个从库的持久化存储(Relay Log)中。虽然从库可能还未应用,但数据已安全抵达。其他会话在主库读到数据后,即使立即查从库看到旧数据,也知道这是因为复制延迟(异步应用),而不是数据丢失风险。
    • 客户端感知延迟稍低: 客户端等待的时间是 Binlog 写入(通常很快) + 网络往返(等待 ACK)的时间。主库自身的提交操作(步骤5)是在后台完成的,不阻塞客户端响应(虽然客户端已收到成功响应,但其他会话看到数据可能还有极短暂延迟)。
  • 缺点:

    • 锁持有时间稍长: 在等待 ACK 期间(步骤4),事务在主库的存储引擎层尚未提交,因此它持有的锁(如 InnoDB 行锁)不会被释放。这可能在极高并发、锁竞争非常激烈的场景下,对主库的吞吐量造成极其轻微的影响(但现代硬件和网络下,这种影响通常可以忽略不计,远小于数据安全的收益)。这就是所谓的“无损半同步”的代价(保障数据无损)。
    • 对网络延迟更敏感: 等待 ACK 发生在提交之前,网络延迟会直接影响事务提交的整体延迟和吞吐量。需要确保网络质量良好。

总结与强烈建议

  • AFTER_COMMIT 应避免使用: 其设计缺陷(主库提交后等待 ACK)导致在主库崩溃时存在已提交事务丢失的风险,这违背了使用半同步复制提高数据安全性的初衷。MySQL 社区和官方早已认识到此问题。
  • AFTER_SYNC 是当前的最佳实践和标准配置:
    • 真正实现了半同步复制防止数据丢失的核心价值:确保每个对客户端报告成功提交的事务,其 Binlog 必定已持久化在至少一个从库上。
    • 它提供了更强的数据一致性和故障切换安全性
    • 其潜在的性能开销(锁持有时间稍长)在绝大多数生产环境中微乎其微,且是保障数据安全必须付出的合理代价。
    • MySQL 8.0 已默认使用 AFTER_SYNC,这充分说明了其重要性。

最佳实践

  1. 始终配置 rpl_semi_sync_master_wait_point = AFTER_SYNC (MySQL 5.7+) 或直接使用 MySQL 8.0 (默认即为 AFTER_SYNC)。
  2. 确保至少有一个稳定且低延迟的从库启用了半同步复制 (rpl_semi_sync_slave_enabled = ON)。
  3. 合理设置 rpl_semi_sync_master_timeout (等待 ACK 的超时时间)。太短容易退化为异步,太长在主库故障时影响可用性。需要根据网络情况和业务容忍度权衡。
  4. 监控半同步状态:检查 Rpl_semi_sync_master_status (主库是否启用了半同步),Rpl_semi_sync_master_clients (连接的半同步从库数量),Rpl_semi_sync_master_yes_tx / Rpl_semi_sync_master_no_tx (成功/失败通过半同步提交的事务数) 等状态变量。
  5. 理解半同步只能保证 Binlog Event 传输到从库 Relay Log 的持久化,并不保证从库 SQL 线程已应用。要保证读从库的强一致性,需要结合其他机制(如 MySQL Group Replication, InnoDB Cluster, 或外部一致性读方案)。
  6. 对于极致性能要求且可容忍少量数据丢失的场景,纯异步复制仍是选项。对于零数据丢失要求,需要结合 AFTER_SYNC 和更高级别的 HA 方案(如 MGR 或同步复制集群)。

结论:选择半同步复制时,务必使用 AFTER_SYNC 模式。AFTER_COMMIT 模式存在固有的数据丢失风险,不应在新部署中使用。MySQL 8.0 的默认设置已明确指向 AFTER_SYNC,这代表了官方对数据安全最佳实践的确认。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEE实战 | 4种非监督分类算法深度解析,附可直接运行的完整代码

在遥感影像处理领域,非监督分类凭借其无需人工标注样本的优势,成为快速了解地物分布的得力助手。它能自动依据像素光谱特征的相似性完成聚类,这种“无师自通”的特性,让地理空间分析变得更加高效。 今天,我们就来深入…

基于落霞归雁思维框架的软件需求管理实践指南

作者:落霞归雁 日期:2025-08-02 摘要 在 VUCA 时代,需求变更成本已占软件总成本的 40% 以上。本文将“落霞归雁”思维框架(观察现象 → 找规律 → 应用规律 → 实践验证)引入需求工程全生命周期,通过 4 个阶…

企业级AI Agent构建实践:从理论到落地的完整指南

🚀 引言 随着人工智能技术的快速发展,AI应用正在从简单的工具转变为智能伙伴。企业级AI Agent作为这一变革的核心载体,正在重新定义我们与软件系统的交互方式。本文将深入探讨如何构建一个真正意义上的企业级AI Agent系统。 🎯 …

电商项目_性能优化_限流-降级-熔断

针对电商系统,在遇到大流量时,必须要考虑如何保障系统的稳定运行,常用的手段:限流,降级,拒绝服务。 一、限流 限流算法:计数器、滑动窗口、漏铜算法、令牌桶算法。 限流的方案 前端限流接入…

javaweb开发之Servlet笔记

第五章 Servlet 一 Servlet简介 1.1 动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运行之前就写好的资源. 例如:html css js img ,音频文件和视频文件 动态资源 需要在程序运行时通过代码运行生成的资源,在程序运行之前无法确定的数据,运行时…

sqli-labs靶场less26/a

less261.我们打开这一关来看一下,他提示我们空格和其他一些什么都被过滤了2.我们来尝试绕过,按照之前的做法,可以看到闭合方式为单引号,并且过滤了--与#3.我们来尝试绕过一下,发现可以以下的方式绕过,空格用&#xff0…

从Docker衔接到导入黑马商城以及前端登录显示用户或密码错误的相关总结(个人理解,仅供参考)

目录 一、前言 二、从Docker衔接到导入黑马点评 三、谈谈端口映射及我的前端登录显示用户或密码错误 四、总结 一、前言 在学习24黑马SpringCloud课程时,说实话Docker那一块再到导入黑马商城是真的有点折磨,个人感觉老师水平还是很强的,但…

控制建模matlab练习10:滞后补偿器

此练习主要是:关于滞后补偿器。 ①滞后补偿器作用; ②不同滞后补偿器的效果; 一、为什么使用滞后补偿器 滞后补偿器:主要用于改善系统的稳态误差;滞后补偿器设计思路:同时为系统增加一个极点和零点&#xf…

力扣-108.将有序数组转换为二叉搜索树

题目链接 108.将有序数组转换为二叉搜索树 class Solution {public TreeNode Traverse(int[] nums, int begin, int end) {if (end < begin)return null;int mid (begin end) / 2;TreeNode root new TreeNode(nums[mid]);root.left Traverse(nums, begin, mid - 1);ro…

`npm error code CERT_HAS_EXPIRED‘ 问题

问题: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://r2.cnpmjs.org/string_decoder/-/string_decoder-1.3.0.tgz failed, reason: certificate has expired npm error A complete log of this run can be found in: /home…

数据结构---概念、数据与数据之间的关系(逻辑结构、物理结构)、基本功能、数据结构内容、单向链表(概念、对象、应用)

数据结构在数据结构部分&#xff0c;研究数据在内存中如何存储。数据存储的形式有两种&#xff1a;变量和数组&#xff08;数据结构的顺序表&#xff09;。一、什么是数据结构&#xff1f;数据类型被用来组织和存储数据。程序设计 数据结构 算法二、数据与数据之间的关系1、逻…

CMS框架漏洞

一、WordPress姿势一1.下载vulhub靶场cd /vulhub/wordpress/pwnscriptum docker-compose up -d2.我们进入后台&#xff0c;网址拼接/wp-admin/3.我们进入WP的模板写入一句话木马后门并访问其文件即可GetShell4然后我们拼接以下路径/wp-content/themes/twentyfifteen/404.php&am…

控制建模matlab练习07:比例积分控制-③PI控制器的应用

此练习主要是比例积分控制&#xff0c;包括三部分&#xff1a; ①系统建模&#xff1b; ②PI控制器&#xff1b; ③PI控制器的应用&#xff1b; 以下是&#xff0c;第③部分&#xff1a;PI控制器的应用。 一、比例积分控制的应用模型 1、整个系统是如图&#xff0c;这样一个单位…

【MySQL】MySQL 中的数据排序是怎么实现的?

MySQL 数据排序实现机制详解 MySQL 中的数据排序主要通过 ORDER BY 子句实现&#xff0c;其内部实现涉及多个优化技术和算法选择。让我们深入探讨 MySQL 排序的完整实现机制。 一、排序基础&#xff1a;ORDER BY 子句 基本语法&#xff1a; SELECT columns FROM table [WHERE c…

JVM-垃圾回收器与内存分配策略详解

1.如何判断对象已死1.1 对象引用的4种类型&#xff08;强软弱虚&#xff09;1.1.1 强引用特点&#xff1a;最常见的引用类型&#xff0c;只要强引用存在&#xff0c;对象绝不会被回收Object strongObj new Object(); // 强引用注意&#xff1a;集合类型&#xff0c;如果对象不…

新手向:简易Flask/Django个人博客

从零开始搭建个人博客:Flask与Django双版本指南 本文将详细讲解如何使用两种主流Python框架构建功能完整的个人博客系统。我们将从零开始,分别使用轻量级的Flask框架和功能全面的Django框架实现以下核心功能: 用户认证系统: 用户注册/登录/注销功能 密码加密存储 会话管理…

使用 Trea cn 设计 爬虫程序 so esay

使用 Trea cn 设计 爬虫程序 so esay 在现代数据驱动的时代&#xff0c;网络爬虫已成为数据采集的重要工具。传统的爬虫开发往往需要处理复杂的HTTP请求、HTML解析、URL处理等技术细节。而借助 Trea CN 这样的AI辅助开发工具&#xff0c;我们可以更高效地构建功能完善的爬虫程…

MySQL Redo Log

MySQL Redo Log MySQL主从复制&#xff1a;https://blog.csdn.net/a18792721831/article/details/146117935 MySQL Binlog&#xff1a;https://blog.csdn.net/a18792721831/article/details/146606305 MySQL General Log&#xff1a;https://blog.csdn.net/a18792721831/artic…

项目实战1:Rsync + Sersync 实现文件实时同步

项目实战&#xff1a;Rsync Sersync 实现文件实时同步 客户端中数据发生变化&#xff0c;同步到server端&#xff08;备份服务器&#xff09;。 Rsync&#xff1a;负责数据同步&#xff0c;部署在server端。 Sersync&#xff1a;负责监控数据目录变化&#xff0c;并调用rsync进…

Spring Boot 全 YAML 配置 Liquibase 教程

一、项目初始化配置 1.1 创建 Spring Boot 项目 通过 Spring Initializr 生成基础项目&#xff0c;配置如下&#xff1a; ​​Project​​: Maven​​Language​​: Java​​Spring Boot​​: 3.5.3&#xff08;最新稳定版&#xff09;​​Project Metadata​​: Group: com…