天天看點

學習mysql資料庫主從同步複制原理

mysql的replication(英文為複制)是一個多mysql資料庫做主從同步的方案,特點是異步複制,廣泛用在各種對mysql有更高性能、更高可靠性要求的場合。與之對應的是另一個同步技術是mysql cluster,但因為mysql cluster配置比較複雜,是以使用者較少。

mysql的replication是一個異步複制的過程(mysql5.1.7以上版本分為異步複制和半同步兩種模式),它是從一個mysql instance(instance英文為執行個體)(我們稱之為master)複制到另一個mysql instance(我們稱之slave)。在master與slave之間實作整個複制過程主要由三個線程來完成,其中兩個線程(sql線程和io線程)在slave端,另外一個線程(io線程)在master端。

要實作mysql的replication,首先必須打開master端的binlog (mysql-bin.xxxxxx)日志功能,否則無法實作mysql的主從複制。因為mysql的整個主從複制過程實際上就是:slave端從master端擷取binlog日志,然後再在自己身上完全順序的執行該日志中所記錄的各種sql操作。

學習mysql資料庫主從同步複制原理

mysql主從複制的基本互動過程,如下:

1、slave端的io線程連接配接上master端,并請求從指定binlog日志檔案的指定pos節點位置(或者從最開始的日志)開始複制之後的日志内容。

2、master端在接收到來自slave端的io線程請求後,通知負責複制程序的io線程,根據slave端io線程的請求資訊,讀取指定binlog日志指定pos節點位置之後的日志資訊,然後傳回給slave端的io線程。該傳回資訊中除了binlog日志所包含的資訊之外,還包括本次傳回的資訊在master端的binlog檔案名以及在該binlog日志中的pos節點位置。

3、slave端的io線程在接收到master端io傳回的資訊後,将接收到的binlog日志内容依次寫入到slave端的relaylog檔案(mysql-relay-bin.xxxxxx)的最末端,并将讀取到的master端的binlog檔案名和pos節點位置記錄到master-info(該檔案存在slave端)檔案中,以便在下一次讀取的時候能夠清楚的告訴master“我需要從哪個binlog檔案的哪個pos節點位置開始,請把此節點以後的日志内容發給我”。

4、slave端的sql線程在檢測到relaylog檔案中新增内容後,會馬上解析該log檔案中的内容。然後還原成在master端真實執行的那些sql語句,并在自身按順豐依次執行這些sql語句。這樣,實際上就是在master端和slave端執行了同樣的sql語句,是以master端和slave端的資料是完全一樣的。

以上mysql主從複制互動過程比較拗口,了解起來也比較麻煩,我簡化了該互動過程。如下:

1、master在執行sql之後,記錄二進制log檔案(bin-log)。

2、slave連接配接master,并從master擷取binlog,存于本地relay-log中,然後從上次記住的位置起執行sql語句,一旦遇到錯誤則停止同步。

從以上mysql的replication原理可以看出:

* 主從間的資料庫不是實時同步,就算網絡連接配接正常,也存在瞬間主從資料不一緻的情況。

* 如果主從的網絡斷開,則從庫會在網絡恢複正常後,批量進行同步。

* 如果對從庫進行修改資料,那麼如果此時從庫正在在執行主庫的bin-log時,則會出現錯誤而停止同步,這個是很危險的操作。是以一般情況下,我們要非常小心的修改從庫上的資料。

* 一個衍生的配置是雙主、互為主從配置,隻要雙方的修改不沖突,則可以工作良好。

* 如果需要多主庫的話,可以用環形配置,這樣任意一個節點的修改都可以同步到所有節點。