首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 5.7 半同步複制增強:異步化 ACK 與事務提交等待點優化

     編輯:MySQL 綜合教學

5.5/5.6 半同步的效能瓶頸

傳統半同步流程:

  1. 主庫 Dump 線程發送 Binlog Event 給 Slave
  2. Dump 線程**同步等待** Slave ACK
  3. 收到 ACK 才發送下一個 Event

核心問題:Dump 線程串行化「發送」與「等待 ACK」,高並發下成為 TPS 瓶頸。
5.5 半同步流程圖

5.7 兩大核心優化

優化一:ACK Receiver 線程分離,實現發送與接收異步化

5.7.4+ 引入專門的 ACK Collector 線程:

  • Dump 線程專職發送 Binlog,**不再等待 ACK**
  • ACK Collector 線程專職監聽 Slave 反饋
  • Group Commit 批次提交時,多個事務可流水線並行

5.7 半同步流程圖

效能提升:高並發場景下 TPS 顯著提升,主庫不再因網絡 RTT 阻塞發送管道。

優化二:rpl_semi_sync_master_wait_point 控制事務提交等待時機

新參數 rpl_semi_sync_master_wait_point 兩個可選值:

值行為資料安全性效能
AFTER_SYNC (默認)寫 Binlog → 同步磁盤 → 發送 Slave → 等待 ACK → **主庫提交事務** → 返回客戶端最高:主庫 Crash 時,所有已提交事務必在 Slave Relay Log稍低(多一次 fsync 等待)
AFTER_COMMIT寫 Binlog → 發送 Slave → **主庫提交事務** → 等待 ACK → 返回客戶端較低:主庫 Crash 後切換至 Slave,可能丟失「已提交主庫但未應用 Slave」的事務較高(提交不阻塞於 ACK)

選型建議

  • 金融/核心交易:堅持 AFTER_SYNC,資料零容忍丟失
  • 高並發非核心業務:可評估 AFTER_COMMIT 換取吞吐,需業務接受「極低概率主從切換後數據不一致」
  • 監控指標:Rpl_semi_sync_master_wait_sessions、Rpl_semi_sync_master_yes_tx/no_tx

其他 5.7 增強(簡述)

  • Server 層預判 Slave 是否要求半同步,減少 Plugin 鎖衝突
  • 解除 Binlog Dump 線程與 LOCK_log 衝突
  • 修復多個半同步相關 Bug(如超時降級邏輯、ACK 處理競態)

升級檢查清單

  1. 確認 rpl_semi_sync_master_wait_point=AFTER_SYNC(默認)符合業務 SLA
  2. 驗證 ACK Collector 線程啟動:SHOW PROCESSLIST 可見 Binlog Dump 與 Semi-sync ACK receiver
  3. 壓測對比 5.6 vs 5.7 半同步 TPS,量化收益
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved