上一篇文章介紹了MySQL主從同步的原理和應用,本文總結了MySQL主從延遲的原因和解決辦法。如果主從延遲過大,會影響到業務,應當采用合適的解決方案。
MySQL主從延遲的表現
先insert或update寫入更新操作,再立即select查詢,但是得不到最新的結果。
可通過show slave status命令,結果中的Seconds_Behind_Master列,查看主從延遲的秒數。
MySQL主從延遲的原因
- 讀寫分離時,寫操作走主庫,讀操作走從庫,但是主庫的變更還未同步至從庫
- 網絡傳輸延遲:從庫發起dump請求,主庫推送binlog文件,從庫寫入本地relay log
- 從庫串行執行sql語句:主庫並發的事務提交,但是在從庫上只能串行執行,速度比主庫慢
MySQL主從延遲解決辦法
業務優化
如果業務場景允許,先寫入更新操作,等待一小段時間后再查詢。比如,新增一條記錄,前端故意延遲半秒再調后端接口查詢。
技術優化
- 拆庫+並行復制:MySQL支持庫級別的並行復制,拆庫后每個分庫的數據量變小,主從延遲自然也變小了。
- 慢sql優化除慢sql,也能降低主從延遲
終結方案
以上辦法治標不治本,只能起到緩解主從延遲的作用,徹底根治還需這么做。
-
顯式查主庫:不同的分片中間件做法不一樣,client側分片可在每次查詢前設置查主庫的標記(ThreadLocal變量),proxy側分片開啟事務
優點:實現簡單,缺點:受MySQL QPS限制,QPS極高時不推薦
-
雙寫數據庫和緩存,查緩存:避免MySQL主從延遲
優點:可支撐高並發場景