MySQL 復制是實現讀寫分離、災備、高可用的基石。本文聚焦 無停機搭建從庫、同步延遲量化、雙向復制陷阱、性能擴展模型、故障切換腳本化 五大高頻實戰場景,提供可落地的操作指南。
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS; -- 記錄 File, Position
# 另開終端備份數據目錄
tar zcf /tmp/mysql_snapshot.tar.gz /var/lib/mysql
UNLOCK TABLES;
server-id,啟動 MySQLCHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_pass',
MASTER_LOG_FILE='mysql-bin.000123',
MASTER_LOG_POS=456;
START SLAVE;
# Master
mysqldump --all-databases --master-data=2 --single-transaction > full.sql
# Slave
mysql < full.sql
# 導入後自動包含 CHANGE MASTER TO 信息,直接 START SLAVE
--master-data=2將 CHANGE MASTER 註釋在文件中;=1則為生效語句。
自動獲取快照+位點,但會長時間持有全局讀鎖,大表慎用。未來版本將增強此功能。
--master-connect-retry=60 控制重試間隔(默認 60 秒)SHOW SLAVE STATUS\G 中 Seconds_Behind_MasterSHOW PROCESSLIST 中 SQL 線程 Time 列 = 當前時間 - 最後執行事件時間戳UPDATE heartbeat SET ts=NOW(),Slave 查詢對比若 Slave 斷開 1 小時重連,Time 會顯示 ~3600,正在重放 1 小時前的事件。
# 1. Master 封寫並記錄位點
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS; -- 記錄 File, Pos
# 2. Slave 等待追平
SELECT MASTER_POS_WAIT('mysql-bin.000123', 456);
-- 阻塞直到 Slave 執行到該位點
# 3. Master 解鎖恢復寫入
UNLOCK TABLES;
適用:主從切換、備份前凍結、跨庫一致性檢查。
auto_increment_offset/increment 錯開 IDSeconds_Behind_Master 雙向均接近 0假設:讀佔 90%、寫佔 10%;單節點 max_reads = 1200 - 2×max_writes
N 個 Slave 時最大寫入量:
writes = 1200 / (2 + 9/(N+1))
N=0 (單主) → 109 writes/s
N=1 → 184 writes/s (+69%)
N=8 → 400 writes/s (+267%)
N=17 → 480 writes/s (+340%)
N→∞ → 600 writes/s (+450% 理論上限)
實際受限於網絡帶寬、Binlog 傳輸延遲、Slave 重放並行度(MySQL 5.6+ 支持多線程 Slave)。
--log-bin--skip-innodb --skip-bdb --low-priority-updates --delay-key-write=ALL 以 MyISAM 高速重放safe_writer_connect() / safe_reader_connect() 封裝路由邏輯# 1. 確認所有 Slave 追平 Relay Log
STOP SLAVE IO_THREAD;
SHOW PROCESSLIST; -- 等待 "Has read all relay log"
# 2. 選定新 Master (如 S1)
STOP SLAVE;
RESET MASTER; -- 清空舊 Binlog,重置位點
# 3. 其他 Slave (S2, S3) 重新指向新 Master
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='S1', MASTER_USER=..., MASTER_PASSWORD=...;
START SLAVE;
# 4. 應用層切換寫入地址至 S1
# 5. 故障 Master (M) 恢復後,作為 Slave 掛載回集群
CHANGE MASTER TO MASTER_HOST='S1' ...; START SLAVE;
--log-bin 不啟用 --log-slave-updates → Binlog 為空,提升後無衝突tail -f /var/log/mysql/error.logSHOW MASTER STATUS → Position > 0 且啟用 log-bin, server-idSHOW SLAVE STATUS → Slave_IO_Running=Yes, Slave_SQL_Running=YesSHOW PROCESSLIST → Connecting to master 檢查權限/網絡/DNSSTART SLAVESET GLOBAL SQL_SLAVE_SKIP_COUNTER=1/2; START SLAVE;(AUTO_INCREMENT 需跳 2)SHOW MASTER/SLAVE STATUS 輸出mysqlbinlog -j /path/to/binlog | head 定位問題語句MySQL 復制核心在於 位點精準、延遲可觀測、切換可腳本化、風險可預判。生產環境建議:單向復制 + 多 Slave 讀寫分離 + MHA/Orchestrator 自動故障轉移 + 定期備份驗證,避開雙主陷阱,構建高可用數據層。