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.
【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值