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;這種方式不能保證讀到臟數據,對一致性要求不高時可以使用;