首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 主從複製原理與配置圖文詳解:從 Binlog 到 Relay Log 的完整數據流向

     編輯:MySQL 綜合教學

MySQL 主從複製原理與配置圖文詳解:從 Binlog 到 Relay Log 的完整數據流向

1. 複制概述與核心價值

MySQL 內建複製功能是構建高可用、高效能架構的基石。透過將主庫資料同步至一或多個從庫,解決:

  • 資料分散: 多地部署讀取節點
  • 負載均衡: 讀寫分離分攤壓力
  • 備份離線: 從庫備份不影響主庫效能
  • 高可用/故障轉移: 主庫掛掉可提升從庫為新主

1.1 三種複製類型

類型說明版本
Statement-Based (SBR)記錄 SQL 語句,預設模式,Binlog 體積小,但某些非確定性函數(如 NOW(), UUID())可能導致主從不一致MySQL 3.23+
Row-Based (RBR)記錄行級變更,精確無歧義,支援所有語句,但 Binlog 較大,mysqlbinlog 不易閱讀MySQL 5.0+
Mixed (MBR)預設 SBR,遇無法精確複製自動切換 RBR,折衷方案MySQL 5.1+

可透過 SET SESSION binlog_format = 'ROW|STATEMENT|MIXED'; 動態切換。

1.2 複制三步曲核心流程

  1. 主庫寫 Binlog: 事務提交前,串序寫入二進位日誌事件
  2. 從庫拉 Relay Log: I/O 執行緒連接主庫,啟動 Binlog Dump 執行緒,讀取事件寫入中繼日誌
  3. 從庫重放 SQL: SQL 執行緒讀取 Relay Log 依序重放,更新從庫資料
MySQL 複制流程圖

關鍵點:

  • 主庫為每個從庫連線建立一個 Binlog Dump 執行緒
  • 從庫有兩個執行緒:I/O 執行緒(拉日誌)、SQL 執行緒(重放)
  • 複製在從庫端是**串行化**的——主庫並行事務在從庫按序執行,易成延遲瓶頸
  • Relay Log 通常駐留 OS Cache,開銷極小

2. 實戰配置:一主一從

環境

  • Master: 10.100.0.100 (MySQL 5.0.18, Ubuntu 11.10)
  • Slave: 10.100.0.200

2.1 建立複製帳號(僅主庫執行)

GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.*
TO 'backup'@'10.100.0.200' IDENTIFIED BY '1234';
-- 若密碼演算法衝突:
SET PASSWORD FOR 'backup'@'10.100.0.200' = OLD_PASSWORD('1234');

2.2 同步初始資料(冷備份)

停止主庫,複製資料目錄至從庫,確保**同步期間雙方均無寫入操作**,保證起始資料一致。

2.3 Master 配置 (my.cnf)

[mysqld]
server-id = 1
log-bin = mysql-bin

重啟後驗證:SHOW MASTER STATUS; 記錄 File 與 Position。

SHOW MASTER STATUS

2.4 Slave 配置 (my.cnf)

[mysqld]
server-id = 2
log-bin = mysql-bin              # 可選,但鏈式複製需開啟
relay-log = mysql-relay-bin
log-slave-updates = 1            # 寫入自身 Binlog,支援鏈式
read-only = 1                    # 防止誤寫入(超級用戶除外)

2.5 啟動複製 (CHANGE MASTER TO)

CHANGE MASTER TO
  MASTER_HOST = '10.100.0.100',
  MASTER_USER = 'backup',
  MASTER_PASSWORD = '1234',
  MASTER_LOG_FILE = 'mysql-bin.000001',
  MASTER_LOG_POS = 4;   -- 4 為首個事件位置(非 0)

啟動並驗證:

START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵指標:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
master.info 內容

3. 複制相關核心檔案

檔案用途
mysql-bin.index追蹤現有 Binlog 檔案列表
mysql-relay-bin.index追蹤 Relay Log 檔案列表
master.info記錄主庫連線資訊、當前讀取位點(I/O 執行緒更新)
relay-log.info記錄 SQL 執行緒當前執行位點

警告: 切勿手動刪除 master.info,否則 Slave 重啟後無法連接 Master。

4. 進階拓撲架構

4.1 一主多從

一主多從

讀多寫少場景最適用。建議:不同從庫掛載不同索引/引擎分擔專用查詢;指定一從庫為備用主庫(不對外服務);異地從庫做災備。

4.2 主主雙向複製

主主雙向

雙寫入,**核心問題:寫入衝突**。例:同一行 col=1,A 執行 col=col+1,B 執行 col=col*2,結果 A=3, B=4,不報錯但數據不一致。真正多主需用 MySQL Cluster (NDB) 或應用層協調。

4.3 主主主動-被動 (Active-Passive)

主主主被

一寫一備,避免衝突,提供高可用故障轉移。推薦生產環境採用此模式替代雙寫。

4.4 帶從庫的主主

帶從庫的主主

地理分散多活,無單點故障,讀請求分流至各從庫。

5. 複制過濾規則

可在主庫過濾 Binlog (binlog-do-db, binlog-ignore-db) 或從庫過濾 Relay Log (replicate-do-db, replicate-ignore-db 等)。建議**從庫端過濾**,避免主庫 Binlog 遺漏導致其他從庫異常。

過濾示意

6. 新增 Slave 的三種克隆方式

  1. 冷拷貝: 停主庫複製檔案,停機時間長
  2. 熱拷貝: mysqlhotcopy (僅 MyISAM) 或 xtrabackup (InnoDB 熱備)
  3. mysqldump: FLUSH TABLES WITH READ LOCK; mysqldump --all-databases --lock-all-tables > dump.sql; UNLOCK TABLES; 需記錄 SHOW MASTER STATUS 位點

掌握複製原理與多種拓撲,能根據業務體量與可用性需求,設計出最適合的 MySQL 高可用架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved