1 主從一致性增強支持在事務commit前等待ACKhtml
新版本的semi sync 增長了rpl_semi_sync_master_wait_point參數 來控制半同步模式下 主庫在返回給會話事務成功以前提交事務的方式。數據庫
該參數有兩個值:安全
AFTER_COMMIT(5.6默認值)服務器
master將每一個事務寫入binlog ,傳遞到slave 刷新到磁盤(relay log),同時主庫提交事務。master等待slave 反饋收到relay log,只有收到ACK後master纔將commit OK結果反饋給客戶端。微信
AFTER_SYNC(5.7默認值,但5.6中無此模式)架構
master 將每一個事務寫入binlog , 傳遞到slave 刷新到磁盤(relay log)。master等待slave 反饋接收到relay log的ack以後,再提交事務而且返回commit OK結果給客戶端。 即便主庫crash,全部在主庫上已經提交的事務都能保證已經同步到slave的relay log中。併發
所以5.7引入了after_sync模式,帶來的主要收益是解決after_commit致使的master crash主從間數據不一致問題,所以在引入after_sync模式後,全部提交的數據已經都被複制,故障切換時數據一致性將獲得提高。框架
2 性能提高支持發送binlog和接受ack的異步化異步
舊版本的semi sync 受限於dump thread ,緣由是dump thread 承擔了兩份不一樣且又十分頻繁的任務:傳送binlog 給slave ,還須要等待slave反饋信息,並且這兩個任務是串行的,dump thread 必須等待 slave 返回以後纔會傳送下一個 events 事務。dump thread 已然成爲整個半同步提升性能的瓶頸。在高併發業務場景下,這樣的機制會影響數據庫總體的TPS .
ide
圖:Without ACK receiving thread
爲了解決上述問題,在5.7版本的semi sync 框架中,獨立出一個 ack collector thread ,專門用於接收slave 的反饋信息。這樣master 上有兩個線程獨立工做,能夠同時發送binlog 到slave ,和接收slave的反饋。
圖:With ACK receiving thread
3 性能提高控制主庫接收slave 寫事務成功反饋數量
MySQL 5.7新增了rpl_semi_sync_master_wait_slave_count參數,能夠用來控制主庫接受多少個slave寫事務成功反饋,給高可用架構切換提供了靈活性。
如圖所示,當count值爲2時,master需等待兩個slave的ack
4 性能提高
Binlog 互斥鎖改進
舊版本半同步複製在主提交binlog的寫會話和dump thread讀binlog的操做都會對binlog添加互斥鎖,致使binlog文件的讀寫是串行化的,存在併發度的問題。
MySQL 5.7對binlog lock進行了如下兩方面優化
1.移除了dump thread對binlog的互斥鎖
2.加入了安全邊際保證binlog的讀安全
5 性能提高組提交
5.7引入了新的變量slave-parallel-type,其能夠配置的值有:
DATABASE (5.7以前默認值),基於庫的並行複製方式;LOGICAL_CLOCK (5.7新增值),基於組提交的並行複製方式;
MySQL 5.6版本也支持所謂的並行複製,可是其並行只是基於DATABASE的,也就是基於庫的。若是用戶的MySQL數據庫實例中存在多個DATABASE ,對於從機複製的速度的確能夠有比較大的幫助,若是用戶實例僅有一個庫,那麼就沒法實現並行回放,甚至性能會比原來的單線程更差。
MySQL5.7中增長了一種新的並行模式:爲同時進入COMMIT階段的事務分配相同的序列號,這些擁有相同序列號的事務在備庫是能夠併發執行的。
MySQL 5.7真正實現的並行複製,這其中最爲主要的緣由就是slave服務器的回放與主機是一致的即master服務器上是怎麼並行執行的slave上就怎樣進行並行回放。再也不有庫的並行複製限制,對於二進制日誌格式也無特殊的要求(基於庫的並行複製也沒有要求)。
所以下面的序列中能夠併發的序列爲(其中前面一個數字爲last_committed ,後面一個數字爲sequence_number ):
trx1 1…..2
trx2 1………….3
trx3 1…………………….4
trx4 2……………………….5
trx5 3…………………………..6
trx6 3………………………………7
trx7 6………………………………..8
備庫並行規則:當分發一個事務時,其last_committed 序列號比當前正在執行的事務的最小sequence_number要小時,則容許執行。
所以,
a)trx1執行,last_commit<2的可併發,trx2, trx3可繼續分發執行
b)trx1執行完成後,last_commit < 3的能夠執行, trx4可分發
c)trx2執行完成後,last_commit < 4的能夠執行, trx5, trx6可分發
d)trx三、trx四、trx5完成後,last_commit < 7的能夠執行,trx7可分發
綜上所述:
咱們認爲MySQL 5.7版對Loss-Less半同步複製技術的優化,使得其成熟度和執行效率都獲得了質的提升。咱們建議在使用MySQL 5.7做爲生產環境的部署時,能夠使用半同步技術做爲高可用與讀寫分離方案的數據複製方案。
資料轉載於:http://sanwen.net/a/iogoybo.html