咱們知道,Redis總共分四種架構:單機、主從、哨兵、集羣,本篇文章主要講解集羣架構;
先來一張 Redis-cluster 架構圖:
集羣搭建步驟:
啓動節點:將節點以集羣方式啓動,此時節點是獨立的。
節點握手:將獨立的節點連成網絡。
槽指派:將16384個槽位分配給主節點,以達到分片保存數據庫鍵值對的效果。
主從複製:爲從節點指定主節點。
由圖可知,集羣中包含多個小集羣,每一個小集羣都是主從架構,當主節點掛掉後,它的從節點會自動進行故障轉移
,升級爲主節點;(一個大集羣中,最少須要包含三個小集羣)
往集羣中存數據,如何肯定保存到哪臺主節點呢?
上圖可知,每一個小集羣中主節點
都會分配必定範圍的槽位
,表示只有在該範圍的數據才能夠存進來,好比:set hello world
,須要計算 Key 值hello
的槽位,用來肯定存入哪一個主節點中,Redis規定,集羣中槽位總數必須爲16384
;
上圖中,set hello world
,hello
的槽位值爲866,集羣中第一個主節點槽位範圍爲:0-5461,因此直接存入第一臺主節點中;
下面演示搭建過程(四個一主一從的小集羣組合爲一個大集羣):
首先建立八個文件夾,每個文件夾都是一個Redis實例,每個實例中都有一個redis.conf配置文件:
redis.conf 須要修改的配置:
基本配置:port、pidfile、logfile、dir
集羣配置:cluster-enabled、cluster-config-file、cluster-node-timeout、cluster-replica-validity-factor、cluster-migration-barrier、cluster-require-full-coverage、luster-replica-no-failover
最後記得 :wq
保存
如今每一個文件夾下都有各自對應的 redis.conf 文件:
咱們先來啓動六個
redis實例:
此時沒法向任何一個redis寫入數據,由於各個redis實例尚未相互關聯,也沒有分配槽位
:
接下來,經過一條命令,使各個節點相互認識,分配主從,配置槽位:
首先記住一條命令:redis-cli --cluster help
由圖可知,建立集羣命令:
此時有六個節點,cluster-replicas 1 :表示比例,主從比例爲三比三,若是寫 2 ,主從比例爲二比四(會報錯,最少須要三個小集羣);以上命令,會默認平均分配槽位;此時鏈接任何一個redis,執行 cluster nodes:
此時寫入數據,仍是會報錯:
由於 k1 的槽位值不在 7000 這臺主節點上;
鏈接redis時,尾部加 -c (以集羣方式鏈接),再次存入數據成功,而且自動切換到 7002 節點上;
接下來說解一下集羣擴容,啓動 7006 和 7007:
將這兩個節點添加到集羣中,主節點:
從節點:
目前7006尚未槽位,須要分配槽位:
此時要分配槽位:
此時,已經完成了槽位分配:
注意:分配槽位時,數據也會遷移過去;
接下來說解一下集羣縮容,先從新分配槽位:
再刪節點:(先刪從節點,再刪主節點,不然會執行故障轉移)
故障轉移期間,集羣中該節點會有必定時間不可用,但不影響其餘節點,反之,哨兵模式下,故障轉移過程當中整個集羣都不可用;
node