【MySQL】5.7版本 Semisync Replication 增強
一 前言
-
支援傳送binlog和接受ack的非同步化;
-
支援在事務commit前等待ACK;
-
在server層判斷備庫是否要求半同步以減少Plugin鎖衝突;
- 解除binlog dump執行緒和lock_log的衝突等等。
二 最佳化
1 支援傳送binlog和接受ack的非同步化
透過前面的介紹,我們知道Semisynchronous Replication模式下,app在主庫上提交一個事務/event,MySQL將每個事務寫入binary並且同步到到slave ,master會等待至少一個slave通知:slave 已經接收到傳過來的events並寫入relay log,才返回給回話層 寫入成功,或者直到傳送日誌發生超時,系統自動將為非同步複製模式。
整體流程的邏輯圖
5.5 版本semi sync 設計的缺點:
從原理以及上圖來看,舊版本的semi sync 受限於dump thread ,原因是dump thread 承擔了兩份不同且又十分頻繁的任務:傳送binlog 給slave ,還需要等待slave反饋資訊,而且這兩個任務是序列的,dump thread 必須等待 slave 返回之後才會傳送下一個 events 事務。dump thread 已然成為整個半同步提高效能的瓶頸在高併發業務場景下,這樣的機制會影響資料庫整體的TPS .
為了解決上述問題,在5.7.4版本的semi sync 框架中,獨立出一個 ack collector thread ,專門用於接收slave 的反饋資訊。這樣master 上有兩個程式獨立工作,可以同時傳送binlog 到slave ,和接收slave的反饋。整體流程的邏輯圖
大體的實現思路是:
備庫IO執行緒使用TCP協議和主庫互動,讀寫socket可以同時進行,在開啟主庫semisync時,啟動一個後臺執行緒,使用select監聽備庫連線socket;
dump執行緒不再等待備庫ACK;在ack reciver執行緒等待ACK時,dump執行緒還能繼續傳送下一組group commit的binlog,進而提升TPS.
2 支援在事務commit前等待ACK;
該引數有兩個值:
AFTER_SYNC (預設值):master 將每個事務寫入binlog ,傳遞到slave,並且重新整理到磁碟。master等待slave 反饋接收到事務並重新整理到磁碟。一旦接到slave反饋,master在主庫提交事務並且返回結果給會話。 在AFTER_SYNC模式下,所有的客戶端在同一時刻檢視已經提交的資料。假如發生主庫crash,所有在主庫上已經提交的事務已經同步到slave並記錄到relay log。此時切換到從庫,可以保障最小的資料損失。
AFTER_COMMIT: master 將每個事務寫入binlog ,傳遞到slave 重新整理到磁碟(relay log),然後在主庫提交事務。master在提交事務後等待slave 反饋接收到事務並重新整理到磁碟。一旦接到slave反饋,master將結果反饋給客戶端。
在AFTER_COMMIT模式下,如果slave 沒有應用日誌,此時master crash,系統failover到slave,app將發現資料出現不一致,在master提交而slave 沒有應用。
三 推薦閱讀
[1] 5.7 Semisynchronous Replication
[3] enforced-semi-synchronous-replication
MySQL 5.7 半同步增強,增加 rpl_semi_sync_master_wait_slave_count 引數控制主庫接收多少個slave 寫事務成功反饋 才返回 成功給客戶端 。
[4] faster-semisync-replication
修改原來有dump thread 傳送event和接收slave ack 模式,獨立出 單獨 接收slave 返回 ack的程式,提高半同步模式的tps 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-1674819/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL5.6 -> MySQL5.7 跨版本多源複製(Multi-Source Replication)MySql
- MySQL 5.7組複製(group replication)的要求和限制MySql
- Mysql 5.7 基於組複製(MySQL Group Replication) - 運維小結MySql運維
- MySQL 5.7複製報錯Client requested master to start replication from impossibleMySqlclientAST
- MySQL Group ReplicationMySql
- Build mysql replicationUIMySql
- Mysql Replication(轉)MySql
- mysql 原始碼安裝-5.7-17-19版本MySql原始碼
- MySQL案例-replication"卡死"MySql
- 【MySQL】Semisynchronous Replication 概述MySql
- MySQL Replication淺析MySql
- On MySQL replication, again…MySqlAI
- MySQL 5.7 自增欄位相關引數說明MySql
- MySQL 密碼增強外掛MySql密碼
- MySQL 8 和 MySQL 5.7 在自增計數上的區別MySql
- PHP study 升級預設的MYSQL版本 為5.7PHPMySql
- mysql5.7及以後版本設定密碼MySql密碼
- 【Mysql】MySQL5.7.17- Group Replication搭建MySql
- An Overview of PostgreSQL & MySQL Cross ReplicationViewMySqlROS
- Mysql replication check指令碼MySql指令碼
- MySQL group replication介紹MySql
- MySQL Group Replication小試MySql
- mysql replication之GTIDMySql
- 【MySQL】MySQL 5.7 初探MySql
- C#版本LINQ增強開源庫C#
- openGauss MySQL相容性增強MySql
- MySQL 8 複製效能的增強MySql
- MySQL 5.7 版本的 UTF8 字符集調研MySql
- Mysql5.7 windows免安裝版本 初始化配置MySqlWindows
- 關於Mysql5.7高版本group by新特性報錯MySql
- MySQL基於GTIDs的MySQL ReplicationMySql
- mysql replication /mysql 主從複製原理MySql
- 【MySql】MySQL Replication Fatal Error 1236MySqlError
- Mysql Replication學習記錄MySql
- 理解 MySQL(3):複製(Replication)MySql
- MySQL now supports an interface for semisynchronous replication:MySql
- MySQL Replication ConfigurationMySql
- mysql replication常見錯誤MySql