Redis 集群(cluster)


 

雖然做了主從復制,但單個master的容量受機器內存限制,往往要做集群來提升容量。

 

redis 5.0之前的版本通過執行redis-trib.rb來創建集群,而redis-trib.rb是使用ruby語言寫的腳本,需要配置ruby環境,此外還需要安裝redis.gem來管理集群。

18年11月redis 5.0發布,使用redis-cli代替redis-trib.rb來創建集群,當然redis-trib.rb現在還能用(向下兼容),在redis解壓目錄的src下還有這個文件,但后續會被取消掉,不建議再使用。

 

此處使用redis 5.0來創建集群。

 

 


 

 

 集群設置

1、編輯已安裝的redis的redis.conf,設置允許集群

 

參與集群的所有節點都不能是slave,所以如果配置了replicaof,需將其注釋掉。

 

參與集群的節點的數據庫必須要是空的,所以如果該節點有.rdb、.aof等數據庫文件,需將其刪除。

如果集群失敗,后續嘗試時要先刪除之前的數據庫(.rdb、.aof)。

 

 

 

2、在/usr/local下新建目錄redis-cluster,把已安裝的redis復制6份,放到redis-cluster下,依次重命名為redis1、redis2.....修改端口號,避免端口沖突

創建集群至少要3個master,每個master至少要有一個replica(副本,即slave),這是官方規定的。

所以至少要6個節點,這6個節點都不能設置replicaof,哪些節點作為master、哪些節點作為slave,由集群自動分配,不能由我們手動設置。

 

如果在配置文件中設置了文件保存路徑,需要看下各個redis設置的路徑有沒有沖突,主要有2處:

  • logfile    redis的日志文件的保存位置
  • /redis/data    數據庫文件的保存位置

 

 

 

3、redis-cluster下新建腳本start-all.sh,用來啟動6個redis-server

cd /usr/local/redis-cluster
redis1/bin/redis-server redis1/conf/redis.conf
redis2/bin/redis-server redis2/conf/redis.conf
redis3/bin/redis-server redis3/conf/redis.conf
redis4/bin/redis-server redis4/conf/redis.conf
redis5/bin/redis-server redis5/conf/redis.conf
redis6/bin/redis-server redis6/conf/redis.conf
redis7/bin/redis-server redis7/conf/redis.conf

文件默認沒有x權限,需要chmod給此文件添加x權限。

 

如果弄錯了,要關掉redis-server,不要一個一個地redis-cli shutdown,很麻煩,

可以寫成腳本,一次關閉所有redis-server,也可以ps -ef | grep redis查看redis進程,然后kill pid1 pid2 .....一次殺死所有的redis-server。

 

 

 

4、運行start-all.sh,啟動6個redis-server

./start-all.sh   #當前目錄是/usr/local/redis-cluster

 

 

 

5、使用某個redis-cli創建集群

 redis1/bin/redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.01:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

指定要參加集群的節點(ip、port),cluster-replicas指定每個master分配幾個slave,會自動分配master、slave。

 

比如6個節點,設置1,6*(1/2)=3個master,6*(1/2)=3個slave;

比如24個節點,設置2,24*(1/3)=8個master,24*(2/3)=16個slave。

master看做1,slave看做指定的數字,按比值計算。

 

參加集群的節點,自動分配時,一般是前面的作為master,后面的作為slave。

比如我們的6個節點,設置1,就是前3個(6379、6380、6381)作為master,后三個(6382、6383、6384)作為對應的slave。

 

那個warning是因為所有節點的ip都是相同的(127.0.0.1),會提示一下,不影響。

實際運維時要在redis.conf中用bind綁定機器的實際ip,用實際ip來創建集群。

看到已經給出集群配置方案。

 

 

輸入yes同意配置方案,便開始按照方案進行集群配置。同意只能輸入yes,不能輸入y替代。

slot(槽點)是用來進行寫指令的,只分配給master,一共16384個槽點,均勻分配給各個master。

slave只是作為備份,不執行寫指令,不需要槽點,所以分配0個槽點。

 

 

 

6、連接到集群中的某個節點,比如127.0.0.1:6379

redis1/bin/redis-cli -c  #連接到集群節點(不管是master、還是slave)都要使用參數-c,c即cluster
#redis1/bin/redis-cli -h 127.0.0.1 -p 6379 -c

 

 

查看集群信息:

cluster info

集群狀態、槽點信息、節點數都可以看到,其中集群大小cluster_size只算master的個數。

 

注意是cluster info,不是info cluster。info cluster是查看是否允許集群:

1表示允許集群

 

 

查看此節點的主從復制:

info replication

如果當前節點是slave,會列出所屬master的信息(ip、port)。

 

 

設置值、取值:

設置、取值都是:先根據key的哈希值確定槽點位置,自動轉到該槽點所在的節點,然后在該槽點處設置值、取值。

 

 


 

 

 

redis的集群和tomcat的不同,所有tomcat節點上部署的項目都一樣,所以要nginx確定轉發到哪個tomcat節點。

redis集群是把數據分散存儲在多個節點上,這些節點共同組成一個完成的redis數據庫。

集群中每2個master節點之間都可以通信,每個節點上都維護者集群各個節點的信息。

在.aof、.rdb所在目錄下,有一個nodes.conf:

包括各個節點的ip、port,角色(master、slave),是集群中的第幾個節點,和當前節點之間是否能ping通(是否connected)。

如果是master,還包括槽點區間。

設置值、取值的時候,先根據key的hash值確定槽點位置,再根據這個配置確定該槽點所在節點的ip、port,轉交給該節點操作。

 

 

 

slave會復制所屬master上的數據(rdb、aof),雖然也可以進行讀寫操作,但都是轉到master上操作(因為槽點都在master上),並不是在slave本身進行操作。

使用集群后,主從復制就沒必要設置讀寫分離了,因為都是轉到master上讀寫數據,終究都是在master上進行操作,

況且master集群(多個master),單個master負載壓力減小,只使用master也扛得住。

所以一般讀寫都連接到master節點操作,slave只作為備份。連接到哪一個master節點都行。

 

 

 

節點配置文件的保存位置可以指定,默認文件名為nodes.conf,和.aof、.rdb保存在同一目錄下。

創建集群時會往每個節點的nodes.conf中寫入初始配置,之后每個節點每秒都會ping一下其它節點,確定其它節點的狀態,來維護、更新這個節點配置文件。

可以指定超時時間,默認30s,在30s內沒收到該節點的回復,就主觀認為該節點掛掉了,將該節點標識為fail。

 

如果超過一半的master都將某個master標識為fail,那就認為該master節點確實掛掉了。

(雖然slave也在默默維護節點信息,但畢竟是備胎,主從有別,不能和master平起平坐,沒有發言權|表決權)

集群會自動將從該master的所有slave中選一個新的master。

 

集群(cluster)會自動配置主從復制、哨兵,無需我們手動配置。

 

如果掛掉的master的所有slave都不可用,那整個集群就掛掉了。

如果超過一半的master在短時間內都掛掉,不管slave可不可用,整個集群直接掛掉。

 

 

 

 

有時候查看某個節點nodes.conf,有些節點明明down掉了,nodes.conf中卻顯示connected、並未標識為fail。

這是因為你查看的nodes.conf所屬的redis-server已經down掉,down掉了還怎么更新|維護節點信息?節點信息是過時的。

 

 

如果連接集群中的某個master時,不加參數-c,則只能在讀寫該master上的槽點,不能讀寫其它master上的槽點。

 

使用redis-cli --cluster create創建好集群以后,nodes.conf已經生成,

不管是重啟redis-server、還是重啟Linux,redis.conf、nodes.conf中的集群配置都還在,啟動集群中的所有節點,會自動加入集群,無需再次使用redis-cli --cluster create創建集群。

但如果不滿足集群要求,比如某個master及其所有slave節點你一個都沒開啟,那集群肯定是fail狀態。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM