此篇介紹Redis Cluster 集群,簡單介紹一下集群的實(shí)現(xiàn),主要還是具體的實(shí)踐部分:集群的開啟,故障轉(zhuǎn)移,添加節(jié)點(diǎn),移除節(jié)點(diǎn)
Redis集群中的基本概念
Redis的集群模式提供了數(shù)據(jù)的分片功能,并能保證每個(gè)分片上的可用性。Redis集群每個(gè)節(jié)點(diǎn)需要打開2個(gè)TCP連接,一個(gè)為客戶端提供服務(wù),如 6379
,另一個(gè)端口在第一個(gè)端口上 +10000
,為 16379
谍珊。用于集群總線,節(jié)點(diǎn)使用集群總線進(jìn)行故障檢測,配置更新,故障轉(zhuǎn)移授權(quán)等”朴眩客戶端不應(yīng)嘗試與集群總線接口進(jìn)行連接呀闻。必須打開這兩個(gè)端口,集群才能正常工作。(兩個(gè)端口的偏移量始終是 10000
)
集群中的數(shù)據(jù)分片
Redis Cluster 不使用一致性Hash,它使用的是另一種方式:hash slot(哈希槽)潜慎。
Redis集群中共有16384個(gè)Hash槽,采用了 CRC 16 & 16384
計(jì)算出hash槽的值捡多。Redis集群的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分hash槽,例如:3個(gè)節(jié)點(diǎn),其中A節(jié)點(diǎn)(0-5500),B節(jié)點(diǎn)(5501-11000),C節(jié)點(diǎn)(11001-16383).
在添加或這刪除節(jié)點(diǎn)時(shí),只需要將節(jié)點(diǎn)上的部分槽移動(dòng)到新節(jié)點(diǎn)上即可,例如,需要添加一個(gè)新節(jié)點(diǎn)D,將A,B,C上部分的槽移動(dòng)到D上即可。刪除節(jié)點(diǎn)同理,例如需要?jiǎng)h除A,只需要將A上的槽移動(dòng)到B,C上铐炫。
集群中的主從模型
為了保證集群中每個(gè)節(jié)點(diǎn)的可用性,cluster使用了主從模型垒手。例如,三主三從的架構(gòu)中:A,B,C,A1,B1,C1 ,A和A1為主從復(fù)制,A節(jié)點(diǎn)出現(xiàn)故障,集群將A1升為主節(jié)點(diǎn),保證了集群的可用性,如果A1也出現(xiàn)故障,集群將不可用。
集群一致性保證
Redis Cluster 無法保證數(shù)據(jù)的強(qiáng)一致性倒信。Redis的異步復(fù)制是導(dǎo)致無法保證數(shù)據(jù)一致的第一個(gè)原因: 客戶端向A寫入數(shù)據(jù) --> A向客戶端回復(fù) --> A將數(shù)據(jù)擴(kuò)散至從節(jié)點(diǎn)A1,A2,A3,可能在擴(kuò)散的過程中出現(xiàn)了故障,導(dǎo)致數(shù)據(jù)數(shù)據(jù)丟失科贬。可以將復(fù)制擴(kuò)散設(shè)置為同步,全部寫入后再向客戶端返回,但是這樣就導(dǎo)致性能過低鳖悠。
網(wǎng)絡(luò)發(fā)生分區(qū)時(shí),客戶端與少數(shù)實(shí)例隔離,也可能出現(xiàn)數(shù)據(jù)丟失的情況, A,A1,B,B1,C,C1,Client, client 正在向C中寫入數(shù)據(jù),出現(xiàn)了網(wǎng)絡(luò)分區(qū),導(dǎo)致 client 和 C 被隔離,集群選舉C1成為新的主節(jié)點(diǎn),網(wǎng)絡(luò)恢復(fù)后,C中的數(shù)據(jù)將會(huì)丟失,這種情況以通過設(shè)置 node timeout
來控制數(shù)據(jù)丟失的情況榜掌。節(jié)點(diǎn)超時(shí)過后,主節(jié)點(diǎn)被視為失敗乘综,可以由其中一個(gè)副本替換憎账。類似地,在節(jié)點(diǎn)超時(shí)已經(jīng)過去而主節(jié)點(diǎn)無法感知大多數(shù)其他主節(jié)點(diǎn)之后卡辰,它進(jìn)入錯(cuò)誤狀態(tài)并停止接受寫入胞皱。
Redis 集群的一致性,基本上要在性能和y一致性之間做一個(gè)平衡。
Redis 集群配置
cluster-enabled <yes/no>
cluster-config-file <filename>
cluster-node-timeout <milliseconds>
cluster-slave-validity-factor <factor>
cluster-migration-barrier <count>
cluster-require-full-coverage <yes/no>
-
cluster-enabled <yes/no>
,是否開啟集群模式,默認(rèn)不開啟 -
cluster-config-file <filename>
,開啟集群后,Redis集群會(huì)在每次發(fā)生更改時(shí)的配置寫入到文件中,在重新啟動(dòng)時(shí),使用這個(gè)配置文件九妈。這個(gè)文件一般不去認(rèn)為的改動(dòng)反砌。 -
cluster-node-timeout <milliseconds>
,節(jié)點(diǎn)超時(shí)時(shí)長,如果節(jié)點(diǎn)無法訪問超過這個(gè)時(shí)間,從節(jié)點(diǎn)將會(huì)進(jìn)行故障轉(zhuǎn)移。 -
cluster-slave-validity-factor <factor>
,如果設(shè)置為零萌朱,則從站將始終嘗試對主站進(jìn)行故障切換宴树,而不管主站和從站之間的鏈路是否保持?jǐn)嚅_連接的時(shí)間長短。如果該值為正晶疼,則計(jì)算最大斷開時(shí)間作為節(jié)點(diǎn)超時(shí)值乘以此選項(xiàng)提供的因子森渐,如果節(jié)點(diǎn)是從屬節(jié)點(diǎn)做入,則如果主鏈接斷開連接的時(shí)間超過指定的時(shí)間,則不會(huì)嘗試啟動(dòng)故障轉(zhuǎn)移同衣。例如竟块,如果節(jié)點(diǎn)超時(shí)設(shè)置為5秒,并且有效性因子設(shè)置為10耐齐,則從主設(shè)備斷開超過50秒的從設(shè)備將不會(huì)嘗試故障轉(zhuǎn)移其主設(shè)備浪秘。請注意,如果沒有從站能夠?qū)ζ溥M(jìn)行故障轉(zhuǎn)移埠况,則任何不同于零的值都可能導(dǎo)致Redis群集在主站發(fā)生故障后不可用耸携。在這種情況下,只有當(dāng)原始主服務(wù)器重新加入群集時(shí)辕翰,群集才會(huì)返回夺衍。 -
cluster-migration-barrier <count>
,主服務(wù)器將保持連接的最小從服務(wù)器數(shù),以便另一個(gè)從服務(wù)器遷移到不再由任何從服務(wù)器覆蓋的主服務(wù)器喜命。 -
cluster-require-full-coverage <yes/no>
,:如果設(shè)置為yes沟沙,則默認(rèn)情況下,如果任何節(jié)點(diǎn)未覆蓋某個(gè)百分比的key space壁榕,則集群將停止接受寫入矛紫。如果該選項(xiàng)設(shè)置為no,即使只能處理有關(guān)鍵子集的請求牌里,集群仍將提供查詢颊咬。
Redis Cluster 使用
我這里使用的Redis版本為 5.0.3,不同版本可能命令會(huì)有些不同。
首先準(zhǔn)備6個(gè)Redis節(jié)點(diǎn),條件有限,就在一臺服務(wù)器上進(jìn)行,拷貝6份redis.conf,最基本的必須配置有:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
6個(gè)節(jié)點(diǎn)的端口號為: 7000,7001,7002,7003,7004,7005
分別啟動(dòng)6個(gè)節(jié)點(diǎn):
redis-server redis-1.conf
redis-server redis-2.conf
redis-server redis-3.conf
redis-server redis-4.conf
redis-server redis-5.conf
redis-server redis-6.conf
現(xiàn)在已經(jīng)開啟了6個(gè)節(jié)點(diǎn)
[root@iZnom30el3gvhxZ redis]# ps -ef | grep redis
root 16270 1 0 15:15 ? 00:00:09 redis-server *:7000 [cluster]
root 16277 1 0 15:15 ? 00:00:09 redis-server *:7001 [cluster]
root 16534 1 0 15:20 ? 00:00:08 redis-server *:7003 [cluster]
root 16541 1 0 15:20 ? 00:00:08 redis-server *:7004 [cluster]
root 16548 1 0 15:20 ? 00:00:08 redis-server *:7005 [cluster]
root 17158 1 0 15:33 ? 00:00:08 redis-server *:7002 [cluster]
root 22290 13798 0 17:17 pts/0 00:00:00 grep --color=auto redis
開啟集群模式
使用下述命令創(chuàng)建Redis Cluster:
# 節(jié)點(diǎn)沒有設(shè)置密碼
redis-cli --cluster create 127.0.0.1:7000 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 --cluster-replicas 1
# 節(jié)點(diǎn)設(shè)置了密碼
redis-cli --cluster create 127.0.0.1:7000 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 --cluster-replicas 1 -a <requirepass>
其中 --cluster-replicas 1
,表示每個(gè)節(jié)點(diǎn)有一個(gè)從節(jié)點(diǎn)
需要注意的是:如果要給實(shí)例設(shè)置密碼,最好所有節(jié)點(diǎn)的密碼設(shè)置一致,并且配置 masterauth
,否則切換故障轉(zhuǎn)移的時(shí)候可能會(huì)出錯(cuò)牡辽。也可以在開啟集群時(shí)不設(shè)置密碼,開啟后在通過 config set masterauth abc config set requirepass abc config rewrite
命令設(shè)置喳篇。
[root@iZnom30el3gvhxZ cluster]# redis-cli --cluster create 127.0.0.1:7000 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 --cluster-replicas 1 -a abc
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
M: 07bc00f5b816a612e96ad2fcdc25b4decdc498bd 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
M: 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
S: 3a5b137a1997d72cdd61fb4cf58de6530a78fbca 127.0.0.1:7003
replicates 07bc00f5b816a612e96ad2fcdc25b4decdc498bd
S: 1793ee70d256fc3ab7ab582b20a9da0c8884e683 127.0.0.1:7004
replicates 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0
S: 08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 127.0.0.1:7005
replicates 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes 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:7000)
M: 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 127.0.0.1:7005
slots: (0 slots) slave
replicates 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea
S: 3a5b137a1997d72cdd61fb4cf58de6530a78fbca 127.0.0.1:7003
slots: (0 slots) slave
replicates 07bc00f5b816a612e96ad2fcdc25b4decdc498bd
S: 1793ee70d256fc3ab7ab582b20a9da0c8884e683 127.0.0.1:7004
slots: (0 slots) slave
replicates 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0
M: 07bc00f5b816a612e96ad2fcdc25b4decdc498bd 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
輸入命令后,會(huì)向你確認(rèn)信息,輸入yes
,最后輸出 [OK] All 16384 slots covered.
即為集群創(chuàng)建成功。
Redis 5.0 版本之后也提供了 create-cluster
在 utils/create-cluster
也可以用這個(gè)來做集群的啟動(dòng),關(guān)閉等操作态辛。
使用 redis-cli
進(jìn)入一個(gè)節(jié)點(diǎn) :
[root@iZnom30el3gvhxZ cluster]# redis-cli -c -p 7000 -a abc
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:7000>
-c
為以集群模式進(jìn)入,加不加這個(gè)參數(shù)的影響稍微演示,先向redis中存一個(gè) key看看:
127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
127.0.0.1:7002>
可以看到 foo
計(jì)算出的hash slot為 12182
,在第三個(gè)節(jié)點(diǎn)中,被存入到7002節(jié)點(diǎn)中
再來看一下如果不加 -c
是什么效果:
[root@iZnom30el3gvhxZ cluster]# redis-cli -p 7000 -a abc
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:7000> get foo
(error) MOVED 12182 127.0.0.1:7002
127.0.0.1:7000>
可以看到,拋出了一個(gè)錯(cuò)誤 (error) MOVED 12182 127.0.0.1:7002
, 其實(shí)以集群模式進(jìn)入redis-cli,也會(huì)出現(xiàn)這個(gè)錯(cuò)誤,只是客戶端隱藏了這個(gè)錯(cuò)誤,并重新在7002節(jié)點(diǎn)上重新執(zhí)行了這個(gè)操作杭隙。
在redis-cli中可以通過 cluster info
查看集群狀態(tài):
127.0.0.1:7000> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1001
cluster_stats_messages_pong_sent:987
cluster_stats_messages_sent:1988
cluster_stats_messages_ping_received:982
cluster_stats_messages_pong_received:1001
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1988
cluster_state:ok 代表集群正常
測試故障轉(zhuǎn)移
cluster nodes
查看集群中節(jié)點(diǎn):
127.0.0.1:7000> CLUSTER NODES
4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 127.0.0.1:7000@17000 myself,master - 0 1557916585000 1 connected 0-5460
3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 127.0.0.1:7002@17002 master - 0 1557916585000 3 connected 10923-16383
08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 127.0.0.1:7005@17005 slave 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 0 1557916584562 6 connected
3a5b137a1997d72cdd61fb4cf58de6530a78fbca 127.0.0.1:7003@17003 slave 07bc00f5b816a612e96ad2fcdc25b4decdc498bd 0 1557916585565 4 connected
1793ee70d256fc3ab7ab582b20a9da0c8884e683 127.0.0.1:7004@17004 slave 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 0 1557916585966 5 connected
07bc00f5b816a612e96ad2fcdc25b4decdc498bd 127.0.0.1:7001@17001 master - 0 1557916585000 2 connected 5461-10922
關(guān)閉其中一個(gè)主節(jié)點(diǎn),模擬出現(xiàn)故障的場景,這里關(guān)閉7000:
[root@iZnom30el3gvhxZ ~]# redis-cli -a abc -p 7000 shutdown
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
[root@iZnom30el3gvhxZ ~]# redis-cli -c -p 7001 -a abc
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:7001> CLUSTER NODES
3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 127.0.0.1:7002@17002 master - 0 1557972888691 3 connected 10923-16383
1793ee70d256fc3ab7ab582b20a9da0c8884e683 127.0.0.1:7004@17004 slave 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 0 1557972889594 5 connected
07bc00f5b816a612e96ad2fcdc25b4decdc498bd 127.0.0.1:7001@17001 myself,master - 0 1557972888000 2 connected 5461-10922
4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 127.0.0.1:7000@17000 master,fail - 1557972867020 1557972866000 1 disconnected
08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 127.0.0.1:7005@17005 master - 0 1557972888188 7 connected 0-5460
3a5b137a1997d72cdd61fb4cf58de6530a78fbca 127.0.0.1:7003@17003 slave 07bc00f5b816a612e96ad2fcdc25b4decdc498bd 0 1557972889191 4 connected
127.0.0.1:7001>
可以看到,7000端口當(dāng)前狀態(tài) fail
, 原來的從節(jié)點(diǎn)7005變成了主節(jié)點(diǎn)。
再重新啟動(dòng)7000節(jié)點(diǎn):
[root@iZnom30el3gvhxZ ~]# cd /usr/local/redis/cluster/
[root@iZnom30el3gvhxZ cluster]# redis-server cluster1/redis.conf
[root@iZnom30el3gvhxZ cluster]# redis-cli -c -p 7000 -a abc
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:7000> CLUSTER NODES
1793ee70d256fc3ab7ab582b20a9da0c8884e683 127.0.0.1:7004@17004 slave 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 0 1557973018558 5 connected
3a5b137a1997d72cdd61fb4cf58de6530a78fbca 127.0.0.1:7003@17003 slave 07bc00f5b816a612e96ad2fcdc25b4decdc498bd 0 1557973017957 4 connected
07bc00f5b816a612e96ad2fcdc25b4decdc498bd 127.0.0.1:7001@17001 master - 0 1557973018000 2 connected 5461-10922
4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 127.0.0.1:7000@17000 myself,slave 08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 0 1557973018000 1 connected
3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 127.0.0.1:7002@17002 master - 0 1557973017556 3 connected 10923-16383
08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 127.0.0.1:7005@17005 master - 0 1557973016553 7 connected 0-5460
127.0.0.1:7000>
7000節(jié)點(diǎn)重新啟動(dòng)后變成了從節(jié)點(diǎn)因妙。
手動(dòng)故障轉(zhuǎn)移
Redis Cluster 提供了手動(dòng)執(zhí)行故障轉(zhuǎn)移的功能,有時(shí)候我們需要對集群中的某個(gè)幾點(diǎn)進(jìn)行維護(hù)升級等情況可能需要用到,具體指令為 CLUSTER FAILOVER
,需要在想要被提升為主節(jié)點(diǎn)的從節(jié)點(diǎn)上執(zhí)行
例如,7000
節(jié)點(diǎn)為 7005
節(jié)點(diǎn)的從節(jié)點(diǎn),現(xiàn)在想對 7005
節(jié)點(diǎn)進(jìn)行下線維護(hù), 就需要將 7000
提升為主節(jié)點(diǎn),保持對外服務(wù)器的可用性,需要在 7000
節(jié)點(diǎn)的客戶端中執(zhí)行命令:
[root@iZnom30el3gvhxZ cluster]# redis-cli -c -p 7000 -a abc
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:7000> CLUSTER FAILOVER
OK
127.0.0.1:7000> CLUSTER NODES
1793ee70d256fc3ab7ab582b20a9da0c8884e683 127.0.0.1:7004@17004 slave 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 0 1557973168583 5 connected
3a5b137a1997d72cdd61fb4cf58de6530a78fbca 127.0.0.1:7003@17003 slave 07bc00f5b816a612e96ad2fcdc25b4decdc498bd 0 1557973167380 4 connected
07bc00f5b816a612e96ad2fcdc25b4decdc498bd 127.0.0.1:7001@17001 master - 0 1557973168884 2 connected 5461-10922
4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 127.0.0.1:7000@17000 myself,master - 0 1557973168000 8 connected 0-5460
3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 127.0.0.1:7002@17002 master - 0 1557973168583 3 connected 10923-16383
08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 127.0.0.1:7005@17005 slave 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 0 1557973169385 8 connected
127.0.0.1:7000>
7005節(jié)點(diǎn)已經(jīng)變?yōu)榱藦墓?jié)點(diǎn),可以將7005節(jié)點(diǎn)下線痰憎。
手動(dòng)故障轉(zhuǎn)移時(shí)客戶端的切換是在確保新的主節(jié)點(diǎn)完全復(fù)制了失敗的舊的主節(jié)點(diǎn)數(shù)據(jù)的前提下發(fā)生的,避免了數(shù)據(jù)的丟失攀涵。
添加節(jié)點(diǎn)
首先需要再新準(zhǔn)備一個(gè)新的redis實(shí)例作為要添加的節(jié)點(diǎn),如下,7006為新啟動(dòng)的節(jié)點(diǎn)
[root@iZnom30el3gvhxZ cluster]# ps -ef | grep redis
root 8522 1 0 10:16 ? 00:00:25 redis-server *:7000 [cluster]
root 18060 1 0 13:28 ? 00:00:00 redis-server *:7006 [cluster]
root 18066 7831 0 13:28 pts/0 00:00:00 grep --color=auto redis
root 26183 1 0 May15 ? 00:01:34 redis-server *:7001 [cluster]
root 26190 1 0 May15 ? 00:01:35 redis-server *:7002 [cluster]
root 26202 1 0 May15 ? 00:01:26 redis-server *:7003 [cluster]
root 26208 1 0 May15 ? 00:01:26 redis-server *:7004 [cluster]
root 26215 1 0 May15 ? 00:01:27 redis-server *:7005 [cluster]
添加節(jié)點(diǎn)的命令是 redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
, add-node 后第一個(gè)參數(shù)為新添加節(jié)點(diǎn)的ip,第二個(gè)為集群中任意一個(gè)節(jié)點(diǎn)的ip
[root@iZnom30el3gvhxZ cluster]# redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 -a wk123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 127.0.0.1:7006 to cluster 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 127.0.0.1:7000
slots:[8461-16383] (7923 slots) master
1 additional replica(s)
S: 1793ee70d256fc3ab7ab582b20a9da0c8884e683 127.0.0.1:7004
slots: (0 slots) slave
replicates 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0
S: 3a5b137a1997d72cdd61fb4cf58de6530a78fbca 127.0.0.1:7003
slots: (0 slots) slave
replicates 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea
M: 07bc00f5b816a612e96ad2fcdc25b4decdc498bd 127.0.0.1:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 127.0.0.1:7002
slots:[5461-8460] (3000 slots) master
1 additional replica(s)
S: 08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 127.0.0.1:7005
slots: (0 slots) slave
replicates 07bc00f5b816a612e96ad2fcdc25b4decdc498bd
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:7006 to make it join the cluster.
[OK] New node added correctly.
127.0.0.1:7006> CLUSTER NODES
1793ee70d256fc3ab7ab582b20a9da0c8884e683 127.0.0.1:7004@17004 slave 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 0 1557985157416 12 connected
08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 127.0.0.1:7005@17005 slave 07bc00f5b816a612e96ad2fcdc25b4decdc498bd 0 1557985159418 11 connected
4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 127.0.0.1:7000@17000 master - 0 1557985158417 10 connected 8461-16383
07bc00f5b816a612e96ad2fcdc25b4decdc498bd 127.0.0.1:7001@17001 master - 0 1557985158000 11 connected 0-5460
3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 127.0.0.1:7002@17002 master - 0 1557985158517 12 connected 5461-8460
3a5b137a1997d72cdd61fb4cf58de6530a78fbca 127.0.0.1:7003@17003 slave 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 0 1557985158000 10 connected
3425f765692f0b8b9c4931c038fae8d86fe6e383 127.0.0.1:7006@17006 myself,master - 0 1557985158000 0 connected
執(zhí)行完 redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 -a abc
命令后,輸出 [OK] New node added correctly.
,即添加新節(jié)點(diǎn)成功,在 redis-cli
中,查看節(jié)點(diǎn),已經(jīng)被添加進(jìn)去,只是7006 上沒有分配hash slot,現(xiàn)在我們需要將其它節(jié)點(diǎn)上的hash slot 分配給7006節(jié)點(diǎn)一些(使用 reshard 命令),這里演示的是將7000節(jié)點(diǎn)上的節(jié)點(diǎn)分出4000個(gè)到7006節(jié)點(diǎn)上:
[root@iZnom30el3gvhxZ cluster]# redis-cli --cluster reshard 127.0.0.1:7000 -a wk123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 127.0.0.1:7000
slots:[8461-16383] (7923 slots) master
1 additional replica(s)
S: 1793ee70d256fc3ab7ab582b20a9da0c8884e683 127.0.0.1:7004
slots: (0 slots) slave
replicates 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0
S: 3a5b137a1997d72cdd61fb4cf58de6530a78fbca 127.0.0.1:7003
slots: (0 slots) slave
replicates 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea
M: 3425f765692f0b8b9c4931c038fae8d86fe6e383 127.0.0.1:7006
slots: (0 slots) master
M: 07bc00f5b816a612e96ad2fcdc25b4decdc498bd 127.0.0.1:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 127.0.0.1:7002
slots:[5461-8460] (3000 slots) master
1 additional replica(s)
S: 08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 127.0.0.1:7005
slots: (0 slots) slave
replicates 07bc00f5b816a612e96ad2fcdc25b4decdc498bd
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)?
這里需要讓你輸入想要分配的slot數(shù)量,我們這里輸入 4000,
How many slots do you want to move (from 1 to 16384)? 4000
What is the receiving node ID?
這里需要輸入接收這些slot的節(jié)點(diǎn),輸入上述打出來的目標(biāo)節(jié)點(diǎn)的ID即可,這里輸入 3425f765692f0b8b9c4931c038fae8d86fe6e383
,
How many slots do you want to move (from 1 to 16384)? 4000
What is the receiving node ID? 3425f765692f0b8b9c4931c038fae8d86fe6e383
Please 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:
這里輸入源節(jié)點(diǎn)的id铣耘,如果是所有的節(jié)點(diǎn),直接輸入 all
即可,如果是一個(gè)或者多個(gè)節(jié)點(diǎn),可以一個(gè)一個(gè)的輸入,最后輸入 done
,我們這里只需要將 7000節(jié)點(diǎn)的上的分出來一些就行,
How many slots do you want to move (from 1 to 16384)? 4000
What is the receiving node ID? 3425f765692f0b8b9c4931c038fae8d86fe6e383
Please 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: 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea
Source node #2: done
還會(huì)再向你確認(rèn)一遍,無誤后輸入 yes
等待分配完成即可。
進(jìn)入 redis-cli
中查看節(jié)點(diǎn):
127.0.0.1:7006> CLUSTER NODES
1793ee70d256fc3ab7ab582b20a9da0c8884e683 127.0.0.1:7004@17004 slave 3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 0 1557985824187 12 connected
08aa7f83a0e69d441f523a5b2758cf42d7b1fe6d 127.0.0.1:7005@17005 slave 07bc00f5b816a612e96ad2fcdc25b4decdc498bd 0 1557985823000 11 connected
4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 127.0.0.1:7000@17000 master - 0 1557985823085 10 connected 12461-16383
07bc00f5b816a612e96ad2fcdc25b4decdc498bd 127.0.0.1:7001@17001 master - 0 1557985823185 11 connected 0-5460
3dc5d7b70542e56f85b0ce74190b4d37e540cdc0 127.0.0.1:7002@17002 master - 0 1557985824586 12 connected 5461-8460
3a5b137a1997d72cdd61fb4cf58de6530a78fbca 127.0.0.1:7003@17003 slave 4c0b7a5b52bf3c4cb61c88f3af7fc73b8db00dea 0 1557985823000 10 connected
3425f765692f0b8b9c4931c038fae8d86fe6e383 127.0.0.1:7006@17006 myself,master - 0 1557985824000 13 connected 8461-12460
7006上已經(jīng)有了分配的slot
添加新節(jié)點(diǎn)為從節(jié)點(diǎn)
添加新節(jié)點(diǎn)比較簡單,這里不做演示,下面貼出主要命令:
# 隨機(jī)指定主服務(wù)器
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave
# 準(zhǔn)確指定主服務(wù)器
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 3425f765692f0b8b9c4931c038fae8d86fe6e383
或
redis 127.0.0.1:7007> cluster replicate 3425f765692f0b8b9c4931c038fae8d86fe6e383
移除節(jié)點(diǎn)
刪除節(jié)點(diǎn)的主要命令 redis-cli --cluster del-node 127.0.0.1:7000 <node-id>
del-node 后第一個(gè)參數(shù)為 集群中任意一個(gè)節(jié)點(diǎn)的ip,第2個(gè)參數(shù)需要移除的節(jié)點(diǎn)的id
需要注意的是,如果刪除主節(jié)點(diǎn)的話,需要先將主節(jié)點(diǎn)中的slot分配出去,否則無法刪除,如下
[root@iZnom30el3gvhxZ cluster]# redis-cli --cluster del-node 127.0.0.1:7000 3425f765692f0b8b9c4931c038fae8d86fe6e383 -a abc
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 3425f765692f0b8b9c4931c038fae8d86fe6e383 from cluster 127.0.0.1:7000
[ERR] Node 127.0.0.1:7006 is not empty! Reshard data away and try again.
執(zhí)行一次 reshard
將7006上的slot 分配出去,這里不做演示,直接貼出成功刪除節(jié)點(diǎn)的回應(yīng):
[root@iZnom30el3gvhxZ cluster]# redis-cli --cluster del-node 127.0.0.1:7000 3425f765692f0b8b9c4931c038fae8d86fe6e383 -a wk123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 3425f765692f0b8b9c4931c038fae8d86fe6e383 from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[root@iZnom30el3gvhxZ cluster]# ps -ef | grep redis
root 8522 1 0 10:16 ? 00:00:32 redis-server *:7000 [cluster]
root 19854 7831 0 14:04 pts/0 00:00:00 grep --color=auto redis
root 26183 1 0 May15 ? 00:01:40 redis-server *:7001 [cluster]
root 26190 1 0 May15 ? 00:01:40 redis-server *:7002 [cluster]
root 26202 1 0 May15 ? 00:01:29 redis-server *:7003 [cluster]
root 26208 1 0 May15 ? 00:01:28 redis-server *:7004 [cluster]
root 26215 1 0 May15 ? 00:01:29 redis-server *:7005 [cluster]
7006節(jié)點(diǎn)以被移除并且下線了以故。
更多詳細(xì)資料參考: