1什麼會增加主從延遲? 1 網路不好 2 從庫硬體差 3 索引沒做好,從庫執行慢 4 從庫鎖等待,多見於myisam 5 主庫寫頻繁,從庫單線程執行慢 6 使用row複製,或mix使用行複製 2如何優化,減少延遲時間? 1 如何寫頻繁,水平拆分,減少單片寫數量 2 避免複雜DML操作 3幾個因為主從 ...
1什麼會增加主從延遲?
1 網路不好
2 從庫硬體差
3 索引沒做好,從庫執行慢
4 從庫鎖等待,多見於myisam
5 主庫寫頻繁,從庫單線程執行慢
6 使用row複製,或mix使用行複製
2如何優化,減少延遲時間?
1 如何寫頻繁,水平拆分,減少單片寫數量
2 避免複雜DML操作
3幾個因為主從延遲發送異常的場景
1 一個事務內有讀和寫操作
2 修改後緊接著介面訪問
4業務上如何解決主從延遲?
解決這個問題有以下幾個思路:
1. 流程優化避免寫後立即讀取
a 業務流程上:寫完成後介面返回,客戶端再次調用介面獲取數據,在這個過程中同步已經完成;
b 代碼上:寫完成後緩存結果到局部變數,記憶體或緩存中,下次讀取直接走緩存;
2. 避免主從延遲,保證讀寫強一致性
a 如果是一主一從,可以使用資料庫提供的半同步複製,寫完成時會等待從庫同步完成後返回;但是強一致性會降低寫吞吐量
b mysql5.6以後可以使用semi-sync功能,實現強一致性;
c 線上讀寫都是使用主庫,從庫只做線下運營,分析使用;為了緩解資料庫讀寫壓力,在資料庫上架構緩衝層;
3. 強制讀走主庫
4. 配置經驗延遲時間,延遲時間範圍內的查詢走主庫;
a 中間件實現。很多中間件提供這種配置
b 應用層實現。架構一個緩存層,對數據修改後將key保存在cache總,設置生存時間為經驗延遲時間。查詢時首先查詢cache,如果找到key則強制走主庫;
另外,通過show slave status 欄位‘Second_Behind_Master’可以檢測主從延遲時間,在延遲較大時,將讀切到讀庫,如果是使用中間件,可以配置強制讀主庫的延遲:slaveThreshold;這種方式不能保證讀到臟數據,對一致性要求不高時可以使用;