14、Redis集群
在哨兵模式中,仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力。我们知道只有主节点才具有写能力,那如果在一个集群中,能够配置多个主节点,是不是就可以缓解写压力了呢?这个就是redis-cluster集群模式。
Redis-cluster集群概念
(1)由多个Redis服务器组成的分布式网络服务集群;
(2)集群之中有多个Master主节点,每一个主节点都可读可写;
(3)节点之间会互相通信,两两相连;
(4)Redis集群无中心节点。
故障转移
(1) Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。
(2) 集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel。
集群分片策略
(1) Redis-cluster分片策略,是用来解决key存储位置的。
(2) 集群将整个数据库分为16384个槽位slot,所有key-value数据都存储在这些slot中的某一个上。一个slot槽位可以存放多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数。
(3) 集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。
集群redirect转向
(1) 由于Redis集群无中心节点,请求会随机发给任意主节点;
(2) 主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误;
(3) 客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求。
图示:
14.1、Redis集群搭建
步1、规划
Redis集群最少需要6个节点,3主3从,可以分布在一台或者多台主机上。
真集群:6台主机,每台主机的redis服务使用的IP不同,端口号随意,一样不一样都可以
假集群,一台主机,redis服务使用的IP相同,端口号不同
本例子是在一台主机上创建假集群,不同的端口表示不同的redis节点,如下:
主节点: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
步2、创建cluster/700x目录
在REDIS_HOME目录下,创建cluster/700x目录。
# mkdir -p cluster/{7001,7002,7003,7004,7005,7006}
步3、添加配置文件
将redis.conf保存到700x各一份,并修改以下配置:
# cp redis.conf cluster/7001/
配置内容:(其他几个配置文件,根据端口号依次修改)
bind 0.0.0.0
port 7001
daemonize yes
pidfile /var/run/redis_7001.pid
dir "./" # node.conf文件保存路径
logfile "/var/log/redis/7001.log"
appendonly yes
appendfsync always
cluster-enabled yes
cluster-config-file nodes-7001.conf # 该文件中包含集群信息,在生成redis集群时,由redis自动生成,保存到当前目录下
步4、启动每一个节点
开发一个脚本文件,便于一次启动所有节点,启动时,必须要进入700x目录,这样cluster-config-file会自动生成到这个目录下:
start-all.sh
#!/bin/bash
cd ./7001 && app/redis-5.0.5/src/redis-server redis.conf
cd ../7002 && /app/redis-5.0.5/src/redis-server redis.conf
cd ../7003 && /app/redis-5.0.5/src/redis-server redis.conf
cd ../7004 && /app/redis-5.0.5/src/redis-server redis.conf
cd ../7005 && /app/redis-5.0.5/src/redis-server redis.conf
cd ../7006 && /app/redis-5.0.5/src/redis-server redis.conf
cd ..
#chmod +x start-all.sh
启动:
./start-all.sh
查看进程:
[root@server101 7006]# ps -aux | grep redis
root 3053 0.1 0.1 144532 2548 ? Ssl 12:46 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7001 [cluster]
root 3055 0.1 0.1 144532 2548 ? Ssl 12:46 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7002 [cluster]
root 3057 0.1 0.1 144532 2552 ? Ssl 12:46 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7003 [cluster]
root 3059 0.1 0.1 144532 2548 ? Ssl 12:46 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7004 [cluster]
root 3061 0.1 0.1 144532 2552 ? Ssl 12:46 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7005 [cluster]
root 3127 0.0 0.1 144532 2548 ? Ssl 12:48 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7006 [cluster]
使用tree命令,查看创建的文件:
[root@server101 cluster]# tree .
.
├── 7001
│ ├── appendonly.aof
│ ├── nodes-7001.conf
│ └── redis.conf
├── 7002
│ ├── appendonly.aof
│ ├── nodes-7002.conf
│ └── redis.conf
├── 7003
│ ├── appendonly.aof
│ ├── nodes-7003.conf
│ └── redis.conf
├── 7004
│ ├── appendonly.aof
│ ├── nodes-7004.conf
│ └── redis.conf
├── 7005
│ ├── appendonly.aof
│ ├── nodes-7005.conf
│ └── redis.conf
├── 7006
│ ├── appendonly.aof
│ ├── nodes-7006.conf
│ └── redis.conf
└── start-all.sh
停止的脚本stop-all.sh文件:
#!/bin/bash
pgrep redis-server | xargs -exec kill -9
设置可执行:
#chmod +x stop-all.sh
停止后再次启动,不会再次创建node-700x.conf文件,因为之前已经创建:
[root@server101 cluster]# vim stop-all.sh
[root@server101 cluster]# ./stop-all.sh
[root@server101 cluster]# ps -aux | grep redis
root 3188 0.0 0.0 112728 972 pts/1 S+ 12:53 0:00 grep --color=auto redis
[root@server101 cluster]# ./start-all.sh
[root@server101 cluster]# ps -aux | grep redis
root 3191 0.2 0.1 144532 2556 ? Ssl 12:53 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7001 [cluster]
root 3196 0.1 0.1 144532 2556 ? Ssl 12:53 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7002 [cluster]
root 3201 0.1 0.1 144532 2552 ? Ssl 12:53 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7003 [cluster]
root 3206 0.1 0.1 144532 2552 ? Ssl 12:53 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7004 [cluster]
root 3211 0.1 0.1 144532 2552 ? Ssl 12:53 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7005 [cluster]
root 3216 0.1 0.1 144532 2548 ? Ssl 12:53 0:00 /app/redis-5.0.5/src/redis-server 0.0.0.0:7006 [cluster]
步5、执行集群命令
[root@server101 cluster]# /app/redis-5.0.5/src/redis-cli \
> --cluster create \
> 192.168.56.101:7001 192.168.56.101:7002 192.168.56.101:7003 \
> 192.168.56.101:7004 192.168.56.101:7005 192.168.56.101:7006 \
> --cluster-replicas 1
以下是执行的结果:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.56.101:7005 to 192.168.56.101:7001
Adding replica 192.168.56.101:7006 to 192.168.56.101:7002
Adding replica 192.168.56.101:7004 to 192.168.56.101:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: b2d9a70f96e4b382a51b8c0c43d891336e9dda1a 192.168.56.101:7001
slots:[0-5460] (5461 slots) master
M: ca57fd6745a5fb4061169a0c0b885da145f75dfd 192.168.56.101:7002
slots:[5461-10922] (5462 slots) master
M: 4c193abb8928d21a3bb043ed9ee76035fc01b557 192.168.56.101:7003
slots:[10923-16383] (5461 slots) master
S: 170cfc9bd661385575f37dce67e74b2ed84ae4a1 192.168.56.101:7004
replicates ca57fd6745a5fb4061169a0c0b885da145f75dfd
S: cbcb3ff96d650258946514b60274efb6ec3a60d2 192.168.56.101:7005
replicates 4c193abb8928d21a3bb043ed9ee76035fc01b557
S: 67fd36b8dd0db9556a82fec6f7ee839b18919329 192.168.56.101:7006
replicates b2d9a70f96e4b382a51b8c0c43d891336e9dda1a
Can I set the above configuration? (type 'yes' to accept): yes 输入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 192.168.56.101:7001)
M: b2d9a70f96e4b382a51b8c0c43d891336e9dda1a 192.168.56.101:7001
slots:[0-5460] (5461 slots) master 主节点及槽值
1 additional replica(s)
S: 67fd36b8dd0db9556a82fec6f7ee839b18919329 192.168.56.101:7006
slots: (0 slots) slave
replicates b2d9a70f96e4b382a51b8c0c43d891336e9dda1a
S: 170cfc9bd661385575f37dce67e74b2ed84ae4a1 192.168.56.101:7004
slots: (0 slots) slave
replicates ca57fd6745a5fb4061169a0c0b885da145f75dfd
M: 4c193abb8928d21a3bb043ed9ee76035fc01b557 192.168.56.101:7003
slots:[10923-16383] (5461 slots) master 主节点及槽值
1 additional replica(s)
S: cbcb3ff96d650258946514b60274efb6ec3a60d2 192.168.56.101:7005
slots: (0 slots) slave
replicates 4c193abb8928d21a3bb043ed9ee76035fc01b557
M: ca57fd6745a5fb4061169a0c0b885da145f75dfd 192.168.56.101:7002
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.
步6、查看节点信息
查看集群信息,需要添加-c参数。
[root@server101 cluster]# /app/redis-5.0.5/src/redis-cli -h 192.168.56.101 -p 7001 -c cluster nodes
以下是显示的结果信息:
67fd36b8dd0db9556a82fec6f7ee839b18919329 192.168.56.101:7006@17006 slave b2d9a70f96e4b382a51b8c0c43d891336e9dda1a 0 1570337965876 6 connected
170cfc9bd661385575f37dce67e74b2ed84ae4a1 192.168.56.101:7004@17004 slave ca57fd6745a5fb4061169a0c0b885da145f75dfd 0 1570337965000 4 connected
4c193abb8928d21a3bb043ed9ee76035fc01b557 192.168.56.101:7003@17003 master - 0 1570337966958 3 connected 10923-16383
cbcb3ff96d650258946514b60274efb6ec3a60d2 192.168.56.101:7005@17005 slave 4c193abb8928d21a3bb043ed9ee76035fc01b557 0 1570337967965 5 connected
ca57fd6745a5fb4061169a0c0b885da145f75dfd 192.168.56.101:7002@17002 master - 0 1570337966000 2 connected 5461-10922
b2d9a70f96e4b382a51b8c0c43d891336e9dda1a 192.168.56.101:7001@17001 myself,master - 0 1570337967000 1 connected 0-5460
参数说明:
-c:表示以集群方式连接惹redis
-h:指定IP地址
-p:指定端口
cluster nodes:查询集群节点信息
cluster info:查询集群状态信息
[root@server101 cluster]# /app/redis-5.0.5/src/redis-cli -h 192.168.56.101 -p 7001 -c 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:308
cluster_stats_messages_pong_sent:321
cluster_stats_messages_sent:629
cluster_stats_messages_ping_received:316
cluster_stats_messages_pong_received:308
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:629
或使用--cluster check检查状态:
[root@server101 cluster]# /app/redis-5.0.5/src/redis-cli --cluster check 192.168.56.101:7004
192.168.56.101:7003 (4c193abb...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.101:7001 (b2d9a70f...) -> 0 keys | 5461 slots | 1 slaves.
192.168.56.101:7002 (ca57fd67...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.56.101:7004)
S: 170cfc9bd661385575f37dce67e74b2ed84ae4a1 192.168.56.101:7004
slots: (0 slots) slave
replicates ca57fd6745a5fb4061169a0c0b885da145f75dfd
S: cbcb3ff96d650258946514b60274efb6ec3a60d2 192.168.56.101:7005
slots: (0 slots) slave
replicates 4c193abb8928d21a3bb043ed9ee76035fc01b557
S: 67fd36b8dd0db9556a82fec6f7ee839b18919329 192.168.56.101:7006
slots: (0 slots) slave
replicates b2d9a70f96e4b382a51b8c0c43d891336e9dda1a
M: 4c193abb8928d21a3bb043ed9ee76035fc01b557 192.168.56.101:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: b2d9a70f96e4b382a51b8c0c43d891336e9dda1a 192.168.56.101:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: ca57fd6745a5fb4061169a0c0b885da145f75dfd 192.168.56.101:7002
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.
步7、操作测试
注意跳转:
[root@server101 cluster]# /app/redis-5.0.5/src/redis-cli -h 192.168.56.101 -p 7001 -c
192.168.56.101:7001> set k1 v1
-> Redirected to slot [12706] located at 192.168.56.101:7003
OK
192.168.56.101:7003> set k2 v2
-> Redirected to slot [449] located at 192.168.56.101:7001
OK
192.168.56.101:7001> set k3 v3
OK
步8、Java代码连接
注意,只有在创建集群时,指定的ip地址为:192.168.56.101才可以实现远程连接,如果指定的是127.0.0.1,则会连接失败。出现:Too many Cluster redirections。
以下是连接成功的代码:
@Testpublic void testCluster1() throws Exception {
Set<HostAndPort> sets = new HashSet<>();
sets.add(new HostAndPort("192.168.56.101", 7001));
sets.add(new HostAndPort("192.168.56.101", 7002));
sets.add(new HostAndPort("192.168.56.101", 7003));
sets.add(new HostAndPort("192.168.56.101", 7004));
sets.add(new HostAndPort("192.168.56.101", 7005));
sets.add(new HostAndPort("192.168.56.101", 7006));
JedisCluster cluster = new JedisCluster(sets);
String str = cluster.set("k7", "v7");
System.err.println("str is:" + str); cluster.close();
}
步9、spring配置
spring Redis 集群连接:
<bean id="pool" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="30"/>
<property name="maxIdle" value="10"/>
</bean>
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg index="0">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg value="192.168.56.101"/>
<constructor-arg value="7001"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg value="192.168.56.101"/>
<constructor-arg value="7002"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg value="192.168.56.101"/>
<constructor-arg value="7003"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg value="192.168.56.101"/>
<constructor-arg value="7004"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg value="192.168.56.101"/>
<constructor-arg value="7005"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg value="192.168.56.101"/>
<constructor-arg value="7006"/>
</bean>
</set>
</constructor-arg>
<constructor-arg index="1" ref="pool"></constructor-arg>
</bean>
测试:
@Slf4j@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = { "classpath:spring/spring-redis-cluster.xml" })
public class Demo06_Cluster {
@Autowired
private JedisCluster jedisCluster;
@Test
public void testCluster() throws Exception{
String str = jedisCluster.get("k7");//输出k7对应的value值,成功。
System.err.println(str);
}
}
14.2、更多配置
添加新主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
hash槽重新分配
添加完新节点后,需要对新添加的主节点进行hash槽重新分配,这样该主节点才能存储数据,redis共有16384个槽。
redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes
添加新从节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
删除节点
redis-cli --cluster del-node host:port node_id
示例
# 创建集群
redis-cli --cluster create host1:port1 ... hostN:portN --cluster-replicas <arg>
# 例子
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
# 例子说明
host1:port1 ... hostN:portN表示的是要添加的集群的节点IP和端口,
--cluster-replicas <arg>表示的是主从节点比例,参数1表示前三个是主节点,后三个是从节点
也就是说7001,7002,7003端口对应的节点是主节点,7004,7005,7006对应的节点是从节点
# 查询集群节点信息
redis-cli -c -p 7001 cluster nodes
7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564923261350 4 connected
bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564923263366 3 connected 10923-16383
456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564923262000 5 connected
5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564923260000 6 connected
4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564923263000 1 connected 0-5460
59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564923262358 2 connected 5461-10922
# 说明:以下的操作均是以上面这个为参数示例
# 给集群添加一个新主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
# 例子
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7003 --cluster-master-id bbe8b7035bfd31c47bec7d612acc112cd2869368
# 例子说明
new_host:new_port为要新添加的主节点IP和端口,此处是127.0.0.1:7007
existing_host:existing_port表示的是已存在的最后一个主节点的IP和端口,这个可以从上述的节点信息中查看到,根据slots槽数,7003端口对应的节点槽数是10923-16383,16383表示的是最后的槽数
--cluster-master-id表示的是最后一个主节点的节点id,表示的是新添加的主节点要在这个节点后面
# 再次查看集群信息
redis-cli -c -p 7001 cluster nodes
7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564923261350 4 connected
bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564923263366 3 connected 10923-16383
7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564923260344 0 connected
456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564923262000 5 connected
5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564923260000 6 connected
4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564923263000 1 connected 0-5460
59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564923262358 2 connected 5461-10922
# 会发现7007端口对应的节点已经加入到集群中,是主节点,但是没有从节点,也没有分配槽数
# 给新添加的主节点分配slots槽数
redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots 500 --cluster-yes
# 例子
redis-cli --cluster reshard 127.0.0.1:7007 --cluster-from 4dad696ede24995a57c5fd790faa95c72c187a22 --cluster-to 7020c8df9423686727783c60bd2f0e367634ba84 --cluster-slots 500
# 例子说明
host:port表示的是新添加的那个主节点IP和端口,此处表示的是127.0.0.1:7007
--cluster-from node_id表示的是集群第一个主节点的节点id,这个可以现有集群的slots槽数分配看出,此处表示的是7001端口对应的节点
--cluster-to node_id表示的是集群最后一个主节点的节点id,也就是新添加的那个主节点id,此处表示的是7007端口对应的节点
--cluster-slots 500表示的是给新主节点分配多少,此处500表示是分配从0-499个slots槽数,若不加上这个会让手动输入
--cluster-yes表示的是自动应答为yes,若不加上这个会让手动输入yes,表示同意此次分配
# 再次查看集群信息
/redis-cli -c -p 7001 cluster nodes 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564924042000 4 connected
bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564924042157 3 connected 10923-16383
7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564924040140 7 connected 0-499
456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564924040000 5 connected
5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564924041149 6 connected
4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564924040000 1 connected 500-5460
59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564924043166 2 connected 5461-10922
# 会发现7007端口对应的主节点已经有slots槽数了,并且是从0开始的
# 给集群中某个主节点再添加一个从节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
# 例子
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7008 --cluster-slave --cluster-master-id 7020c8df9423686727783c60bd2f0e367634ba84
# 例子说明
new_host:new_port表示的是要添加的那个从节点的IP和端口,此处表示的是127.0.0.1:7008
existing_host:existing_port表示的是要给哪个主节点添加从节点,此处表示的是127.0.0.1:7007
--cluster-slave表示的是要添加从节点,否则则是添加主节点了
--cluster-master-id node_id表示要给哪个主节点添加从节点的该主节点节点id
# 再次查看集群信息
redis-cli -c -p 7001 cluster nodes 7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564924845000 7 connected 0-499
4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564924843000 1 connected 500-5460
5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564924845214 6 connected
7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564924843195 4 connected
bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564924844205 3 connected 10923-16383
456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564924845000 5 connected
415db07121ba946b202bca98e15cbdffc60bc18a 127.0.0.1:7008@17008 slave 7020c8df9423686727783c60bd2f0e367634ba84 0 1564924846224 7 connected
c3e04f0e8710c25d59703374a224ee8bec776e43 :0@0 master,fail,noaddr - 1564924804548 1564924802833 0 disconnected
59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564924844000 2 connected 5461-10922
# 会发现7008端口对应的节点已经是7007端口对应的从节点
# 从集群中删除一个从节点
redis-cli --cluster del-node host:port node_id
# 例子
redis-cli --cluster del-node 127.0.0.1:7008 415db07121ba946b202bca98e15cbdffc60bc18a
# 例子说明
host:port表示的是要删除的那个节点的IP和端口,此处是127.0.0.1:7008
node_id表示的是删除的那个节点的节点id
参考:https://www.cnblogs.com/sanduzxcvbnm/p/11300942.html