在mysql應用中,最讓人揪心的就是同步延遲問題,原因是多方面的,但帶來的負面影響非常大,甚至都無法解釋。

mysql作爲最流行的關係型數據庫之一,它的強項可能並不是速度,並行複製能力也並不強,所以如果你要重度依賴mysql,那麼必須意識到同步延遲可能是常態。

那麼如何儘量去避免呢?

1:應用解決方案

在開發中,假設延遲是存在的,對於核心業務必須要嚴謹,比如說文章隊列,如果獲取不到從庫文章信息,是不是再一次投遞隊列,或者從主庫查詢,儘量減少延遲帶來的影響,當然設計的複雜度就增加了。

如果你重度依賴緩存,那麼如何避免緩存信息是髒的,這更難解決。

2:減負

mysql無法是增刪改查,要保持數據量可控,我最喜歡在不影響應用的前提下刪除數據,看似很low的解決方案其實很管用。

儘量減少慢查詢,以前同步延遲都是查詢帶來的,但這次卻不是,而是隊列大量更新和插入帶來的,比如說每天全量推送用戶,長時間高併發寫,同步不可避免,所以一定要控制併發寫入和更新量。

3:選擇合適的解決方案

mysql儘量作爲存儲使用,因爲大規模的查詢和更新並不是它的優勢,所以非核心業務,可以考慮redis和mongodb,尤其是隊列解決方案,不建議使用mysql,或者說有多套解決方案。

4:拆分

受限於mysql本身機制,可以通過升級mysql版本,提升並行複製能力。或者根據不同的場景,使用多個庫,甚至多個mysql實例,避免核心服務受影響。

一方面服務能夠解耦,另外也方便擴展。這也是分而治之的解決思路之一。

5:負載均衡

有的時候發現某些從庫不延遲,就一臺延遲,可以通過策略,摘除這臺從庫,但必須意識到,這只是臨時解決方案,出現大量的延遲,說明問題可能已經比較嚴重了。

目前規模還小,如果大了呢?那時候可能是災難性的。

相關文章