Redis Cluster與Redis3.0.0同時發佈,以此結束了Redis無官方集羣方案的時代,目前,Redis已經發布了3.0.7版本。redis
redis cluster是去中心化,去中間件的,也就是說,集羣中的每一個節點都是平等的關係,都是對等的,每一個節點都保存各自的數據和整個集羣的狀態。每一個節點都和其餘全部節點鏈接,並且這些鏈接保持活躍,這樣就保證了咱們只須要鏈接集羣中的任意一個節點,就能夠獲取到其餘節點的數據。算法
那麼redis 是如何合理分配這些節點和數據的呢?服務器
Redis 集羣沒有並使用傳統的一致性哈希來分配數據,而是採用另一種叫作哈希槽 (hash slot)的方式來分配的。redis cluster 默認分配了 16384 個slot,當咱們set一個key 時,會用CRC16算法來取模獲得所屬的slot,而後將這個key 分到哈希槽區間的節點上,具體算法就是:CRC16(key) % 16384。中間件
注意的是:必需要3個之後的主節點,不然在建立集羣時會失敗,咱們在後續會實踐到。blog
因此,咱們假設如今有3個節點已經組成了集羣,分別是:A, B, C 三個節點,它們能夠是一臺機器上的三個端口,也能夠是三臺不一樣的服務器。那麼,採用哈希槽 (hash slot)的方式來分配16384個slot 的話,它們三個節點分別承擔的slot 區間是:hash
節點A覆蓋0-5460;class
節點B覆蓋5461-10922;集羣
節點C覆蓋10923-16383.高可用
那麼,如今我想設置一個key ,好比叫my_name:數據
set my_name wind
按照redis cluster的哈希槽算法:CRC16(‘my_name’)%16384 = 2412。 那麼就會把這個key 的存儲分配到 A 上了。
一樣,當我鏈接(A,B,C)任何一個節點想獲取my_name這個key時,也會這樣的算法,而後內部跳轉到B節點上獲取數據。
這種哈希槽的分配方式有好也有壞,好處就是很清晰,好比我想新增一個節點D,redis cluster的這種作法是從各個節點的前面各拿取一部分slot到D上,我會在接下來的實踐中實驗。大體就會變成這樣:
節點A覆蓋1365-5460
節點B覆蓋6827-10922
節點C覆蓋12288-16383
節點D覆蓋0-1364,5461-6826,10923-12287
一樣刪除一個節點也是相似,移動完成後就能夠刪除這個節點了。
Redis Cluster主從模式
redis cluster 爲了保證數據的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供數據存取,從節點則是從主節點拉取數據備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證集羣不會掛掉。
上面那個例子裏, 集羣有ABC三個主節點, 若是這3個節點都沒有加入從節點,若是B掛掉了,咱們就沒法訪問整個集羣了。A和C的slot也沒法訪問。
因此咱們在集羣創建的時候,必定要爲每一個主節點都添加了從節點, 好比像這樣, 集羣包含主節點A、B、C, 以及從節點A一、B一、C1, 那麼即便B掛掉系統也能夠繼續正確工做。
B1節點替代了B節點,因此Redis集羣將會選擇B1節點做爲新的主節點,集羣將會繼續正確地提供服務。 當B從新開啓後,它就會變成B1的從節點。
不過須要注意,若是節點B和B1同時掛了,Redis集羣就沒法繼續正確地提供服務了。
集羣的時候,咱們能夠單機集羣也能夠多機集羣,後面咱們分別實驗;