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

MySQL 主從複制架構全解析:原理、搭建步驟、線程模型、狀態監控與故障處理

     編輯:MySQL 綜合教學

MySQL 主從複制架構全解析:原理、搭建步驟、線程模型、狀態監控與故障處理

一、核心原理與三大線程

複制流程:

  1. Master 事務提交 → 寫入 Binlog (Events)
  2. Master Binlog Dump 線程 讀取 Binlog 發送給 Slave
  3. Slave IO 線程 接收事件 → 寫入 Relay Log
  4. Slave SQL 線程 讀取 Relay Log → 重放更新 Slave

主從複制架構圖

線程運行位置職責
Binlog DumpMaster讀取 Binlog 發送給 Slave IO 線程
IO ThreadSlave拉取 Master Binlog 寫入 Relay Log
SQL ThreadSlave讀取 Relay Log 重放更新 Slave

二、生產級搭建步驟(MySQL 5.6 / CentOS 6 示例)

環境

  • Master: 192.168.1.6 (server-id=6)
  • Slave: 192.168.1.7 (server-id=7)

1. Master 配置 my.cnf

[mysqld]
server-id=6
log-bin=/var/lib/mysql/mysql-bin
max_binlog_size=100M
sync_binlog=0
binlog-format=MIXED
binlog-ignore-db=test
replicate-ignore-db=test

關鍵說明:server-id 全域唯一;log-bin 啟用 Binlog;binlog-format=MIXED 兼容效能與正確性;忽略 test 库。

2. 建立複制用戶

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.7' IDENTIFIED BY 'repl';

3. 鎖表備份同步基準點

FLUSH TABLES WITH READ LOCK;  -- 僅讀,阻塞寫入
SHOW MASTER STATUS;             -- 記錄 File + Position

SHOW MASTER STATUS

4. 備份資料目錄到 Slave

停 Master 服務 → cp -r /var/lib/mysql/* 到 Slave 同路徑(或用 xtrabackup 熱備份) → 重啟 Master → UNLOCK TABLES;

5. Slave 配置 my.cnf

[mysqld]
server-id=7
log-bin=/var/lib/mysql/mysql-bin
max_binlog_size=100M
sync_binlog=0
binlog-format=MIXED
binlog-ignore-db=test
replicate-ignore-db=test

6. Slave 啟動與配置複制

mysqld_safe --skip-slave-start &   # 不自動啟動複制線程
mysql -uroot -p
CHANGE MASTER TO
  MASTER_HOST='192.168.1.6',
  MASTER_USER='repl',
  MASTER_PASSWORD='repl',
  MASTER_LOG_FILE='mysql-bin.000046',
  MASTER_LOG_POS=211991;
START SLAVE;

7. 驗證

SHOW PROCESSLIST\G;   -- 觀察 IO/SQL 線程狀態
SHOW SLAVE STATUS\G;  -- 核心監控指標

PROCESSLIST 複制線程

三、測試驗證

# Master
CREATE DATABASE repltest;
USE repltest; CREATE TABLE test(id INT); INSERT INTO test VALUES(1),(2);
USE test; CREATE TABLE norepl(id INT); INSERT INTO norepl VALUES(1);  -- test 忽略庫

# Slave
SELECT * FROM repltest.test;   -- 同步成功
SELECT * FROM test.norepl;     -- 異常(忽略庫不同步)

repltest 同步成功

test.norepl 不同步

四、關鍵監控指標 SHOW SLAVE STATUS\G

指標正常值異常含義
Slave_IO_RunningYesNo=IO 線程斷開(網路/認證/Binlog 損壞)
Slave_SQL_RunningYesNo=SQL 線程報錯(鍵衝突/結構差異)
Seconds_Behind_Master0NULL=IO 斷開;>0=延遲秒數
Last_IO_Error空IO 線程最近錯誤詳情
Last_SQL_Error空SQL 線程最近錯誤詳情
Relay_Log_Space適中過大=SQL 線程處理慢於 IO 線程
Exec_Master_Log_Pos接近 Read_Master_Log_Pos差距大=SQL 積壓

五、三大元數據檔案

  • master.info:IO 線程記錄的 Master Binlog 讀取位置
  • relay-log.info:SQL 線程記錄的 Relay Log 執行位置
  • relay-bin.*:Relay Log 檔案,SQL 線程執行完自動清理

六、常見啟動參數

  • --read-only:Slave 僅允許複制線程與 SUPER 用戶寫入
  • --replicate-do-db / --replicate-ignore-db:庫級過濾
  • --replicate-do-table / --replicate-ignore-table:表級過濾
  • --replicate-wild-do-table / --replicate-wild-ignore-table:通配符過濾
  • --skip-slave-start:啟動不自動拉起複制線程
  • --slave-skip-errors=[err_codes|all]:跳過指定錯誤繼續複制(慎用)

七、線程狀態速查

# Master Binlog Dump
Has sent all binlog to slave; waiting for binlog to be updated

# Slave IO Thread
Waiting for master to send event

# Slave SQL Thread
Reading event from the relay log
Has read all relay log; waiting for the slave I/O thread to update it

八、總結與演進

一主一從是基礎架構,易擴展為一主多從。但 Master 單點風險大,生產常演進為 雙主 (Master-Master)、MHA/Orchestrator 自動故障轉移、GTID 複制、半同步複制 等高可用架構。後續將專文介紹雙主複制與自動化運維體系。

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