MySQL 主從複製採用三線程協作模型:
核心矛盾:主庫並發執行 (TPS 高),產生 Binlog 順序寫;從庫單線程重放,DML/DDL 隨機 I/O + 鎖等待,吞吐遠低於主庫。當主庫併發寫入產生的事件速率超過從庫 SQL 線程處理速率時,**延遲不可避免**。
sync_binlog=1, innodb_flush_log_at_trx_commit=1, Binlog 同步寫入拖慢重放。[mysqld]
# 從庫不需極致持久性,犧牲微小安全性換取高吞吐
sync_binlog = 0 # 不強制每次提交 fsync Binlog
innodb_flush_log_at_trx_commit = 2 # 事務提交僅寫 OS Cache,每秒刷盤
# 甚至可關閉從庫 Binlog (若無級聯從庫)
# log_bin = OFF
# 使用更高規格硬體:SSD/NVMe、更大內存、更多 CPU 核心
原理:減少 fsync 系統調用,將隨機 I/O 轉為順序批量刷盤,大幅降低 SQL 線程延遲。
pt-online-schema-change 或 gh-ost 避免鎖表阻塞複製。MySQL 5.6.3 引入 **Database 級並行複製** (slave_parallel_workers > 0):
slave_parallel_workers = 4 (建議 ≤ CPU 核心數),slave_parallel_type = LOGICAL_CLOCK (5.7+ 基於組提交並行度,效果更好)。基於**表級**並行切分,粒度更細,但需維護額外組件,運維成本高,非強運維團隊慎用。
部署一個故意延遲 1-24 小時的從庫 (MASTER_DELAY),防誤操作 (Drop Table/Delete 無 Where) 的最終防線,非解決延遲本身,但屬高可用體系一環。
| 參數 | 推薦值(從庫) | 解釋 |
|---|---|---|
| sync_binlog | 0 或 100+ | 0=交給 OS 刷盤,性能最好;>0 為每 N 次提交 fsync 一次 |
| innodb_flush_log_at_trx_commit | 2 | 1=最安全(每提交刷盤);2=寫 OS Cache(每秒刷盤),崩潰丟 1 秒;0=最快但掛掉丟事務 |
| slave_parallel_workers | 4-16 | 並行 SQL 線程數,0 關閉 |
| slave_parallel_type | LOGICAL_CLOCK | 5.7+ 基於組提交並行度,優於 DATABASE |
| master_info_repository | TABLE | 元數據存表而非檔案,支援事務性恢復 |
| relay_log_info_repository | TABLE | 同左 |
| relay_log_recovery | ON | 啟動自動修復損壞 Relay Log |
核心指標:Seconds_Behind_Master (SHOW SLAVE STATUS)、**Relay Log 積壓大小**、SQL 線程狀態、長事務監控。建議接入 Prometheus + Grafana + Alertmanager,延遲 > 30s 告警,> 300s 鉤子觸發自動熔斷讀流量。
主從延遲本質是**生產速率 > 消費速率**的佇列積壓問題。治理遵循「先優化消費端(從庫)、再優化生產端(主庫/業務)、最後上並行複製」的漸進路徑。5.7/8.0 並行複製機制成熟,配合 LOGICAL_CLOCK 模式,多數業務延遲可控制在毫秒級。**切記:從庫配置應針對「重放」優化,而非「持久」。**