複寫原理:三線程協作
- Master Binlog Dump Thread:主庫推送 Binlog 事件。
- Slave IO Thread:從庫連主庫、請求 Binlog、寫入 Relay Log。
- Slave SQL Thread:從庫讀 Relay Log、解析執行、更新
relay-log.info。
部署步驟(標準流程)
1. 主庫配置
[mysqld]
log-bin = mysql-bin
binlog_format = mixed
binlog_cache_size = 4M
max_binlog_size = 300M
expire_logs_days = 3
server-id = 1
systemctl restart mysqld
2. 建立複寫帳號
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl_pass';
FLUSH PRIVILEGES;
3. 主庫全量備份(一致性快照)
# 終端 1:鎖表
mysql> FLUSH TABLES WITH READ LOCK;
mysql> RESET MASTER; -- 可選,重置 binlog 從 000001 開始
# 終端 2:備份(不退出終端 1,保持鎖)
mysqldump -uroot -h127.0.0.1 --single-transaction --master-data=2 -R db_name > /backup/db_name.sql
# 終端 1:解鎖
mysql> UNLOCK TABLES;
mysql> SHOW MASTER STATUS\G; -- 記錄 File、Position
4. 從庫配置
[mysqld]
server-id = 2
read_only = 1
binlog_format = mixed
binlog_cache_size = 4M
max_binlog_size = 300M
relay_log = mysql-relay-bin
log_slave_updates = 0 # 非級聯複寫建議關閉
systemctl restart mysqld
5. 從庫導入全量資料
mysql> CREATE DATABASE db_name;
mysql> USE db_name;
mysql> SET NAMES utf8mb4;
mysql> SOURCE /backup/db_name.sql;
6. 建立複寫連線並啟動
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='repl_pass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;
START SLAVE;
7. 驗證
SHOW SLAVE STATUS\G;
-- 關鍵:
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- Seconds_Behind_Master: 0
在線新增從庫(零停機主庫)
- 現有從庫(Slave-A)正常運行。
- 對 Slave-A 執行全量備份(同步點已知)。
- 將備份導入新從庫(Slave-B)。
- Slave-B 執行
CHANGE MASTER TO ... MASTER_LOG_FILE=..., MASTER_LOG_POS=... 指向相同位點。
START SLAVE; 即可追上主庫,主庫完全無感知。
常見坑點提醒
server-id 全集群**唯一**,衝突會導致 IO 線程啟動失敗。
binlog_format 主從**必須一致**(建議 ROW 或 MIXED)。
skip-name-resolve 開啟時,授權用 IP 而非主機名。
- 防火牆放行 3306,雙向通訊(主庫也需連從庫做半同步/心跳時)。
- 定期
SHOW SLAVE STATUS\G 監控,納入告警體系。