MySQL主從同步初探

最近被問道,關於建設一個MySQL的集羣的方案,當時真的是不太清楚,在底下簡單的瞭解了一下,今天分享一下主庫(Master)和從庫(Slave)之間的數據同步方式。
下圖是MySQL的複製演示圖:
這裏寫圖片描述
上圖可以簡單的總結爲三步:

  1. 主庫將更改記錄保存到二進制日誌文件中
  2. 從庫將主庫上的日誌複製到自己的中繼日誌中
  3. 從庫讀取中繼日誌並將日誌中記錄的事件重放(更新)到自己的數據庫之中。

第一步:將更改記錄保存到日誌文件

在準備提交事務完成數據更新之前,主庫會將數據更新事件記錄到二進制日誌文件中,二進制日誌文件的記錄順序是按事務提交的順序而非SQL語句執行的順序。
只有在日誌記錄完成之後,存儲引擎纔對數據進行更新。

第二步:從庫將主庫上的日誌複製到自己的中繼日誌中

從庫在將主庫中的日誌文件複製到自己的中繼日誌中前,會開啓一個I/O線程,I/O線程用來與主庫之間建立數據連接,同時,主庫中會開啓一個二進制轉儲線程,二進制轉儲線程用來監控主庫中二進制日誌文件中的事件,當二進制日誌文件中有新的事件發生,即當二進制日誌中發生更改後,二進制轉儲線程會將更改的內容發送到從庫,I/O線程接受發送的內容,並保存到中繼日誌中。當主庫中沒有事件發生時,二進制轉儲線程會自動進入休眠狀態,當二進制日誌文件有新的事件發生時,其又會被重新喚醒。

第三步:從庫讀取中繼日誌並將日誌中記錄的事件重放(更新)到自己的數據庫之中

從庫在啓動I/O線程的同時,還會啓動一個SQL線程,SQL線程用於將中繼日誌中的內容更新到數據庫中,從而保證主從庫之間的數據一致性。
同時,我們也可以設置,跳過中繼日誌文件這個過程,當二進制轉儲線程將文件內容發送過來的時候,I/O線程接受到以後,直接交付給SQL線程,這樣做的優點是儘可能的減小了主從庫之間的內容差異,從而對於實時性要求比較高的業務比較有利。但同時,其缺點也是顯而易見的,比如主從庫的業務都特別繁忙,從庫除了要處理來自外部的請求任務之外,還需要及時的將主庫傳送來的事件更新到自己的數據庫中,這樣就使從庫更加的繁忙。對於實時性要求不是那麼高的業務,我們可以在從庫業務繁忙時,將事件暫時的保存到中繼文件中,待到業務少的時候,再一點點的將事件更新的數據庫中。

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