寫在前面的話:
javascript
對於redis來講,它有四種部署模式,分別是單機模式、主從模式、哨兵模式和集羣模式,他們的使用場景有些區別,固然也是愈來愈複雜,可靠性愈來愈高。css
本文從實際操做的角度,來介紹和講解下,這幾種模式的特色,鑑於篇幅的問題,文章分紅兩篇,一篇用來介紹:單機模式、主從模式和哨兵模式;本篇文章是,另一個模式的介紹:集羣模式。html
1、集羣模式解決什麼問題呢?
java
集羣模式用來解決Redis的在線擴容的問題,緣由是:Redis容量受限於單機配置的問題,而且前面的幾種模式並不能很好的作到這一點。node
集羣模式有三種方式:客戶端實現、Proxy代理層、服務端實現。nginx
本文章主要講解服務端實現方式,服務端的實現方式就是標準的集羣(分區分片)模式,RedisCluster是Redis在3.0版本後推出的分佈式解決方案。redis
Cluster模式實現了Redis的分佈式存儲,即每臺節點存儲不一樣的內容,來解決在線擴容的問題。算法
2、Cluster模式的工做機制是什麼?sql
在Redis的每一個節點上,都有一個插槽(slot),總共16384個哈希槽,取值範圍爲0-16383。採用Slot的設計(一個集羣有多個主從節點,一個主從節點上會分配多個Slot槽,每一個槽點上存的是Key-Value數據):數據庫
當咱們存取key的時候,Redis會根據CRC16的算法得出一個結果,而後把結果對16384求餘數,這樣每一個key都會對應一個編號在0-16383之間的哈希槽,經過這個值,去找到對應的插槽所對應的節點,而後直接自動跳轉到這個對應的節點上進行存取操做。如圖所示:
1.爲了保證高可用,Cluster模式也引入主從複製模式,一個主節點對應一個或者多個從節點,當主節點宕機的時候,就會啓用從節點。(備註:這裏的從節點只是作備份來用,不做爲讀寫分離來操做。)2.當其它主節點ping一個主節點A時,若是半數以上的主節點與A通訊超時,那麼認爲主節點A宕機了。若是主節點A和它的從節點都宕機了,那麼該集羣就沒法再提供服務了。
備註:Cluster模式集羣節點最小配置6個節點(3主3從,由於須要半數以上)
3、集羣部署實際操做
1. 配置和啓動集羣
1)修改配置文件,這裏分別啓動7001~7006六個redis服務:
#修改爲本身對應的端口號port 7001 #指定了記錄日誌的文件。logfile #數據目錄,數據庫的寫入會在這個目錄。rdb、aof文件也會寫在這個目錄dir #是否開啓集羣cluster-enabled#集羣配置文件的名稱,每一個節點都有一個集羣相關的配置文件,持久化保存集羣的信息。#這個文件並不須要手動配置,這個配置文件由Redis生成並更新,每一個Redis集羣節點須要一個單獨的配置文件,請確保與實例運行的系統中配置文件名稱不衝突(建議配對應端口號)cluster-config-file nodes-7001.conf#節點互連超時的閥值。集羣節點超時毫秒數cluster-node-timeout 15000 #默認redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了。#可是redis若是中途宕機,會致使可能有幾分鐘的數據丟失,根據save來策略進行持久化,Append Only File是另外一種持久化方式,能夠提供更好的持久化特性。#Redis會把每次寫入的數據在接收後都寫入 appendonly.aof 文件,每次啓動時Redis都會先把這個文件的數據讀入內存裏,先忽略RDB文件。appendonly yesprotected-mode no #保護模式 yes改成nobind 127.0.0.1 #本機試驗,使用這個ip,這裏也能夠指定爲集羣的IPdaemonize yes #用來指定redis是否要用守護線程的方式啓動,yes表示後臺啓動
2)啓動redis-server:
按照下面的命令來分別啓動7001~7006六個服務:
$ redis-server /usr/local/etc/redis7005.conf14903:C 05 Jan 2021 11:50:05.601 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo14903:C 05 Jan 2021 11:50:05.601 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=14903, just started14903:C 05 Jan 2021 11:50:05.601 # Configuration loaded
顯示啓動的redis-server:
ps -ef | grep redis 501 14867 1 0 11:45上午 ?? 0:00.66 redis-server 127.0.0.1:7001 [cluster] 501 14884 1 0 11:48上午 ?? 0:00.17 redis-server 127.0.0.1:7002 [cluster] 501 14887 1 0 11:49上午 ?? 0:00.08 redis-server 127.0.0.1:7003 [cluster] 501 14890 1 0 11:49上午 ?? 0:00.06 redis-server 127.0.0.1:7004 [cluster] 501 28799 1 0 171120 ?? 45:20.39 redis-server 127.0.0.1:7005 [cluster] 501 28801 1 0 171120 ?? 47:39.12 redis-server 127.0.0.1:7006 [cluster] 501 13669 841 0 10:11上午 ttys002 0:00.01 redis-cli -h 127.0.0.1 -p 7001 501 14897 14516 0 11:49上午 ttys007 0:00.00 grep redis
3)設置爲cluster集羣模式:
命令: redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
# 1表示每一個主節點至少一個備份
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1>>> Performing hash slots allocation on 6 nodes... -> Slots 0 - 5460 -> Slots 5461 - 10922 -> Slots 10923 - 16383 Adding replica 127.0.0.1:7005 to 127.0.0.1:7001Adding replica 127.0.0.1:7006 to 127.0.0.1:7002Adding replica 127.0.0.1:7004 to 127.0.0.1:7003Trying to optimize slaves allocation for anti-affinity Some slaves are in the same host as their master M: 4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001 slots:[0-5460] (5461 slots) masterM: 2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002 slots:[5461-10922] (5462 slots) masterM: 62c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003 slots:[10923-16383] (5461 slots) masterS: 2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004 replicates 62c2ac721e402a27f017be49589bc06532548cddS: 357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005 replicates 4359ede424a92c7f249fb6524c6cc3f6dc46fb60S: 2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006 replicates 2c779d5cc0b786af908d1c76dd3d4968e15796b3Can I set the above configuration? (type 'yes' to accept): yesNodes configuration updated Assign a different config epoch to each node Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join.....Performing Cluster Check (using node 127.0.0.1:7001) M: 4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001 slots:[0-5460] (5461 slots) master 1 additional replica(s)S: 2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006 slots: (0 slots) slave replicates 2c779d5cc0b786af908d1c76dd3d4968e15796b3M: 2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s)S: 2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004 slots: (0 slots) slave replicates 62c2ac721e402a27f017be49589bc06532548cddM: 62c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003 slots:[10923-16383] (5461 slots) master 1 additional replica(s)S: 357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005 slots: (0 slots) slave replicates 4359ede424a92c7f249fb6524c6cc3f6dc46fb60All nodes agree about slots configuration. Check for open slots... Check slots coverage... All 16384 slots covered.
備註:這一步碰到的問題:
$ redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1[ERR] Node 127.0.0.1:7003 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解決方法:
1)將每一個節點下aof、rdb、nodes.conf本地備份文件刪除;
2)172.168.63.201:7001> flushdb #清空當前數據庫(可省略)
$redis-cli -p 7000
127.0.0.1:7000> flushall
127.0.0.1:7000> cluster reset
127.0.0.1:7000> exit
3)以後再執行腳本,成功執行
詳情能夠參考:
https://www.jianshu.com/p/338bc2a74300
https://stackoverflow.com/questions/37206993/redis-server-cluster-not-working
2. 集羣檢查
1) 查看集羣信息以及slot分配信息:
$ redis-cli -h 127.0.0.1 -p 7001 cluster node(error) ERR Unknown subcommand or wrong number of arguments for 'node'. Try CLUSTER HELP. cluster nodes2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609823130000 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609823129000 2 connected 5461-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609823128000 4 connected4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,master - 0 1609823128000 1 connected 0-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609823130975 3 connected 10923-16383357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 slave 4359ede424a92c7f249fb6524c6cc3f6dc46fb60 0 1609823129000 5 connected
介紹:能夠根據以上得出總共有3個master節點,每一個節點有一個slave節點,三個master節點分別分配了0-5460、5461-1092二、10923-16383三個slot範圍,7001這個master節點的slave節點爲7005節點,其id爲4359ede424a92c7f249fb6524c6cc3f6dc46fb60
2)添加數據,數據會根hash而後存到對應的slot槽,會存到slot槽對應的節點上
$ redis-cli -c -h 127.0.0.1 -p 7001 // -c 是集羣方式啓動127.0.0.1:7001> set 122 11 // hash在本機7001OK127.0.0.1:7001> set 1221 222 // hash到了7003-> Redirected to slot [13341] located at 127.0.0.1:7003OK127.0.0.1:7003> set 12233 222 // hash到了7002-> Redirected to slot [6669] located at 127.0.0.1:7002OK127.0.0.1:7002> set 12233 111 // hash到了7003OK127.0.0.1:7002> keys *1) "12233"127.0.0.1:7002>
備註:
127.0.0.1:7002> set 6666 6 (error) MOVED 1491 127.0.0.1:7001 // 提示這個錯誤是由於沒有按照集羣啓動redis-cli
3.宕機測試
測試步驟:關掉7001,查看集羣,發現7001的slave變成master,重啓7001,發現7001變成7005的salve。
1)關掉7001
kill 14867 $ ps -ef | grep redis 501 14884 1 0 11:48上午 ?? 0:14.18 redis-server 127.0.0.1:7002 [cluster] 501 14887 1 0 11:49上午 ?? 0:13.94 redis-server 127.0.0.1:7003 [cluster] 501 14890 1 0 11:49上午 ?? 0:14.02 redis-server 127.0.0.1:7004 [cluster] 501 14904 1 0 11:50上午 ?? 0:13.84 redis-server 127.0.0.1:7005 [cluster] 501 14907 1 0 11:50上午 ?? 0:13.65 redis-server 127.0.0.1:7006 [cluster] 501 13669 841 0 10:11上午 ttys002 0:00.01 redis-cli -h 127.0.0.1 -p 7001 501 15295 7048 0 1:26下午 ttys004 0:00.02 redis-cli -c -h 127.0.0.1 -p 7001 501 15319 14516 0 1:32下午 ttys007 0:00.00 grep redis
2) 7005變成master
cluster nodes2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609824784402 4 connected357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609824786425 7 connected 0-54602c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609824785000 2 connected 5461-1092262c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 myself,master - 0 1609824780000 3 connected 10923-163834359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 master,fail - 1609824748365 1609824746000 1 disconnected2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609824785413 6 connected
3)重啓7001,變成7005的salve
redis-server /usr/local/etc/redis7001.conf 15354:C 05 Jan 2021 13:39:21.856 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo15354:C 05 Jan 2021 13:39:21.856 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=15354, just started15354:C 05 Jan 2021 13:39:21.856 # Configuration loadedps -ef | grep redis 501 14884 1 0 11:48上午 ?? 0:16.23 redis-server 127.0.0.1:7002 [cluster] 501 14887 1 0 11:49上午 ?? 0:15.99 redis-server 127.0.0.1:7003 [cluster] 501 14890 1 0 11:49上午 ?? 0:16.05 redis-server 127.0.0.1:7004 [cluster] 501 14904 1 0 11:50上午 ?? 0:15.88 redis-server 127.0.0.1:7005 [cluster] 501 14907 1 0 11:50上午 ?? 0:15.70 redis-server 127.0.0.1:7006 [cluster] 501 15355 1 0 1:39下午 ?? 0:00.02 redis-server 127.0.0.1:7001 [cluster] 501 13669 841 0 10:11上午 ttys002 0:00.01 redis-cli -h 127.0.0.1 -p 7001 501 15295 7048 0 1:26下午 ttys004 0:00.02 redis-cli -c -h 127.0.0.1 -p 7001 501 15360 14516 0 1:39下午 ttys007 0:00.00 grep red
cluster nodes查看:
cluster nodes2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609825212544 4 connected357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609825211000 7 connected 0-54602c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609825209000 2 connected 5461-1092262c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 myself,master - 0 1609825208000 3 connected 10923-163834359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609825210000 7 connected2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609825211533 6 connected
4.水平拓展
場景是集羣能力不夠的時候,擴容用的,下面新增7007,7008來演示下。
1) 新增集羣配置 7007和7008,按照前面方法操做,啓動以下:
ps -ef | grep redis 501 14884 1 0 11:48上午 ?? 0:19.85 redis-server 127.0.0.1:7002 [cluster] 501 14887 1 0 11:49上午 ?? 0:19.64 redis-server 127.0.0.1:7003 [cluster] 501 14890 1 0 11:49上午 ?? 0:19.64 redis-server 127.0.0.1:7004 [cluster] 501 14904 1 0 11:50上午 ?? 0:19.51 redis-server 127.0.0.1:7005 [cluster] 501 14907 1 0 11:50上午 ?? 0:19.29 redis-server 127.0.0.1:7006 [cluster] 501 15355 1 0 1:39下午 ?? 0:03.61 redis-server 127.0.0.1:7001 [cluster] 501 15426 1 0 1:54下午 ?? 0:00.61 redis-server 127.0.0.1:7007 [cluster] 501 15430 1 0 1:54下午 ?? 0:00.59 redis-server 127.0.0.1:7008 [cluster] 501 13669 841 0 10:11上午 ttys002 0:00.01 redis-cli -h 127.0.0.1 -p 7001 501 15295 7048 0 1:26下午 ttys004 0:00.02 redis-cli -c -h 127.0.0.1 -p 7001 501 15446 14516 0 1:57下午 ttys007 0:00.00 grep redis
儘管7007,7008啓動了,可是集羣中並無這兩個服務
cluster nodes2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609827727127 4 connected357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609827726116 7 connected 0-54602c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609827724000 2 connected 5461-1092262c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 myself,master - 0 1609827724000 3 connected 10923-163834359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609827725104 7 connected2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609827724094 6 connected
2)7007加入到集羣中,並把他變爲master
增長主節點7007,其中7002是集羣裏面隨便選擇的一個master節點。
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7002 Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7002 Performing Cluster Check (using node 127.0.0.1:7002) M: 2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s)S: 2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004 slots: (0 slots) slave replicates 62c2ac721e402a27f017be49589bc06532548cddM: 62c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003 slots:[10923-16383] (5461 slots) master 1 additional replica(s)S: 4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001 slots: (0 slots) slave replicates 357221f17c5f5bf11d0551506fbff245ed0c047bM: 357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005 slots:[0-5460] (5461 slots) master 1 additional replica(s)S: 2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006 slots: (0 slots) slave replicates 2c779d5cc0b786af908d1c76dd3d4968e15796b3All nodes agree about slots configuration. Check for open slots... Check slots coverage... All 16384 slots covered. Send CLUSTER MEET to node 127.0.0.1:7007 to make it join the cluster. [OK] New node added correctly.
檢查7007是否成功加入,可是發現7007沒有index
$ redis-cli -c -h 127.0.0.1 -p 7001 cluster nodes357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609827919000 7 connected 0-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609827920739 3 connected 10923-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609827917706 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609827919728 2 connected 5461-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609827918000 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609827917000 0 connected4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609827918000 1 connected
分配hash槽位給7007:
命令:$redis-cli --cluster reshard 127.0.0.1:7002 // 7002是隨機選的一個master
[OK] All 16384 slots covered.How many slots do you want to move (from 1 to 16384)? 2000 // 這裏設置7007所須要的 槽位數量What is the receiving node ID? 8dd6f8799e364e86e3df2acbbc42885482e5f526 // 7007對應的idPlease enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs.Source node #1: all // 類型選擇的是每個master平均分配的方式。
檢查分結果:
$ redis-cli -c -h 127.0.0.1 -p 7001 cluster nodes357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609828313000 7 connected 666-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609828315610 3 connected 11589-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609828314000 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609828314596 2 connected 6128-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609828313000 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609828314000 8 connected 0-665 5461-6127 10923-115884359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609828312000 1 connected
分析:發現每個master都分配了一部分槽位給7007,以下:0-665 5461-6127 10923-11588
3) 7008加入到集羣中,並把他變爲salve
添加7008到集羣: redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7002
[OK] All nodes agree about slots configuration. > Check for open slots... > Check slots coverage...[OK] All 16384 slots covered.127.0.0.1:7008 to make it join the cluster. > Send CLUSTER MEET to node [OK] New node added correctly.$ redis-cli -c -h 127.0.0.1 -p 7001 cluster nodes558579e037a19ecc2fc541c121df379bba9ab853 127.0.0.1:7008@17008 master - 0 1609828830000 0 connected357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609828831852 7 connected 666-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609828828000 3 connected 11589-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609828830000 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609828829000 2 connected 6128-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609828830000 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609828830843 8 connected 0-665 5461-6127 10923-115884359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609828828000 1 connected
指定7008的master爲7007,命令:
cluster replicate 8dd6f8799e364e86e3df2acbbc42885482e5f526
$ redis-cli -c -h 127.0.0.1 -p 70088dd6f8799e364e86e3df2acbbc42885482e5f526 cluster replicate OK cluster nodes558579e037a19ecc2fc541c121df379bba9ab853 127.0.0.1:7008@17008 myself,slave 8dd6f8799e364e86e3df2acbbc42885482e5f526 0 1609829022000 0 connected4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609829024000 7 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609829023000 8 connected 0-665 5461-6127 10923-11588357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609829020000 7 connected 666-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609829022956 3 connected 11589-163832b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609829023000 3 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609829024977 2 connected 6128-109222ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609829023966 2 connected
5. 節點下線
$ redis-cli --cluster del-node 127.0.0.1:7008 558579e037a19ecc2fc541c121df379bba9ab853558579e037a19ecc2fc541c121df379bba9ab853 from cluster 127.0.0.1:7008 > Removing node > Sending CLUSTER FORGET messages to the cluster... > SHUTDOWN the node.$ redis-cli -c -h 127.0.0.1 -p 7001 cluster nodes357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609829451017 7 connected 666-546062c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609829449000 3 connected 11589-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609829449000 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609829446000 2 connected 6128-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609829450009 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609829448000 8 connected 0-665 5461-6127 10923-115884359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609829447000 1 connected
7002 //將7007的槽位回收給7005 :Performing Cluster Check (using node 127.0.0.1:7007) M: 8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007 slots:[0-665],[5461-6127],[10923-11588] (1999 slots) masterS: 2b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004 slots: (0 slots) slave replicates 62c2ac721e402a27f017be49589bc06532548cddM: 62c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003 slots:[11589-16383] (4795 slots) master 1 additional replica(s)S: 2ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006 slots: (0 slots) slave replicates 2c779d5cc0b786af908d1c76dd3d4968e15796b3S: 4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001 slots: (0 slots) slave replicates 357221f17c5f5bf11d0551506fbff245ed0c047bM: 2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002 slots:[6128-10922] (4795 slots) master 1 additional replica(s)M: 357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005 slots:[666-5460] (4795 slots) master 1 additional replica(s)All nodes agree about slots configuration. Check for open slots... Check slots coverage... All 16384 slots covered. How many slots do you want to move (from 1 to 16384)? 2000What is the receiving node ID? 357221f17c5f5bf11d0551506fbff245ed0c047bPlease enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. 8dd6f8799e364e86e3df2acbbc42885482e5f526 :Source node #2: done
$ redis-cli -c -h 127.0.0.1 -p 7001 cluster nodes357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609830719272 9 connected 0-8578 10923-1236362c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609830720283 3 connected 12364-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609830721294 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609830717248 2 connected 8579-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609830719000 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 0 1609830718000 8 connected4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609830718000 1 connected
$ redis-cli -p 7007 shutdown$ redis-cli -c -h 127.0.0.1 -p 7001 cluster nodes357221f17c5f5bf11d0551506fbff245ed0c047b 127.0.0.1:7005@17005 master - 0 1609830849507 9 connected 0-8578 10923-1236362c2ac721e402a27f017be49589bc06532548cdd 127.0.0.1:7003@17003 master - 0 1609830850515 3 connected 12364-163832ecce47670970e13a034a37dd425154d298dc480 127.0.0.1:7006@17006 slave 2c779d5cc0b786af908d1c76dd3d4968e15796b3 0 1609830850000 6 connected2c779d5cc0b786af908d1c76dd3d4968e15796b3 127.0.0.1:7002@17002 master - 0 1609830846472 2 connected 8579-109222b51a786e6f204c292dc349b45aa8b515637382c 127.0.0.1:7004@17004 slave 62c2ac721e402a27f017be49589bc06532548cdd 0 1609830848000 4 connected8dd6f8799e364e86e3df2acbbc42885482e5f526 127.0.0.1:7007@17007 master - 1609830839496 1609830838387 8 disconnected4359ede424a92c7f249fb6524c6cc3f6dc46fb60 127.0.0.1:7001@17001 myself,slave 357221f17c5f5bf11d0551506fbff245ed0c047b 0 1609830848000 1 connected
參考文檔:
redis的幾種模式:https://www.cnblogs.com/jing99/p/12651186.htmlclient的幾種鏈接方式:https://blog.csdn.net/comprel/article/details/96716708哨兵模式:https://www.cnblogs.com/yangming1996/p/12677771.htmlredis官方文檔:https://godoc.org/gopkg.in/redis.v5redis安裝:https://juejin.im/post/6844904002270789645redis-cli命令:https://segmentfault.com/a/1190000022713251redis命令:http://redisdoc.com/string/mset.html
本文分享自微信公衆號 - 灰子學技術(huizixueguoxue)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。