Redis安装
1 编译和安装所需的包:
yum install gcc tcl
2 解压Redis(此处须自行去官网下载Redis安装包,并上传到服务器)
mkdir /home/App
cd /home/App
tar zxf redis-5.0.7.tar.gz
3 进入Redis所在文件夹
cd redis-5.0.7
4 编译安装Redis
make
make install PREFIX=/opt/redis/redis-5.0.7
5 安装完成后,可以看到/opt/redis/redis-5.0.7目录下有一个bin目录,bin目录里就是redis的命令脚本:
cd /opt/redis/redis-5.0.7/bin
redis-benchmark redis-check-aof redis-check-rdb redis-cli
redis-sentinel redis-server
6 从redis源码里面复制一份配置文件 redis.conf
mkdir /opt/redis/redis-5.0.7/conf
cp /home/App/redis-5.0.7/redis.conf /opt/redis/redis-5.0.7/conf/redis_3679.conf
7 把redis的命令脚本全部复制一份到 /usr/local/bin 环境变量下面
cp /opt/redis/redis-5.0.7/bin/redis-* /usr/local/bin
8 修改 redis.conf 文件改为后台守护进程
vim /opt/redis/redis-5.0.7/conf/redis.conf
daemonize yes # 改 no 为 yes
9 这是可以启动redis了
redis-server /opt/redis/redis-5.0.7/conf/redis_3679.conf
10 可以看到redis启动成功了
[root@localhost /]# redis-server /opt/redis/redis-5.0.7/conf/redis.conf
5665:C 05 Jan 2020 20:42:09.047 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5665:C 05 Jan 2020 20:42:09.047 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=5665, just started
5665:C 05 Jan 2020 20:42:09.047 # Configuration loaded
[root@localhost /]# ps aux|grep redis
root 5666 0.0 0.7 153900 7592 ? Ssl 20:42 0:00 redis-server 127.0.0.1:6379
root 5672 0.0 0.0 112712 960 pts/0 R+ 20:42 0:00 grep --color=auto redis
[root@localhost /]#
搭建 Redis-Cluster 集群模式
1、redis-cluster
A、采用去中心化的思想,没有中心节点的说法,它使用hash slot方式将16348个hash slot覆盖到所有节点上,对于存储的每个key值,使用CRC16(KEY)&16348=slot得到他对应的hash slot,
并在访问key的时候就去找他的hash slot在哪一个节点上,然后由当前访问节点从实际被分配了这个hash slot的节点去取数据,节点之间使用轻量协议通信 减少带宽占用 性能很高,
自动实现负载均衡与高可用,自动实现failover并且支持动态扩展。
B、其内部中也需要配置主从,并且内部也是采用哨兵模式,如果有半数节点发现某个异常节点,共同决定更改异常节点的状态,如果改节点是主节点,则对应的从节点自动顶替为主节点,当原先的主节点上线后,则会变为从节点。
如果集群中的master没有slave节点,则master挂掉后整个集群就会进入fail状态,因为集群的slot映射不完整。如果集群超过半数以上的master挂掉,无论是否有slave,集群都会进入fail状态。
C、根据官方推荐 集群部署至少要3台以上的master节点
2、集群配置
1、首先创建 cluster PID 的文件目录
mkdir -p /opt/redis/redis-5.0.7/pid
2、首先创建 cluster 的配置文件和目录
mkdir -p /opt/redis/redis-5.0.7/redis-cluster/6381/{conf,logs,data}
mkdir -p /opt/redis/redis-5.0.7/redis-cluster/6382/{conf,logs,data}
mkdir -p /opt/redis/redis-5.0.7/redis-cluster/6383/{conf,logs,data}
mkdir -p /opt/redis/redis-5.0.7/redis-cluster/6384/{conf,logs,data}
mkdir -p /opt/redis/redis-5.0.7/redis-cluster/6385/{conf,logs,data}
mkdir -p /opt/redis/redis-5.0.7/redis-cluster/6386/{conf,logs,data}
3、修改redis_6381.conf
cd /opt/redis/redis-5.0.7/redis-cluster/6381/conf/
vim redis_6381.conf
################################## NETWORK #####################################
#bind 127.0.0.1
protected-mode no
port 6381
################################# GENERAL #####################################
daemonize yes
pidfile "/opt/redis/redis-5.0.7/pid/redis_6381.pid"
logfile "/opt/redis/redis-5.0.7/redis-cluster/6381/logs/redis.log"
################################ SNAPSHOTTING ################################
dir "/opt/redis/redis-5.0.7/redis-cluster/6381/data"
################################ REDIS CLUSTER ###############################
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 15000
################################## SECURITY ###################################
# master 应答密码
requirepass "kkj56"
# slave 请求密码
masterauth "kkj56"
4、修改其它redis.conf
port 638x
pidfile "/opt/redis/redis-5.0.7/pid/redis_638x.pid"
logfile "/opt/redis/redis-5.0.7/redis-cluster/638x/logs/redis.log"
dir "/opt/redis/redis-5.0.7/redis-cluster/638x/data"
cluster-config-file nodes-638x.conf
3、集群启动
1、使用redis-server /opt/redis/redis-5.0.7/redis-cluster/6381/conf/redis_6381.conf …将所有节点启动
[root@localhost redis-cluster]# redis-server /opt/redis/redis-5.0.7/redis-cluster/6381/conf/redis_6381.conf
[root@localhost redis-cluster]# redis-server /opt/redis/redis-5.0.7/redis-cluster/6382/conf/redis_6382.conf
[root@localhost redis-cluster]# redis-server /opt/redis/redis-5.0.7/redis-cluster/6383/conf/redis_6383.conf
[root@localhost redis-cluster]# redis-server /opt/redis/redis-5.0.7/redis-cluster/6384/conf/redis_6384.conf
[root@localhost redis-cluster]# redis-server /opt/redis/redis-5.0.7/redis-cluster/6385/conf/redis_6385.conf
[root@localhost redis-cluster]# redis-server /opt/redis/redis-5.0.7/redis-cluster/6386/conf/redis_6386.conf
[root@localhost redis-cluster]# ps -ef|grep redis
root 5651 1 0 Jul05 ? 00:00:06 redis-server 127.0.0.1:6379
root 16595 1 0 01:54 ? 00:00:00 redis-server *:6381 [cluster]
root 16600 1 0 01:54 ? 00:00:00 redis-server *:6382 [cluster]
root 16605 1 0 01:54 ? 00:00:00 redis-server *:6383 [cluster]
root 16610 1 0 01:54 ? 00:00:00 redis-server *:6384 [cluster]
root 16615 1 0 01:54 ? 00:00:00 redis-server *:6385 [cluster]
root 16620 1 0 01:55 ? 00:00:00 redis-server *:6386 [cluster]
root 16625 1284 0 01:55 pts/0 00:00:00 grep --color=auto redis
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
2、启动后我们就可以创建集群啦
注意:在redis5.0后 创建集群统一使用redis-cli,之前的版本使用redis-trib.rb,但是需要安装ruby软件相对复杂,相比之前的版本5.0不需要安装额外的软件,方便。具体的可以参照redis官方网站查看 https://redis.io/topics/cluster-tutorial
创建集群命令:其中 cluster-replicas 1 代表 一个master后有几个slave,1代表为1个slave节点
启动命令
redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1 -a kkj56
过程中会提示以下内容,输入 yes 继续;
Can I set the above configuration? (type ‘yes’ to accept): yes
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
[root@localhost redis-cluster]# redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1 -a kkj56
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:6385 to 127.0.0.1:6381
Adding replica 127.0.0.1:6386 to 127.0.0.1:6382
Adding replica 127.0.0.1:6384 to 127.0.0.1:6383
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 8ae64708a468e5f2295439bf5e9a006dce89a157 127.0.0.1:6381
slots:[0-5460] (5461 slots) master
M: a833df807bb3611cc90b74f55c9c3ce816edf3dd 127.0.0.1:6382
slots:[5461-10922] (5462 slots) master
M: ab26d01601dc53ecfa95b7fa3048301c12b03937 127.0.0.1:6383
slots:[10923-16383] (5461 slots) master
S: c79b9500f9e73fd7816291379da2bf789221b17f 127.0.0.1:6384
replicates a833df807bb3611cc90b74f55c9c3ce816edf3dd
S: 5501bac393b1af4371cf8a77b0c997ff7a938ee2 127.0.0.1:6385
replicates ab26d01601dc53ecfa95b7fa3048301c12b03937
S: f2af0861ad417a925ef6cece83af7f75641e18a2 127.0.0.1:6386
replicates 8ae64708a468e5f2295439bf5e9a006dce89a157
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:6381)
M: 8ae64708a468e5f2295439bf5e9a006dce89a157 127.0.0.1:6381
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: a833df807bb3611cc90b74f55c9c3ce816edf3dd 127.0.0.1:6382
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 5501bac393b1af4371cf8a77b0c997ff7a938ee2 127.0.0.1:6385
slots: (0 slots) slave
replicates ab26d01601dc53ecfa95b7fa3048301c12b03937
S: f2af0861ad417a925ef6cece83af7f75641e18a2 127.0.0.1:6386
slots: (0 slots) slave
replicates 8ae64708a468e5f2295439bf5e9a006dce89a157
S: c79b9500f9e73fd7816291379da2bf789221b17f 127.0.0.1:6384
slots: (0 slots) slave
replicates a833df807bb3611cc90b74f55c9c3ce816edf3dd
M: ab26d01601dc53ecfa95b7fa3048301c12b03937 127.0.0.1:6383
slots:[10923-16383] (5461 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.
[root@localhost redis-cluster]#
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
3、验证集群是否创建成功
首先查看一下主从配对情况
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
[root@localhost redis-cluster]# redis-cli -c -p 6381 -a kkj56
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6381> cluster nodes
a833df807bb3611cc90b74f55c9c3ce816edf3dd 127.0.0.1:6382@16382 master - 0 1593972114889 2 connected 5461-10922
5501bac393b1af4371cf8a77b0c997ff7a938ee2 127.0.0.1:6385@16385 slave ab26d01601dc53ecfa95b7fa3048301c12b03937 0 1593972114000 5 connected
f2af0861ad417a925ef6cece83af7f75641e18a2 127.0.0.1:6386@16386 slave 8ae64708a468e5f2295439bf5e9a006dce89a157 0 1593972112000 6 connected
8ae64708a468e5f2295439bf5e9a006dce89a157 127.0.0.1:6381@16381 myself,master - 0 1593972111000 1 connected 0-5460
c79b9500f9e73fd7816291379da2bf789221b17f 127.0.0.1:6384@16384 slave a833df807bb3611cc90b74f55c9c3ce816edf3dd 0 1593972113000 4 connected
ab26d01601dc53ecfa95b7fa3048301c12b03937 127.0.0.1:6383@16383 master - 0 1593972113874 3 connected 10923-16383
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
执行 :redis-cli -c -p 6381 -a kkj56
数据自动分配到1002节点,连接也转移到1002 节点
127.0.0.1:6381> set name kkj
-> Redirected to slot [5798] located at 127.0.0.1:6382
OK
127.0.0.1:6382> get name
"kkj"
127.0.0.1:6382> keys *
1) "name"
127.0.0.1:6382> set age 18
-> Redirected to slot [741] located at 127.0.0.1:6381
OK
127.0.0.1:6381> keys *
1) "age"
127.0.0.1:6381> get name
-> Redirected to slot [5798] located at 127.0.0.1:6382
"kkj"
127.0.0.1:6382>
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
4、验证故障转移
结论是主节点故障后,下挂从节点会升级成主节点,并接替主节点的槽位。旧主节点上线后,也只能作为其从节点。
kill 掉1001 ,发现其从节点1004转为了master
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
[root@localhost redis-5.0.7]# ps -ef|grep redis
root 5651 1 0 Jul05 ? 00:00:09 redis-server 127.0.0.1:6379
root 16595 1 0 01:54 ? 00:00:03 redis-server *:6381 [cluster]
root 16600 1 0 01:54 ? 00:00:03 redis-server *:6382 [cluster]
root 16605 1 0 01:54 ? 00:00:03 redis-server *:6383 [cluster]
root 16610 1 0 01:54 ? 00:00:04 redis-server *:6384 [cluster]
root 16615 1 0 01:54 ? 00:00:04 redis-server *:6385 [cluster]
root 16620 1 0 01:55 ? 00:00:04 redis-server *:6386 [cluster]
root 16641 1284 0 02:01 pts/0 00:00:00 redis-cli -c -p 6381 -a kkj56
root 16659 5618 0 02:56 pts/1 00:00:00 grep --color=auto redis
[root@localhost redis-5.0.7]# kill -9 16595
[root@localhost redis-5.0.7]#
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
6381关闭服务后,6386从 slave 升级成 master
get age后切换到6386
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
[root@localhost redis-5.0.7]# redis-cli -c -p 6382 -a kkj56
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6382> cluster nodes
ab26d01601dc53ecfa95b7fa3048301c12b03937 127.0.0.1:6383@16383 master - 0 1593976348475 3 connected 10923-16383
8ae64708a468e5f2295439bf5e9a006dce89a157 127.0.0.1:6381@16381 master,fail - 1593976317075 1593976314000 1 disconnected
5501bac393b1af4371cf8a77b0c997ff7a938ee2 127.0.0.1:6385@16385 slave ab26d01601dc53ecfa95b7fa3048301c12b03937 0 1593976345000 5 connected
f2af0861ad417a925ef6cece83af7f75641e18a2 127.0.0.1:6386@16386 master - 0 1593976347000 8 connected 0-5460
c79b9500f9e73fd7816291379da2bf789221b17f 127.0.0.1:6384@16384 slave a833df807bb3611cc90b74f55c9c3ce816edf3dd 0 1593976347460 4 connected
a833df807bb3611cc90b74f55c9c3ce816edf3dd 127.0.0.1:6382@16382 myself,master - 0 1593976347000 2 connected 5461-10922
127.0.0.1:6382> get age
-> Redirected to slot [741] located at 127.0.0.1:6386
"18"
127.0.0.1:6386>
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
重新启动6381,其变成slave节点
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
[root@localhost redis-cluster]# redis-server /opt/redis/redis-5.0.7/redis-cluster/6381/conf/redis_6381.conf
127.0.0.1:6386> cluster nodes
5501bac393b1af4371cf8a77b0c997ff7a938ee2 127.0.0.1:6385@16385 slave ab26d01601dc53ecfa95b7fa3048301c12b03937 0 1593976654000 5 connected
f2af0861ad417a925ef6cece83af7f75641e18a2 127.0.0.1:6386@16386 myself,master - 0 1593976655000 8 connected 0-5460
a833df807bb3611cc90b74f55c9c3ce816edf3dd 127.0.0.1:6382@16382 master - 0 1593976654043 2 connected 5461-10922
8ae64708a468e5f2295439bf5e9a006dce89a157 127.0.0.1:6381@16381 slave f2af0861ad417a925ef6cece83af7f75641e18a2 0 1593976652000 8 connected
ab26d01601dc53ecfa95b7fa3048301c12b03937 127.0.0.1:6383@16383 master - 0 1593976655058 3 connected 10923-16383
c79b9500f9e73fd7816291379da2bf789221b17f 127.0.0.1:6384@16384 slave a833df807bb3611cc90b74f55c9c3ce816edf3dd 0 1593976656073 4 connected
127.0.0.1:6386>
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
4、Redis-Cluster 增加新节点
1.增加1个master 和 1个slave
cp -R 6381 6387
cp -R 6381 6388
注意要清空 6387/data 和 6388/data里面的数据
[root@localhost redis-cluster]# cp -R 6381 6387
[root@localhost redis-cluster]# cp -R 6381 6388
[root@localhost redis-cluster]# pwd
/opt/redis/redis-5.0.7/redis-cluster
[root@localhost redis-cluster]# ls
6381 6382 6383 6384 6385 6386 6387 6388
[root@localhost redis-cluster]#
[root@localhost redis-cluster]# mv 6387/conf/redis_6381.conf 6387/conf/redis_6387.conf
[root@localhost redis-cluster]# mv 6388/conf/redis_6381.conf 6388/conf/redis_6388.conf
[root@localhost redis-cluster]# cd 6387/data/
[root@localhost data]# rm -rf *
[root@localhost redis-cluster]# cd ../../6388/data/
[root@localhost data]# rm -rf *
修改配置文件
vim redis_638x.conf
port 638x
pidfile "/opt/redis/redis-5.0.7/pid/redis_638x.pid"
logfile "/opt/redis/redis-5.0.7/redis-cluster/638x/logs/redis.log"
dir "/opt/redis/redis-5.0.7/redis-cluster/638x/data"
cluster-config-file nodes-638x.conf
启动新增加的2个redis 实例
redis-server /opt/redis/redis-5.0.7/redis-cluster/6387/conf/redis_6387.conf
redis-server /opt/redis/redis-5.0.7/redis-cluster/6388/conf/redis_6388.conf
实例启动了,但是没有增加新的节点
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
[root@localhost redis-cluster]# ps -ef|grep redis
root 5651 1 0 Jul05 ? 00:00:14 redis-server 127.0.0.1:6379
root 16693 1 0 03:09 ? 00:00:04 redis-server *:6382 [cluster]
root 16698 1 0 03:10 ? 00:00:04 redis-server *:6383 [cluster]
root 16704 1 0 03:10 ? 00:00:03 redis-server *:6384 [cluster]
root 16710 1 0 03:10 ? 00:00:03 redis-server *:6385 [cluster]
root 16716 1 0 03:10 ? 00:00:04 redis-server *:6386 [cluster]
root 16724 5618 0 03:12 pts/1 00:00:00 redis-cli -c -p 6382 -a kkj56
root 16727 1 0 03:17 ? 00:00:03 redis-server *:6381 [cluster]
root 16775 1 0 04:37 ? 00:00:00 redis-server *:6387 [cluster]
root 16780 1 0 04:37 ? 00:00:00 redis-server *:6388 [cluster]
root 16785 1284 0 04:39 pts/0 00:00:00 grep --color=auto redis
127.0.0.1:6386> cluster nodes
5501bac393b1af4371cf8a77b0c997ff7a938ee2 127.0.0.1:6385@16385 slave ab26d01601dc53ecfa95b7fa3048301c12b03937 0 1593981604000 5 connected
f2af0861ad417a925ef6cece83af7f75641e18a2 127.0.0.1:6386@16386 myself,master - 0 1593981605000 8 connected 0-5460
a833df807bb3611cc90b74f55c9c3ce816edf3dd 127.0.0.1:6382@16382 master - 0 1593981604124 2 connected 5461-10922
8ae64708a468e5f2295439bf5e9a006dce89a157 127.0.0.1:6381@16381 slave f2af0861ad417a925ef6cece83af7f75641e18a2 0 1593981607193 8 connected
ab26d01601dc53ecfa95b7fa3048301c12b03937 127.0.0.1:6383@16383 master - 0 1593981608217 3 connected 10923-16383
c79b9500f9e73fd7816291379da2bf789221b17f 127.0.0.1:6384@16384 slave a833df807bb3611cc90b74f55c9c3ce816edf3dd 0 1593981606175 4 connected
127.0.0.1:6386>
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
把新节点添加到集群6382里去
注:新节点里数据必须为空
redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6382 -a kkj56
注意语法,一个新节点IP:端口 空格 一个旧节点IP:端口,-a 请求密码
注意点是:
1.不能多个新节点一次性添加
2.新节点后是旧节点
3.如果设置--cluster-slave,新节点挂在旧节点下的一个从节点
4.如果设置 --cluster-master-id <arg> ,arg设置旧节点的id,具体可以使用cluster nodes查看各个节点的id
add-node new_host:new_port existing_host:existing_port
--cluster-slave
--cluster-master-id <arg>
(1)添加master节点
redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6382 -a kkj56
(2)添加与master对应slave节点
redis-cli --cluster add-node 127.0.0.1:6388 127.0.0.1:6387 --cluster-slave -a kkj56
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6382 -a kkj56
[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:6387 to make it join the cluster.
[OK] New node added correctly.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
redis-cli --cluster add-node 127.0.0.1:6388 127.0.0.1:6387 --cluster-slave -a kkj56
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Automatically selected master 127.0.0.1:6387
>>> Send CLUSTER MEET to node 127.0.0.1:6388 to make it join the cluster.
Waiting for the cluster to join
>>> Configure node as replica of 127.0.0.1:6387.
[OK] New node added correctly.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
redis-cli -c -p 6382 -a kkj56
127.0.0.1:6382> cluster nodes
ab26d01601dc53ecfa95b7fa3048301c12b03937 127.0.0.1:6383@16383 master - 0 1593982694573 3 connected 10923-16383
8ae64708a468e5f2295439bf5e9a006dce89a157 127.0.0.1:6381@16381 slave f2af0861ad417a925ef6cece83af7f75641e18a2 0 1593982693000 8 connected
5501bac393b1af4371cf8a77b0c997ff7a938ee2 127.0.0.1:6385@16385 slave ab26d01601dc53ecfa95b7fa3048301c12b03937 0 1593982693000 5 connected
f2af0861ad417a925ef6cece83af7f75641e18a2 127.0.0.1:6386@16386 master - 0 1593982693551 8 connected 0-5460
c79b9500f9e73fd7816291379da2bf789221b17f 127.0.0.1:6384@16384 slave a833df807bb3611cc90b74f55c9c3ce816edf3dd 0 1593982695593 4 connected
768b441d35efdf699899ef9f11102189e51c79a9 127.0.0.1:6388@16388 slave 9d2f277017f6ec13e66908f2ed61c84e8f77ad38 0 1593984354121 0 connected
9d2f277017f6ec13e66908f2ed61c84e8f77ad38 127.0.0.1:6387@16387 master - 0 1593982693000 0 connected
a833df807bb3611cc90b74f55c9c3ce816edf3dd 127.0.0.1:6382@16382 myself,master - 0 1593982694000 2 connected 5461-10922
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
2.这里是将节点加入了集群中,但是并没有分配slot,所以这个节点并没有真正的开始分担集群工作。
分配slot
redis-cli --cluster reshard 127.0.0.1:6382 --cluster-from a833df807bb3611cc90b74f55c9c3ce816edf3dd,ab26d01601dc53ecfa95b7fa3048301c12b03937,f2af0861ad417a925ef6cece83af7f75641e18a2 --cluster-to 9d2f277017f6ec13e66908f2ed61c84e8f77ad38 --cluster-slots 1024
–cluster-from:表示slot目前所在的节点的node ID,多个ID用逗号分隔
–cluster-to:表示需要新分配节点的node ID(貌似每次只能分配一个)
–cluster-slots:分配的slot数量
或者
redis-cli --cluster reshard 127.0.0.1:6382
[root@master1 ~]# redis-cli --cluster reshard 127.0.0.1:6382
How many slots do you want to move (from 1 to 16384)? 4096 #要迁移多少个槽
What is the receiving node ID? c561fee83d143a3c93e9277b4cb559ce5567f21c #迁移到master4节点
//注意:输入master4的IDS值
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.
#要求输入源节点的ids值,这里输入6382、6383、6386三个节点,输入done表示结束
Source node #1: a833df807bb3611cc90b74f55c9c3ce816edf3dd
Source node #2: ab26d01601dc53ecfa95b7fa3048301c12b03937
Source node #3: f2af0861ad417a925ef6cece83af7f75641e18a2
Source node #4: done #只有三个master,此处输入done
//稍等片刻。
最后会有一个迁移方案,输入yes表示同意,迁移开始。输入no表示不同意,重新设置迁移方案。
3、确认是否迁移成功
[root@localhost ~]# redis-cli -h 127.0.0.1 -p 6382 -a kkj56
127.0.0.1:6382> cluster nodes
ab26d01601dc53ecfa95b7fa3048301c12b03937 127.0.0.1:6383@16383 master - 0 1593985158560 3 connected 12288-16383
8ae64708a468e5f2295439bf5e9a006dce89a157 127.0.0.1:6381@16381 slave f2af0861ad417a925ef6cece83af7f75641e18a2 0 1593985156000 8 connected
5501bac393b1af4371cf8a77b0c997ff7a938ee2 127.0.0.1:6385@16385 slave ab26d01601dc53ecfa95b7fa3048301c12b03937 0 1593985155538 5 connected
f2af0861ad417a925ef6cece83af7f75641e18a2 127.0.0.1:6386@16386 master - 0 1593985156000 8 connected 1365-5460
768b441d35efdf699899ef9f11102189e51c79a9 127.0.0.1:6388@16388 slave 9d2f277017f6ec13e66908f2ed61c84e8f77ad38 0 1593985156545 11 connected
c79b9500f9e73fd7816291379da2bf789221b17f 127.0.0.1:6384@16384 slave a833df807bb3611cc90b74f55c9c3ce816edf3dd 0 1593985156000 4 connected
9d2f277017f6ec13e66908f2ed61c84e8f77ad38 127.0.0.1:6387@16387 master - 0 1593985157551 11 connected 0-1364 5461-6826 10923-12287
a833df807bb3611cc90b74f55c9c3ce816edf3dd 127.0.0.1:6382@16382 myself,master - 0 1593985157000 2 connected 6827-10922
4、收缩集群
下线节点127.0.0.1:6387(master)/127.0.0.1:6388(slave)
(1)首先删除master对应的slave
redis-cli --cluster del-node 127.0.0.1:6388 768b441d35efdf699899ef9f11102189e51c79a9 -a kkj56
del-node后面跟着slave节点的 ip:port 和node ID
(2)清空master的slot
redis-cli --cluster reshard 127.0.0.1:6387 --cluster-from 9d2f277017f6ec13e66908f2ed61c84e8f77ad38 --cluster-to 2846540d8284538096f111a8ce7cf01c50199237 --cluster-slots 1024 --cluster-yes
reshard子命令前面已经介绍过了,这里需要注意的一点是,由于我们的集群一共有四个主节点,而每次reshard只能写一个目的节点,因此以上命令需要执行三次(--cluster-to对应不同的目的节点)。
--cluster-yes:不回显需要迁移的slot,直接迁移。
(3)下线(删除)节点
redis-cli --cluster del-node 127.0.0.1:6388 221cc0196ed07f972e4393a6a4ee4db4704b1ad1
[root@localhost ~]# redis-cli --cluster del-node 127.0.0.1:6388 221cc0196ed07f972e4393a6a4ee4db4704b1ad1 -a kkj56
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 221cc0196ed07f972e4393a6a4ee4db4704b1ad1 from cluster 127.0.0.1:6388
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.