天天看點

設計編碼-mysql資料庫主從複制原理-學習筆記

作者:碼哥流年

#頭條創作挑戰賽#

MySQL主從複制是一個基于自帶二進制日志功能的異步過程。就是一台或多台從庫(slave)從一台主庫(master)進行日志的複制,然後從庫再解析日志并應用到自身,最終實作把主庫的資料同步到從庫。

主從複制的作用如下:

  • 解決單點故障
  • 提高性能
  • 實作讀寫分離

主從複制的步驟如下:

第一步,當有增删改語句執行時,主庫在更新資料的同時把資訊寫成二進制日志,将資料修改的内容記錄進入日志中,并通知從庫。

第二步,從庫上運作的一些I/O程序,會監視主庫上的二進制日志,當收到主庫通知并發現修改時,I/O程序向主庫發起請求擷取二進制日志的名稱、目前資料更新的位置和二進制日志檔案位置的副本。

第三步,從庫把擷取到的資訊同步到自身的中繼日志。

第四步,從庫上運作着的SQL thread程序,監視自身的中繼日志,當發現中繼日志發生改變時,立即将日志中改變對應的資料同步到自身的資料庫。

設計編碼-mysql資料庫主從複制原理-學習筆記

(mysql主從複制原理圖)

主從複制的資料同步政策如下:

  • 同步政策,主庫等待所有的從庫都回應後才會送出,這個主從的同步的性能會嚴重的影響。
  • 半同步政策,主庫至少會等待一個從庫回應後送出。
  • 異步政策,主庫不用等待從回應就可以送出。
  • 延遲政策,從庫要落後于主庫指定的時間。

主從同步的三種方式及差異如下:

  • 基于SQL語句的複制。Binlog格式為STATEMENT,每一條修改資料的SQL語句都會記錄到Binlog中,這樣做的優點是并不需要記錄每一條SQL語句和每一行的變化,減少了二進制日志量,節約了I/O。但是會導緻某些情況下主、從庫資料不一緻的場景。
  • 基于行的複制。不記錄每條SQL語句,僅記錄哪條記錄資料被修改了,以及修改後的結果。這樣做的優點是不容易出現主、從庫資料不一緻的場景,但是缺點在于會産生大量日志。
  • 混合模式複制。在混合模式下,邊的複制采用基于SQL語句的複制方式,隻有當該方式無法複制(比如觸發器、存儲過程等等)時,才會使用基于行的方式。

主從複制同步常見方案如下:

  • M-S,一台主庫,加上一台或多台從庫。
設計編碼-mysql資料庫主從複制原理-學習筆記

M-S圖

  • M-S-SS,一台主庫,加上一台中繼庫,再加上多台從庫。注意中繼庫不存儲資料,隻存日志,從庫到中繼庫同步資料,不是從主庫同步,達到減輕主庫I/O壓力。
設計編碼-mysql資料庫主從複制原理-學習筆記

M-S-SS圖

  • M-M,一台主庫,加上一台主庫或多台主庫,互為主庫。
設計編碼-mysql資料庫主從複制原理-學習筆記

M-M圖