Redis系列(八) 快取到底該如何做到高可用?

2021-10-23 12:58:25 字數 1616 閱讀 4806

什麼情況會導致快取不可用?

單點問題:

什麼是單點問題呢?就是我們在使用快取時,有時候由於 qps、記憶體容量只需要乙個埠(此處的乙個埠是指一主一從)就可以扛住所有讀寫請求時,比如寫 qps 5k,讀 qps 30k,記憶體 5g;根據這個資料規模,dba 在部署資源時會選擇只部署乙個節點。當快取資源由於某些情況導致伺服器宕機或服務不可用時,由於只部署了乙個埠,從而導致當前整個應用服務不可用(這種情況之前在實際生產環境中真實發生過,直接炸裂),這就是所謂的單點問題;其實在分布式架構中,為了做到服務的高可用,要盡量去避免單點問題,做到雞蛋盡量不放在乙個籃子裡來盡量保證服務的可用性。

快取穿透/快取擊穿

快取穿透/快取擊穿是指某些時刻由於有些熱 key 失效或者是過期,導致在一瞬間大量請求繞過快取直接打到 db 上,由於 db 的讀寫 qps 並不高,從而導致 db 直接瞬間被打掛,尤其是在微博這種應用上,突發熱點流量加上快取設計不合理導致熱 key 過期,就會發生快取擊穿的情況。

快取雪崩

快取雪崩是指由於快取過期時間設計不合理,快取資料過期時間集中,導致在某一時刻快取中資料大面積過期,從而導致快取的 miss 率大大增加,由於快取沒有攔住請求導致大量請求落到 db 上,最終導致後端 db 資源被徹底打掛,即使重啟 db 也會被大量請求瞬間再次打掛。

如何設計高可用的快取?

單點問題解決方案

首先,單埠在資源申請階段部署為多埠的(大於乙個埠),同時每個埠至少部署為一主一從且分布在不同的節點上;通過此種部署方式,會有如下幾個好處:

其次,在多埠部署的基礎上,在機房層面做到多機房災備;此種快取的做法是:假設乙個快取部署兩份,而這兩份快取部署在不同的機房中,這樣的話,即使其中乙個機房發生極端情況,可以將流量切換到另外乙個機房中,從而做到機房層面的高可用。

最後,可以使用一致性 hash 演算法,使用機器的 ip 或者網域名稱做 hash 操作,分布在乙個虛擬的環上,同樣對於 key 也做相同的 hash 操作,當 key 得到乙個 hash 值後,順時針移動直到遇到第乙個節點,然後將 key 對應的 value 儲存到該節點上;此種做法是節點動態上下線的時候只需要對部分 key 做 rehash 操作,但是此種方案的缺點是:節點動態上下線後,key 經過 rehash 操作後導致各個節點資料分布不均,也就導致各個節點的服務承載的壓力不均不可控。

快取穿透/快取擊穿的解決方案

快取擊穿是由於熱 key 失效導致的,所以第一種方案是:可以根據業務場景,選擇可以將熱 key 直接全部快取到快取中並且永遠不過期,通過此種方式來避免熱 key 因為過期的問題導致快取擊穿;第二種方案是:由於熱 key 一般情況下並不是很多,所以我們可以考慮使用 localcache,在系統啟動時,預先將熱點資料全部載入到記憶體中,只要伺服器不發生宕機就可以一直正常提供服務。

快取雪崩的解決方案

快取雪崩是在某一時刻,快取中資料大量集中過期導致快取不可用,對於此種情況,一般是在快取 key 設計時,對 key 增加乙個一定時間範圍內的隨機時間戳,使得 key 過期分散開來,從而避免所有 key 同時過期的尷尬情況。

總結

本文主要介紹了實際生產環境中快取該如何做到高可用,從而避免由於快取不可用而導致整個系統崩潰。

夯實Redis 快取到底是為了啥?

目錄 一 高效能 二 高併發 三 常見弊端 說到底,快取就是把不變或者不經常變化的資料給暫存下來,在下次查詢的時候就會直接取暫存的資料,這樣就可以加快查詢速度。最經典的乙個例子就是在系統上線之前快取字典表,這樣一來就能夠避免查詢資料庫字典表。快取是基於記憶體的,mysql資料庫是基於磁碟的,因此它們...

redis同步快取到mysql中

需求 當資料庫中修改新增或者刪除時需要同步更新redis快取。分析 1.第一步應該是將所有mysql中的資料快取同步到redis 2.當mysql資料全部同步到redis中說明redis中資料和mysql中完全一致。3.因為mysql中資料和redis中資料完全一致所以可以根據redis修改mysq...

快取到Redis中記錄資料

一。先配好 redis 我自己配好的位址。value 12 是第12個庫 寫cs檔案 public static class redispool catch exception ex 快取到redis中 public static void enqueuelist string key,string...