一、什麼是快取雪崩
快取雪崩就是指快取由於某些原因(比如 宕機、cache服務掛了或者不響應)整體crash掉了,導致大量請求到達後端資料庫,從而導致資料庫崩潰,整個系統崩潰,發生災難。
下面的就是乙個雪崩的簡單過程:
1、redis集群徹底崩潰
2、快取服務大量對redis的請求hang住,占用資源
3、快取服務大量的請求打到源頭服務去查詢mysql,直接打死mysql
4、源頭服務因為mysql***也崩潰,對源服務的請求也hang住,占用資源
5、快取服務大量的資源全部耗費在訪問redis和源服務無果,最後自己被拖死,無法提供服務
6、nginx無法訪問快取服務,redis和源服務,只能基於本地快取提供服務,但是快取過期後,沒有資料提供
7、**崩潰
導致這種現象可能的原因:
1、例如 「快取併發」,「快取穿透」,「快取顛簸」 等問題,這些問題也可能會被惡意攻擊者所利用。
2、例如 某個時間點內,系統預載入的快取週期性集中失效了。解決方法:可以通過設定不同的過期時間,來錯開快取過期,從而避免快取集中失效。
二、預防和解決快取雪崩問題
1)事前解決方案
保證快取層服務高可用性
和飛機都有多個引擎一樣,如果快取層設計成高可用的,即使個別節點、個別機器、甚至是機房宕掉,依然可以提供服務,例如 redis sentinel 和 redis cluster 都實現了高可用。
部署方式一:雙機房部署,一套redis cluster,部分機器在乙個機房,另一部分機器在另外乙個機房。
部署方式二:雙機房部署,兩套redis cluster,兩套redis cluster之間做乙個資料同步。
2)事中解決方案:
對快取訪問進行 資源隔離(熔斷)、fail silent 降級
避免所有資源hang在訪問快取上,當判斷快取出現問題,則自動進行熔斷並按預設進行降級操作。
ehcache本地快取
應對零散的快取中資料被清除掉的現象,另外乙個主要預防快取徹底崩潰,ehcache的快取還能支撐一陣。
對源服務訪問進行 限流、資源隔離(熔斷)、stubbed 降級。
無論是快取層還是儲存層都會有出錯的概率,可以將它們視同為資源。作為併發量較大的系統,假如有乙個資源不可用,可能會造成執行緒全部 hang 在這個資源上,造成整個系統不可用。
3)事後解決方案
4)提前演練
在專案上線前,演練快取層宕掉後,應用以及後端的負載情況以及可能出現的問題,在此基礎上做一些預案設定。
快取穿透 擊穿 雪崩以及解決方案
實際運用場景中,經常遇到高併發,尤其在秒殺 熱點資料,某一時刻產生大量併發請求,如果直接請求資料庫,會造成資料庫癱瘓,造成整個服務不可用,為了避免這種情況發生,經常用到快取技術,來緩衝高併發請求。引入快取技術,能夠緩解資料庫壓力,提供系統效能,系統更加健壯。但是同時快取技術會引發快取穿透 擊穿 雪崩...
快取雪崩,快取穿透解決方案
負載過高,甚至宕機。解決思路 1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。2,分析使用者行為,盡量讓失效時間點均勻分布。避免快取雪崩的出現。3,如果是因為某台快取伺服器宕機,可以考慮做主備,比如 red...
快取雪崩,快取穿透解決方案
快取雪崩可能是因為資料未載入到快取中,或者快取同一時間大面積的失效,從而導致所有請求都去查資料庫,導致資料庫cpu和記憶體負載過高,甚至宕機。解決思路 1,採用加鎖計數,或者使用合理的佇列數量來避免快取失效時對資料庫造成太大的壓力。這種辦法雖然能緩解資料庫的壓力,但是同時又降低了系統的吞吐量。2,分...