MySQL Replication 採用非同步複寫架構,透過三條線程協作實現資料同步。理解其運作流程、延遲來源、資料遺失風險,是架構高可用、排查主從延遲的基礎。
| 線程 | 位置 | 職責 |
|---|---|---|
| Binlog Dump Thread (IO Thread) | Master | 讀取本地 binlog,發送給 Slave 的 IO Thread |
| Slave IO Thread | Slave | 連接 Master、請求 binlog、寫入本地 Relay Log、更新 master.info 記錄位點 |
| Slave SQL Thread | Slave | 讀取 Relay Log、解析為 SQL、在 Slave 重放執行、更新 relay-log.info |
COM_BINLOG_DUMP,攜帶 MASTER_LOG_FILE、MASTER_LOG_POS (來自 master.info),請求後續事件。mysql-relay-bin.xxxxxx),並更新 master.info (記錄下次請求位點)。relay-log.info。結果:Master 執行什麼 SQL,Slave 就重放什麼 SQL,最終資料一致 (最終一致性)。
早期版本 Slave 單線程同時負責「拉取 binlog → 解析 → 重放」,存在兩大痛點:
Yahoo! 工程師 Jeremy Zawodny 提出雙線程改進,MySQL 後續版本採納:
即使雙線程,本質仍為非同步:
Seconds_Behind_Master) 取決於:網路延遲、SQL Thread 重放速度、大交易、DDL 鎖表、無索引更新掃表等。| 檔案 | 內容 | 更新時機 |
|---|---|---|
master.info | Master 主機、埠、用戶、密碼、當前 binlog 檔名/位點 | IO Thread 每寫入一批事件後 |
relay-log.info | 當前 Relay Log 檔名/位點、對應 Master binlog 位點 | SQL Thread 每執行一批事件後 |
relay-log.index | 所有 Relay Log 檔案列表 | IO Thread 建立新 Relay Log 時 |
MySQL 5.6+ 可設定master_info_repository=TABLE、relay_log_info_repository=TABLE存入mysql.slave_master_info、mysql.slave_relay_log_info表,支援交易性更新,崩潰更安全。
UUID:NUMBER 全域唯一標識交易,簡化故障轉移、跳過錯誤交易、多源複寫。掌握三線程協作流程、非同步本質、位點持久化機制,是進階學習半同步、GTID、MTS、Group Replication 的基石。生產環境務必監控 Seconds_Behind_Master、Slave_IO_Running/Slave_SQL_Running、Relay Log 空間佔用。