Redis-cluster 分布式集群搭建

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值