mysql並行複製

 

先重複下MySQL複製原理,其通過三個線程來完成,在master節點上運行的binlogdump線程以及在slave節點上運行的I/O線程和SQL線程。具體如下:

1. master節點上的binlogdump線程,在slave與其正常連接的情況下,將binlog發送到slave上。

2.slave節點上的I/O線程,通過讀取master節點發送的內容,並將數據複製到本地的relaylog中。

3.slave節點上的SQL線程,讀取relaylog中的日誌,並將其事務在本地執行。

 

Master節點的多個數據庫併發進行事務提交,提交的事務根據LSN號順序的寫入binlog,slave節點通過I/O線程將master上的binlog寫到本地relaylog中,在slave節點只有一個SQL線程來執行relaylog中的日誌,這樣很容易造成slave延遲。

 

在MySQL5.6中,引入了併發複製,這個併發複製是數據庫級別的,這意味着一個SQL線程可以處理一個數據庫的連續事務,而不用等待其它數據庫完成。這個版本的併發複製,可以理解成一個數據庫一個SQL線程。其與併發有關的參數如下:

slave_parallel_workers           // worker 線程個數

slave-checkpoint-group           // 隔多少個事務做一次 checkpoint

slave-checkpoint-period          // 隔多長時間做一次 checkpoint

slave-pending-jobs-size-max      // 分發給worker的、處於等待狀態的event的大小上限

 

MySQL5.6基於DATABASE級別的併發複製可以解決業務表放在不同的database下同步延遲的問題,但是在實際生產中大部分表還是放在同一個庫中的,這種情況即使設置slave_parallel_workers大於0,也無法進行併發。在高併發的情況下,依然會造成主從複製延遲。

 

在MySQL5.7中,引入了新的併發複製方法,基於LOGICAL_CLOCK的併發複製,可以支持在一個database中,併發執行relaylog中的事務。

相同的二進制日誌組在master上提交併行應用到slave節點上,沒有跨數據庫的限制,並且不需要把數據分割到多個數據庫。

要實現這個功能,需要在master節點標記binlog中提交的事務哪些是可以併發執行,雖然的MySQL5.6中已經引入binarylog group commit,但是沒有將可併發的事務標記出來。

可以通過此命令來查看:mysqlbinlog-vvv mysql-bin.000106 | grep -i last_commit

在MySQL5.7中,已經解決了主從複製延遲的問題,具體配置參數如下:

slave-parallel-type=LOGICAL_CLOCK

slave-parallel-workers=16

master_info_repository=TABLE

relay_log_info_repository=TABLE

relay_log_recovery=ON

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章