Redis從入門到精通(八怠噪、Redis 集群)

此篇介紹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-clusterutils/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ì)資料參考:

Redis Cluster 官方文檔
Redis Cluster進(jìn)階 官方文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜗细,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炉媒,老刑警劉巖踪区,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吊骤,居然都是意外死亡缎岗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門白粉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來传泊,“玉大人,你說我怎么就攤上這事鸭巴【煜福” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵鹃祖,是天一觀的道長溪椎。 經(jīng)常有香客問我,道長恬口,這世上最難降的妖魔是什么校读? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮楷兽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘华临。我一直安慰自己芯杀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布雅潭。 她就那樣靜靜地躺著揭厚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扶供。 梳的紋絲不亂的頭發(fā)上筛圆,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音椿浓,去河邊找鬼太援。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扳碍,可吹牛的內(nèi)容都是我干的提岔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼笋敞,長吁一口氣:“原來是場噩夢啊……” “哼碱蒙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赛惩,失蹤者是張志新(化名)和其女友劉穎哀墓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喷兼,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篮绰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褒搔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阶牍。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖星瘾,靈堂內(nèi)的尸體忽然破棺而出走孽,到底是詐尸還是另有隱情,我是刑警寧澤琳状,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布磕瓷,位于F島的核電站,受9級特大地震影響念逞,放射性物質(zhì)發(fā)生泄漏困食。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一翎承、第九天 我趴在偏房一處隱蔽的房頂上張望硕盹。 院中可真熱鬧,春花似錦叨咖、人聲如沸瘩例。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垛贤。三九已至,卻和暖如春趣倾,著一層夾襖步出監(jiān)牢的瞬間聘惦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工儒恋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留善绎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓诫尽,卻偏偏與公主長得像涂邀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子箱锐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • redis集群分為服務(wù)端集群和客戶端分片比勉,redis3.0以上版本實(shí)現(xiàn)了集群機(jī)制,即服務(wù)端集群,3.0以下使用客戶...
    hadoop_null閱讀 1,591評論 0 6
  • 轉(zhuǎn)自:https://www.zybuluo.com/phper/note/195558 前言 redis 是我們...
    yannhuang閱讀 1,684評論 0 2
  • 前言 Redis 是我們目前大規(guī)模使用的緩存中間件,由于它強(qiáng)大高效而又便捷的功能衣洁,得到了廣泛的使用墓捻。單節(jié)點(diǎn)的Red...
    Kevin_ZGJ閱讀 11,685評論 19 133
  • 思維導(dǎo)圖是個(gè)老朋友了,在工作中梳理思路發(fā)揮了很大作用坊夫。很多能力是需要日積月累的砖第,比如我做新媒體運(yùn)營,每天要看朋友圈...
    拉面的第二人生閱讀 484評論 0 51
  • 我环凿,一顆緩慢的子彈穿過城市的彈夾 從街頭到街尾梧兼,需要橫跨一條不記名的小橋 我不會(huì)在石墩上刻下永垂不朽的印痕 即便那...
    文學(xué)壞女孩閱讀 233評論 0 0