一.redis replication的容量瓶頸問題
? ? ????我們知道redis replication+sentiel是單master節點多slave節點的這樣一個架構,這樣的話就會存在一個容量瓶頸問題。就是說,如果你的master節點的內存容量為16G,那么就算你把所有的內存都給redis使用的話,最大的緩存容量也就是16G,而每個slave節點的數據是跟slave節點是保持一致的,也就是說整個redis replication 集群的緩存容量為16G。當你的數據接近16G的時候,redis就會執行數據過期或淘汰算法,比如LRU。那么客戶端再請求那些被清除過的數據的時候,因為redis已經將他清除,這時候就是直接去數據庫查詢數據,這樣就會變相的降低系統的吞吐量,使系統能夠承受的并發量變低。
二.使用redis cluster集群架構解決單master的容量瓶頸問題
? ? ? ? 我們再使用redis replication的時候,為了提升集群能夠承受的QPS我們會水平擴容slave節點,這樣就能比較輕松的增加redis replication集群的QPS。對于單master節點的容量瓶頸問題,我們也可以采取這個策略,如果redis集群中的master節點也可以水平擴容的話,是不是就可以增加集群所能緩存的數據容量了。我們使用redis cluster便能夠實現這個目標。
三.redis cluster簡介?
1.redis cluster它可以支持多個master節點,每個master可以掛載多個slave。
2.它也支持讀寫分離的架構,對于每個master節點來說,寫在master節點,讀都會去這個master節點對應的slave節點。
3.redis cluster也能保證高可用性,每個master節點有多個slave節點,那么如果master掛掉,redis cluster會自動切換一個slave為master。
4.在redis cluster架構下,每個redis要放開兩個端口號,比如一個是6379,另外一個就是加10000的端口號,比如16379
16379端口號是用來進行節點間通信的,也就是cluster bus集群總線。cluster bus進行通信,用來進行故障檢測,配置更新,故障轉移授權。
5.cluster bus用了另外一種二進制的協議,主要用于節點間進行高效的數據交換,占用更少的網絡帶寬和處理時間。
四.redis cluster和redis replication如何選擇
? ? ? ? 如果你的數據量不大,一般只有幾個G,主要是應對高并發的場景,那么你使用redis replication便足夠了。但是如果你的數據量很大,那么你就可以選擇redis cluster,它不僅可以支撐高并發,高可用,還可以支持海量數據的場景。
五.數據分布算法:hash算法,一致性hash算法+虛擬節點,redis cluster的hash slot算法簡介
1.hash算法
? ? ? ? hash算法是比較老的一種數據分布算法,當客戶端要讀取一個key的時候,先計算這個key的hash值,然后使用這個值對當前master節點的數量進行取模,然后根據結果選擇對應的master節點。
hash算法的弊端(大量緩存重建):在運行的時候如果一臺master宕機了,那么會造成這臺機器上的所有緩存丟失,如果是三臺的話,立馬就會丟失三分之一的數據。但是這個算法還有一個弊端,如果其中一臺master宕機的話,那么當前取模的數量就會減一,這要就會造成結果錯位,這是什么意思呢?就是說本來有三臺master節點,其中一臺宕機了,那么現在就以2取模,宕機發生的時候三分之一的數據就已經沒有了,現在以2取模,本來結果為2的key說不定就會被指向其他的master,那么這部分數據還是會取不到,直接造成大量的請求直接去數據庫拿數據。所以傳統的hash算法多用在數據庫分庫分表上,對應高并發的緩存存儲會有不小的問題,對于高并發場景是不能接受的。
2.一致性hash算法(自動緩存遷移)+虛擬節點(自動負載均衡)
一致性hash算法的原理如下圖所示:
一致性hash算法的弊端:
使用虛擬節點來解決熱點數據問題
3.redis cluster的hash slot 算法
????????redis cluster有固定的16384個hash slot,對每個key計算CRC16值,然后對16384取模,可以獲取key對應的hash slot,redis cluster中每個master都會持有部分slot,比如有3個master,那么可能每個master持有5000多個hash slot,hash slot讓node的增加和移除很簡單,增加一個master,就將其他master的hash slot移動部分過去,減少一個master,就將它的hash slot移動到其他master上去,移動hash slot的成本是非常低的。
????????redis cluster 使用的hash? slot算法可以使請求均勻的打在每臺master上,即使一臺服務器宕機,短時間內這臺宕機的master上的數據不能訪問,但是redis cluster會快速的將這臺master上的hash slot 轉移到別的master上,其他master上的數據并不會受到影響,因為每個key都有它對應的hash slot,而且移動這些hash slot速度很快,成本也很低。
? ? ? ? 如果你想要指定數據走指定的hash slot,redis cluster 也會有相應的API可以實現,通過hash tag實現。