MySQL 主從同步的基本原理

Hello_worlds發表於2024-10-11

1、簡介

  • MySQL 主從同步主要透過 二進位制日誌(binlog) 來實現。以下是主從同步的工作流程
1、主庫記錄 binlog:當主庫執行資料更新操作(如 INSERT、UPDATE、DELETE)時,會將這些資料變更寫入 二進位制日誌(binlog) 中。這個日誌檔案記錄了所有影響資料的 SQL 操作。
2、從庫請求 binlog:從庫透過一個 I/O 執行緒 向主庫請求其 binlog 檔案。主庫將這些 binlog 檔案傳送給從庫。
3、從庫接收 binlog 並儲存到 relay log:從庫的 I/O 執行緒將從主庫接收到的 binlog 資料儲存在本地的 中繼日誌(relay log) 中。
4、從庫應用 relay log:從庫的 SQL 執行緒,它會讀取中繼日誌中的內容,並執行相應的 SQL 操作,從而將主庫的資料變更應用到從庫中,保持資料同步。

這種流程的核心是 MySQL binlog 日誌的複製與重放。

2、詳解

  • 主從同步的詳細流程
1、主庫開啟 binlog 日誌:
- 當主庫執行更新操作(如增刪改),這些操作首先會被記錄到 binlog 日誌檔案中。
2、從庫啟動複製程序
- 在從庫上,使用change master to命令配置主庫的連線資訊,並執行start slave啟動從庫的複製程序
- 從庫開啟兩個執行緒:一個I/O執行緒和一個SQL執行緒
	- I/O執行緒負責從主庫上請求並接受binlog檔案,並寫入relay log檔案中
	- SQL執行緒負責解析relay log檔案中的內容為sql語句,並逐條執行sql語句
3、I/O執行緒請求biglog
- 從庫的I/O執行緒會透過網路連線主庫,傳送一個binlog dump請求。這個請求告訴主庫“從某個具體的binglog檔案及位置(如binlog檔名及位置)開始,傳送binlog內容給我”
- 主庫收到請求後,從相應的biglog檔案的指定位置開始,逐條日誌資料傳送給從庫的I/O執行緒
4、從庫I/O執行緒寫入relay log
- 從庫的IO執行緒將主庫傳送過來的binlog資料儲存到本地的中繼日誌(relay log)中
5、SQL執行緒執行中繼日誌
- 從庫的SQL執行緒不斷讀取中繼日誌中的內容,將其當做普通SQL語句執行,應用在從庫資料庫中
- 當SQL執行緒執行完所有的relay log後,從庫的資料狀態就與主庫保持一致

3、主從同步的型別

3.1、非同步複製:

	預設情況下,MySQL使用非同步複製,既主庫在執行事務時不會等待從庫確認收到binlog並應用該日誌。只要主庫完成操作,會立即返回給客戶端。這種模式下,如果主庫發生崩潰,可能會導致部分事務沒有傳輸到從庫

3.2、半同步複製

	MySQL5.5引入了半同步複製。在這種模式下,主庫在提交事務時,至少會等到一個從庫確認收到該事物的binlog日誌後才會返回給客戶端。因此,它比非同步複製提供了更高的資料安全性,但也可能影響主庫的效能

3.3、延遲複製

	從庫可以設定一個固定的延遲時間來應用relay log中的更改,這成為延遲複製。這種的好處是:當發現主庫上的錯誤操作後,可以透過延遲的從庫找回來未被錯誤操作影響的資料

4、MySQL主從複製的優點

4.1、高可用性

	從庫可以用作主庫的備份,在主庫發生故障時,可以迅速將從庫提升為主庫,保證業務的連續性

相關文章