雖然做了主從復制,但單個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狀態。