天天看點

mysql 主從備份原理

mysql 主從備份原理

1.1 用途及條件

mysql主從複制用途

  • 實時災備,用于故障切換
  • 讀寫分離,提供查詢服務
  • 備份,避免影響業務

主從部署必要條件:

  • 主庫開啟binlog日志(設定log-bin參數)
  • 主從server-id不同
  • 從庫伺服器能連通主庫

2.1 主從原理

mysql 主從備份原理
  • 在備庫 B 上通過 change master 指令,設定主庫 A 的 IP、端口、使用者名、密碼,以及要從哪個位置開始請求 binlog,這個位置包含檔案名和日志偏移量,主庫驗證從庫,交給主庫IO線程負責資料傳輸;
  • 在備庫 B 上執行 start slave 指令,這時候備庫會啟動兩個線程,就是圖中的 io_thread 和 sql_thread。其中 io_thread 負責與主庫建立連接配接,主庫 A 校驗完使用者名、密碼後,開始按照備庫 B master.info裡傳過來的位置,從本地讀取 binlog,将binlog檔案資訊,偏移量和binlog檔案名等發給 B
  • 從庫接收到資訊後,将binlog資訊儲存到relay-bin中,同時更新master.info的偏移量和binlog檔案名
  • 從庫的SQL線程不斷的讀取relay-bin的資訊,同時将讀到的偏移量和檔案名寫道relay-log.info檔案,binlog資訊寫進自己的資料庫,一次同步操作完成。
  • 完成上次同步後,從庫IO線程不斷的向主庫IO線程要binlog資訊
  • 從庫如果也要做主庫,也要打開log_bin 和log-slave-update參數

3.1 主從切換

mysql 主從備份原理

在狀态 1 中,用戶端的讀寫都直接通路節點 A,而節點 B 是 A 的備庫,隻是将 A 的更新都同步過來,到本地執行。這樣可以保持節點 B 和 A 的資料是相同的。當需要切換的時候,就切成狀态 2。這時候用戶端讀寫通路的都是節點 B,而節點 A 是 B 的備庫。

在狀态 1 中,雖然節點 B 沒有被直接通路,但是我依然建議你把節點 B(也就是備庫)設定成隻讀(readonly)模式。這樣做,有以下幾個考慮:

  • 有時候一些營運類的查詢語句會被放到備庫上去查,設定為隻讀可以防止誤操作;
  • 防止切換邏輯有 bug,比如切換過程中出現雙寫,造成主備不一緻;
  • 可以用 readonly 狀态,來判斷節點的角色。

有同學想,我把從庫設定成隻讀了,還怎麼跟主庫保持同步更新呢?這個問題,你不用擔心。因為 readonly 設定對超級 (super) 權限使用者是無效的,而用于同步更新的線程,就擁有超級權限。

4.1 主從延遲的原因

4.1.1 主從主機的性能不一樣

更新請求對 IOPS 的壓力,在主庫和從庫上是無差别的,從的機器性能比主的機器差時,當從庫主機上的多個從庫都在争搶資源的時候,就可能會導緻主從延遲

4.1.2 從的主機讀壓力較大

我們作了主從讀寫分離,開發寫的代碼執行大量讀的查詢時,對從壓力較大,導緻從的cpu或者記憶體占用很高,導緻主從延遲,可以一主多從來解決,但是不宜過多,一般3-5個從,過多的從也會導緻主從延遲同步

4.1.3 網絡原因

主和從的機器不在同一台機房,網絡傳輸資料較慢導緻的主從延遲

4.1.4 大事務

主庫上必須等事務執行完成才會寫入 binlog,再傳給備庫。是以,如果一個主庫上的語句執行 10 分鐘,那這個事務很可能就會導緻從庫延遲 10 分鐘