MySQL半同步復制機制詳解:AFTER_SYNC vs AFTER_COMMIT 的優劣與選擇

目錄

      • 深入分析與利弊對比
        • 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…