[缺陷分析]半同步下多從庫複製異常

引 言php

 

本文是由愛可生研發團隊出品的「圖解MySQL」系列文章,不按期更新,但篇篇精品。html

愛可生開源社區持續運營維護的小目標:mysql

  • 每週至少推送一篇高質量技術文章
  • 每個月研發團隊發佈開源組件新版
  • 每一年1024開源一款企業級組件
  • 2019年至少25場社區活動

歡迎你們持續關注~git

 

本文分析的缺陷是MySQL bug#89370,其主要的現象是:配置半同步(複製)到多個從庫,部分從庫在一段時間內沒法複製數據,但全部複製狀態均正常。github

 

缺陷的復現算法

MySQL版本:5.7.16,5.7.17,5.7.21sql

 

  1. 配置半同步一個master兩個slave,設置master的
    rpl_semi_sync_master_wait_for_slave_count=2,保持必定數據壓力
  2. 檢查master的
    rpl_semi_sync_master_status狀態爲ON,確保半同步沒有退化爲異步
  3. 設置master的
    rpl_semi_sync_master_wait_for_slave_count=1
  4. 重啓一個slave 「stop slave; start slave」

 

能夠觀察到步驟4中重啓的那個slave長達數分鐘不會有master的複製數據流入,但查看複製狀態均正常。緩存

 

缺陷的原理圖解併發

 

圖一:描述了半同步複製的大體流程異步

 

 

  • 上圖中按序解析了MySQL半同步插件在binlog group commit中扮演的角色:

 

binlog group commit分爲三個階段:

 

  1. Flush Phase(圖中序號2): 將一組事務寫入binlog緩存區,向半同步插件註冊事務(圖中序號2.1),更新binlog文件位置信息(圖中序號2.2)
  2. Sync Phase(圖中序號4): 對binlog作fsync操做,將一組事務一塊兒刷入磁盤
  3. Commit Phase(圖中序號5): 等待半同步完成,在引擎層提交事務

半同步插件:

 

  1. 圖中序號3:在binlog完成位置信息更新後,開始經過複製線程讀取binlog文件,將其中的event發送給slave
  2. 圖中序號5.1:將事務複製完成信息返回master,master根據該信息肯定是否能夠提交事務
  • MySQL從5.5版本後引入了半同步插件,以解決傳統異步複製在master節點宕機時可能出現的數據丟失。
  • 開啓半同步可以保證master接收到的事務,在獲得至少一個slave接收確認以後再返回給客戶端。
  • MySQL 5.6版本以前存在一個著名的bug#13669,在開啓binlog時爲了保證引擎層與binlog的提交順序一致,使得group commit機制失效。從5.6版本後才真正引入了binlog的group commit,在保證引擎層和binlog事務最終一致的狀況下,大幅提升了高併發場景下的處理性能。

 

圖二:描述了MySQL 5.6版本中的ACK接收機制

 

  • 在MySQL 5.6版本的實現裏,master的複製線程同時負責發送事務和接收slave返回的ACK消息,當沒有接收到上一個事務的ACK消息以前,沒法發送下一個事務。如此串行化的機制成爲了半同步的性能瓶頸。

 

圖三:描述了MySQL 5.7版本中的ACK接收機制

 

  • 在MySQL 5.7版本的實現裏,將接收ACK這部分任務從master的複製線程中拆分出來,由半同步插件的ACK接收線程單獨處理,使得事務發送和接收ACK得以並行,極大提升了半同步性能。

 

圖四:描述了本文缺陷的發生緣由

 

  • 本文所要描述的缺陷就出如今ACK接收線程中,ACK線程(圖中序號1)和複製線程(圖中序號2)在搶佔互斥鎖時產生了競爭。
  • master在監聽slave的ACK消息時,無限的while循環使得ACK線程基本時刻佔有互斥鎖。當啓動另外一個slave時,master的新複製線程沒法在短期內搶佔該互斥鎖,致使複製線程沒法啓動成功,形成了slave的slave_io_thread 停滯,沒法複製數據的現象。

 

擴展閱讀

 

精選系列

 

| MySQL分佈式中間件使用指南
DBLE系列公開課第一課 DBLE概述
DBLE系列公開課第二課 DBLE的配置及使用
MyCat的坑如何在分佈式中間件DBLE上改善(內含視頻連接)
| DBLE 快速入門
深度分析 | MyCat與DBLE的對比性能調
開源分佈式中間件 DBLE 快速入門指南
DBLE 自定義拆分算法
DBLE Server.xml 配置解析
DBLE Schema.xml 配置解析
DBLE rule.xml 配置解析
| MySQL深度分析
MGR相同GTID產生不一樣transaction故障分析
DBLE和Mycat跨分片查詢結果不一致案例分析
基於Xtrabackup及可傳輸表空間實現多源數據恢復
[缺陷分析] Table cache 致使 MySQL 崩潰

 

開源分佈式中間件DBLE
社區官網: https://opensource.actionsky.com/
GitHub主頁: https://github.com/actiontech/dble
技術交流羣:669663113

 

開源數據傳輸中間件DTLE
社區官網: https://opensource.actionsky.com/
GitHub主頁: https://github.com/actiontech/dtle
技術交流羣:852990221

 

相關文章
相關標籤/搜索