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

MySQL 主從複制架構深度解析:原理、部署、運維與故障切換全攻略

     編輯:MySQL 綜合教學

MySQL 複制核心原理

MySQL 3.23.15+ 引入複制功能。核心流程:

  1. Master:事務提交前將變更寫入 Binary Log(Binlog)
  2. Slave I/O 線程:連接 Master,請求指定位置後的 Binlog 事件
  3. Master Binlog Dump 線程:讀取 Binlog 發送給 Slave
  4. Slave I/O 線程:將接收事件順序寫入本地 Relay Log,記錄 Master 位置到 master.info
  5. Slave SQL 線程:讀取 Relay Log,解析並重放事件,更新數據

雙線程設計(I/O + SQL)解耦網絡傳輸與重放執行,大幅降低延遲。

Windows 環境圖文部署實錄

環境

角色IP端口OSMySQL
Master192.168.1.1003306Win75.5.20
Slave192.168.1.1023306Win85.5.20

關鍵步驟

  1. Master my.ini 啟用 log-bin、server-id=1、binlog-do-db=test
  2. 創建複制賬號:GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '123';
  3. mysqldump 導出 Master 數據,source 導入 Slave
  4. Slave my.ini 設置 server-id=2(不要在 [mysql] 區塊配置 binlog)
  5. CHANGE MASTER TO ... 指定 MASTER_LOG_FILE/MASTER_LOG_POS
  6. START SLAVE,驗證 Slave_IO_Running=Yes, Slave_SQL_Running=Yes

踩坑記錄

  • binlog 文件名中文全形點號:binlog。000004 → 應為 binlog.000004
  • Slave 配置區塊錯誤:log_bin 寫在 [mysql] 而非 [mysqld]
  • 防火牆/賬號 host:repl@'%' 允許遠程,flush privileges

關鍵啟動參數

參數作用建議
log-slave-updatesSlave 更新寫入自身 Binlog級聯複制/雙主必開
master-connect-retry=60I/O 線程重連間隔(秒)默認 60 通常足夠
read-only=1限制非超級用戶寫入 Slave生產 Slave 強烈建議開啟
slave-skip-errors=1007,1051,1062自動跳過指定錯誤碼僅限查詢分流 Slave,備份庫禁用

監控複制延遲


SHOW PROCESSLIST\G
-- 關注 Slave SQL 線程 Time 值
Id: 6  Time: 2769  State: Slave has read all relay log...
-- 表示 Slave 執行進度落後 Master 約 2769 秒

結合 Seconds_Behind_Master(SHOW SLAVE STATUS)綜合判斷。

日常運維檢查清單

  1. SHOW SLAVE STATUS\G 確認雙線程 Yes
  2. 檢查 Last_IO_Error、Last_SQL_Error
  3. 監控 Seconds_Behind_Master 趨勢
  4. 定期驗證主從數據一致性(pt-table-checksum)

常見故障與處理

故障原因處理
log event entry exceeded max_allowed_packet大 Blob/長文本超過網絡傳輸限制主從同步增大 max_allowed_packet=16M
多主 auto_increment 衝突多寫入節點產生相同自增值設置 auto_increment_increment/auto_increment_offset 錯開
Slave_IO_Running: No, Last_IO_Error 2013網絡中斷/防火牆/賬號權限檢查連通性、GRANT ... @'%'、防火牆 3306
主從數據不一致直接在 Slave 寫入、跳過錯誤、Binlog 格式問題pt-table-sync 修復、重做 Slave

主從切換(故障轉移)標準流程


# 1. 確保 Slave 已應用所有 Relay Log
STOP SLAVE IO_THREAD;
SHOW PROCESSLIST;  -- 等待 State: "Slave has read all relay log"

# 2. 停止 Slave,提升為 Master
STOP SLAVE;
RESET MASTER;  -- 需開啟 log_bin,否則報錯

# 3. 新 Master 創建複制賬號
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '123';
SHOW MASTER STATUS;  -- 記錄 File/Position

# 4. 原 Master 配置為新 Slave
CHANGE MASTER TO
  MASTER_HOST='新Master IP',
  MASTER_USER='repl',
  MASTER_PASSWORD='123',
  MASTER_LOG_FILE='binlog.000005',
  MASTER_LOG_POS=107;
START SLAVE;

# 5. 驗證雙向同步
-- 新 Master 建表插數據
-- 原 Master (現 Slave) 查詢驗證

server_id 衝突快速修復


SHOW VARIABLES LIKE 'server_id';
SET GLOBAL server_id = 新唯一值;
-- 重啟後生效,或動態生效視版本而定

生產架構建議

  • 一主多從:讀寫分離,Master 僅寫,Slave 分擔讀壓力
  • 避免雙主/多主:衝突檢測複雜、維護成本高、不可預期風險
  • GTID 模式 (5.6+):簡化故障切換、自動定位位置
  • 半同步複制:rpl_semi_sync_master=ON 關鍵業務零數據丟失
  • 監控體系:Prometheus + Grafana + Alertmanager 全鏈路監控
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved