MySQL 主從同步中,Slave 延遲是許多 DBA 面臨的棘手問題。其核心成因在於:Master 採用 InnoDB 並發提交事務,而 Slave 傳統上只有單一 SQL Thread 套用 Binlog,難以在高併發場景跟上 Master 步伐。此外,MySQL 複製本質上是異步的,即便是半同步複制也僅保證事務傳送到 Slave,不等待提交確認,延遲在所難免。若 Slave 硬體配置遠低於 Master,甚至跑多實例,延遲問題更會雪上加霜。
1. 採用 MariaDB 實現真正並行複制
MariaDB 的 Parallel Replication 能在表級實現並發套用,效果遠優於 Oracle MySQL 5.6 的庫級並行。實測中,MariaDB Slave 几乎總能即時追上 Master。若不願遷移版本,可期待 MySQL 5.7 官方並行複制成熟。
2. 強制所有表顯式指定主鍵
Row 模式下無主鍵會導致全表掃描,大表極易拖垮整個 Slave,甚至引發 Hang 住。請參考案例「MySQL 主鍵缺失導致備庫 Hang」。
3. 應用層減壓:合併讀寫、引入緩存與隊列
前端透過記憶體 Cache 或本地寫入隊列,將多次讀寫合併為一次,甚至消除部分寫請求,從源頭降低資料庫壓力。
4. 實施分庫分表策略
將壓力分散到多個實例或表,避免單庫單表成為複制瓶頸。
更多優化技巧歡迎大家補充交流!