標籤:mysql 複製
mysql複製原理/基於庫的多線程複製原理/基於BLGC的多線程複製原理
單線程主從複製:
從庫向主程式庫要求binlog,並將binlog轉存到自己的relaylog中,從庫重做binlog裡面的sql,
主要由以下三個線程完成.
dump thread: 在主庫上,發送binlog
io thread: 在slave上,接收,轉存,請求binlog
sql thread :在slave 上,重做binlog
基於庫的多線程複製原理:
從庫向主程式庫要求binlog,並將binlog轉存到自己的relaylog中,從庫重做binlog裡面的sql,
主要由以下三個線程完成.
dump thread: 在主庫上,發送binlog
io thread: 在slave上,接收,轉存,請求binlog
sql thread :在slave 上,讀取binlog,並分配binlog給work thread (分配原則,判斷並存執行的事務是否擁有相同的資料庫)
work thread:執行binlog ,可以有多個
多線程複製
mysql5.7 基於BLGC的多線程複製原理,同時處於prepare階段的事務不會有衝突。
在mysql5.7 的binlog中新增了兩個欄位來來標註哪些事務可以並存執行,和binlog的寫入順序
last_committed:事務提交編號,同一組內的事務,編號相同,可以並存執行。
sequence_number:binglog寫入順序,使用者確保master的binlog順序和slave的binlog順序的一致。
多線程複製中的一些問題
1.binlog以組為順序並發重做,如果上一組binlog中有某個sql執行失敗,整組sql是否復原,slave複製是否暫停?
如果一組中的某個sql執行失敗,整組sql都會復原,
這個時候整個slave是否會暫停,有待驗證
2.並行複製中如何保證master上的binlog和slave上binglog的順序一致
在mysql5.7中為了實現並行複製,特地在binlog日誌中增加了兩個欄位,last_committd,sequence_number,
在slave上按組並行重放的時需要等待組中所有sql執行完成,然後在flush階段按照sequence_number排序,並行提交,
這樣就保證了,master上binlog的的寫入順序就和slave上的binlog的寫入順序相同了。
參考資料
http://www.tuicool.com/articles/EvQjEr
mysql5.7並行複製相關簡介:
http://blog.itpub.net/28218939/viewspace-1975822/
http://blog.itpub.net/28218939/viewspace-1975856/
http://www.ttlsa.com/mysql/mysql-5-7-enhanced-multi-thread-salve/
http://dev.mysql.com/doc/refman/5.6/en/replication-implementation-details.html
本文出自 “SQLServer MySQL” 部落格,請務必保留此出處http://dwchaoyue.blog.51cto.com/2826417/1788704
mysql複製原理/基於庫的多線程複製原理/基於BLGC的多線程複製原理