Redis增加删除(伸缩)节点操作步骤.

说明:

  1. 由于是练习,所以设置的是同一台服务器多个redis实例来操作的redis集群。所以下面的步骤是基于这个来做的。如果是不同的服务器步骤稍微有一点的区别。
  2. Redis版本是6.2.6版本
  3. 如果有密码,必须保证所有实例的密码一致。
  4. 事先准备好了3主3从6个redis实例。

一、 增加节点

主要分两种情况

  1. 增加节点是主节点
  2. 增加节点是从节点

1、增加节点是主节点

需求:增加7004主节点,如果需求需要包含某个值或者某些值一并移动到新节点去,那么就需要找到移动的值的最大散列插槽的值。步骤如下:

  1. 首先创建(复制)一个redis.conf文件。(我的是放在一个文件夹下面的,所以就直接复制文件夹了)
 cp ./redis7001 -r  ./redis7004

参数说明:

  • cp:复制命令。
  • -r:递归复制整个文件夹。忽略redis7004这个这个目录是否存在,没有就创建一个新的文件夹(目录)。
  1. 修改复制的文件端口号,日志文件地址名字,还有RDB文件名(万一后期自动选举成主节点了呢)等必要的信息。
#全局搜索文件./redis7004/conf/redis.conf的所有7001改成7004。
sed -i s/7001/7004/g ./redis7004/conf/redis.conf 
  1. 启动服务。
redis-server /www/server/redis/redis7004/conf/redis.conf 
  1. 将7004节点添加到我们的集群节点中。
 #1.命令:old_ip只要是集群中的任意一个ip即可
 redis-cli -a [password] --cluster add-node [new_ip] [old_ip]
 #2.例子
 redis-cli -a 123456 --cluster add-node 127.0.0.1:7004 127.0.0.1:7001
  1. 查看是否添加到集群中成功。
#1.命令
redis-cli -a [password] -p [ip] cluster nodes
#查看集群的命令
redis-cli --cluster help
#2.例子
redis-cli -a 123456 -p 7004 cluster nodes
  1. 分配散列槽
#1.命令
redis-cli -a [password] --cluster reshard [new_ip]
#2.例子
redis-cli -a 123456 --cluster reshard 127.0.0.1:7004
[root@T98899999 redis]# redis-cli -a 123456 --cluster reshard 127.0.0.1:7004
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:7004)
M: 11c3459ccdb510973ed5e61a755aaecc923405f7 127.0.0.1:7004
   slots: (0 slots) master
S: c836695daad38bcea59eb71dece7f860eab5f15e 127.0.0.1:8003
   slots: (0 slots) slave
   replicates 8140ca0e986ec863881b6dede6f7555d04fe5c06
S: 633546d3d75199e202d66ac56bca7e4c387bb453 127.0.0.1:8002
   slots: (0 slots) slave
   replicates 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818
M: 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 8140ca0e986ec863881b6dede6f7555d04fe5c06 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: e236e0ec685118abc67da92ad67c2db4b3f1abc6 127.0.0.1:8001
   slots: (0 slots) slave
   replicates 4efa79ebad2f410049ab59edf695d6be63ed0a25
M: 4efa79ebad2f410049ab59edf695d6be63ed0a25 127.0.0.1:7003
   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.
How many slots do you want to move (from 1 to 16384)? 100
What is the receiving node ID? 11c3459ccdb510973ed5e61a755aaecc923405f7
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: 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818
Source node #2: done
Ready to move 100 slots.
  Source nodes:
    M: 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818 127.0.0.1:7001
       slots:[0-5460] (5461 slots) master
       1 additional replica(s)
  Destination node:
    M: 11c3459ccdb510973ed5e61a755aaecc923405f7 127.0.0.1:7004
       slots: (0 slots) master
  Resharding plan:
    Moving slot 0 from 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818
    Moving slot 1 from 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818
    Moving slot 2 from 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818
		.....
Do you want to proceed with the proposed reshard plan (yes/no)? yes

说明下执行命令redis-cli -a 123456 --cluster reshard 127.0.0.1:7004时出现的询问:

  • How many slots do you want to move (from 1 to 16384)?:表示需要移动槽的数量。填写自己的需要即可。
  • What is the receiving node ID?:表示:那个id来接收它。即新的7004的id。
  • Source node #1:从那个节点id上移动散列插槽。填写移动的7001的id。当然如果需要平均节点插槽,那么每个主节点的id都写上或者写all,然后需要移动的节点数量处理主节点数。
  • Source node #2:最后时填写done结束。
  • Do you want to proceed with the proposed reshard plan (yes/no)?:确定要移动这些槽的计划吗?输入yes或者no。

补充说明:
如果需要包含某个值移动到新的节点(7004)上,那么就需要查询到移动的值的散列插槽值是多少。

redis-cli -a 123456-c -p 7004
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:7004> get num
 Redirected to slot [2765] located at 127.0.0.1:7001
 "10"

可以看到num的slot槽是2765。

  1. 查看是否添加成功。
redis-cli -a 123456 -p 7004 cluster nodes
#结果,可以发现7004上有0-99共100个散列插槽
 redis-cli -a 123456 -p 7004 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
c836695daad38bcea59eb71dece7f860eab5f15e 127.0.0.1:8003@18003 slave 8140ca0e986ec863881b6dede6f7555d04fe5c06 0 1656342598000 2 connected
11c3459ccdb510973ed5e61a755aaecc923405f7 127.0.0.1:7004@17004 myself,master - 0 1656342595000 9 connected 0-99
633546d3d75199e202d66ac56bca7e4c387bb453 127.0.0.1:8002@18002 slave 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818 0 1656342597000 8 connected
145b99ca42e4ddf2ad7fc43bdbc410ed0729e818 127.0.0.1:7001@17001 master - 0 1656342596000 8 connected 100-5460
8140ca0e986ec863881b6dede6f7555d04fe5c06 127.0.0.1:7002@17002 master - 0 1656342598804 2 connected 5461-10922
e236e0ec685118abc67da92ad67c2db4b3f1abc6 127.0.0.1:8001@18001 slave 4efa79ebad2f410049ab59edf695d6be63ed0a25 0 1656342597801 3 connected
4efa79ebad2f410049ab59edf695d6be63ed0a25 127.0.0.1:7003@17003 master - 0 1656342595777 3 connected 10923-16383

2、增加slave节点

需求想要在master7001上增加7004子节点,步骤如下(前面的主节点前3个步骤与情况1一样的):

  1. 首先创建(复制)一个redis.conf文件。(我的是放在一个文件夹下面的,所以就直接复制文件夹了)
 cp ./redis7001 -r  ./redis7004

参数说明:

  • cp:复制命令。
  • -r:递归复制整个文件夹。忽略redis7004这个这个目录是否存在,没有就创建一个新的文件夹(目录)。
  1. 修改复制的文件端口号,日志文件地址名字,还有RDB文件名(万一后期自动选举成主节点了呢)等必要的信息。
#全局搜索文件./redis7004/conf/redis.conf的所有7001改成7004。
sed -i s/7001/7004/g ./redis7004/conf/redis.conf 
  1. 启动服务。
redis-server /www/server/redis/redis7004/conf/redis.conf 
  1. 添加到集群中设置为从节点
#1,命令
redis-cli -a [password] --cluster add-node [old_host:old_port] -a [password] --cluster-slave [old_id]
#2.最快捷的方式(当然你首先要查看主节点的id)
redis-cli -a 123456 --cluster add-node 127.0.0.1:7004 127.0.0.1:7001 -a 123456 --cluster-slave 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818

参数说明:

  • -a 123456 : 如果redis有密码则需要加这个命令
  • 127.0.0.1:7004:新节点host+port
  • 127.0.0.1:7001:已经存在集群的任意host+端口
  • --cluster-slave:表示新的节点是一个从节点,如果后面没有跟ID则随机分配到一个master下。
  • 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818:指定master的ID
  1. 查看是否添加成功
[root@T98899999 ~]# redis-cli -a 123456 -p  7001 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
4efa79ebad2f410049ab59edf695d6be63ed0a25 127.0.0.1:7003@17003 master - 0 1654181965000 3 connected 10923-16383
11c3459ccdb510973ed5e61a755aaecc923405f7 `127.0.0.1:7004@17004 slave` `145b99ca42e4ddf2ad7fc43bdbc410ed0729e818` 0 1654181966807 8 connected
8140ca0e986ec863881b6dede6f7555d04fe5c06 127.0.0.1:7002@17002 master - 0 1654181968816 2 connected 5461-10922
e236e0ec685118abc67da92ad67c2db4b3f1abc6 127.0.0.1:8001@18001 slave 4efa79ebad2f410049ab59edf695d6be63ed0a25 0 1654181965801 3 connected
c836695daad38bcea59eb71dece7f860eab5f15e 127.0.0.1:8003@18003 slave 8140ca0e986ec863881b6dede6f7555d04fe5c06 0 1654181967000 2 connected
`145b99ca42e4ddf2ad7fc43bdbc410ed0729e818` 127.0.0.1:7001@17001 myself,master - 0 1654181964000 8 connected 0-5460
633546d3d75199e202d66ac56bca7e4c387bb453 127.0.0.1:8002@18002 slave 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818 0 1654181967812 8 connected

二、删除节点

主要分两种情况

  1. 删除节点是主节点
  2. 删除节点是从节

1、删除主节点7004

因为主节点是分配了slot槽的,所以需要把删除节点的solt槽移动到其他master节点中去,否则数据会丢失。

需求想要删除7004节点,步骤如下:

  • 数据迁移到其他主节点中 (逻辑和添加节点分配散列槽一样)
#1.查看集群节点信息 -a password 如果没有密码就不需要这个命令
redis-cli -a 123456 -p 7004 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
e236e0ec685118abc67da92ad67c2db4b3f1abc6 127.0.0.1:8001@18001 slave 4efa79ebad2f410049ab59edf695d6be63ed0a25 0 1654091452576 3 connected
c836695daad38bcea59eb71dece7f860eab5f15e 127.0.0.1:8003@18003 slave 8140ca0e986ec863881b6dede6f7555d04fe5c06 0 1654091452000 2 connected
4efa79ebad2f410049ab59edf695d6be63ed0a25 127.0.0.1:7003@17003 master - 0 1654091453593 3 connected 10923-16383
633546d3d75199e202d66ac56bca7e4c387bb453 127.0.0.1:8002@18002 slave 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818 0 1654091452000 1 connected
11c3459ccdb510973ed5e61a755aaecc923405f7 127.0.0.1:7004@17004 myself,master - 0 1654091451000 7 connected 0-2999
8140ca0e986ec863881b6dede6f7555d04fe5c06 127.0.0.1:7002@17002 master - 0 1654091453000 2 connected 5461-10922
145b99ca42e4ddf2ad7fc43bdbc410ed0729e818 127.0.0.1:7001@17001 master - 0 1654091454597 1 connected 3000-5460
#2.移动slot槽:需要注意的是id顺序不要搞错了 
#2.1 执行命令:redis-cli -a 123456 --cluster reshard 127.0.0.1:7004
#2.2 会出现如下的内容:能看到你要移除节点的slots槽
redis-cli -a 123456 --cluster reshard 127.0.0.1:7004
Warning: Using a 123456 with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 127.0.0.1:7004)
M: 11c3459ccdb510973ed5e61a755aaecc923405f7 127.0.0.1:7004
   slots:[0-2999] (3000 slots) master
   1 additional replica(s)
S: e236e0ec685118abc67da92ad67c2db4b3f1abc6 127.0.0.1:8001
   slots: (0 slots) slave
   replicates 4efa79ebad2f410049ab59edf695d6be63ed0a25
S: c836695daad38bcea59eb71dece7f860eab5f15e 127.0.0.1:8003
   slots: (0 slots) slave
   replicates 8140ca0e986ec863881b6dede6f7555d04fe5c06
M: 4efa79ebad2f410049ab59edf695d6be63ed0a25 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 633546d3d75199e202d66ac56bca7e4c387bb453 127.0.0.1:8002
   slots: (0 slots) slave
   replicates 11c3459ccdb510973ed5e61a755aaecc923405f7
M: 8140ca0e986ec863881b6dede6f7555d04fe5c06 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818 127.0.0.1:7001
   slots:[3000-5460] (2641 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#2.3表示移动slots的数量
How many slots do you want to move (from 1 to 16384)?3000
#2.4 表示移动到那个节点ID(或者说那个节点ID来接受这个移动的slots)
What is the receiving node ID? 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818
#2.5 表示那个节点ID需要移动
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: 11c3459ccdb510973ed5e61a755aaecc923405f7
#2.6输入done
Source node #1:done
#2.7最后确认是否是想要的结果
Do you want to proceed with the proposed reshard plan (yes/no)? yes
#2.8 开始执行移动功能。等着移动完成后就可以删除节点了。
Moving slot 1546 from 127.0.0.1:7004 to 127.0.0.1:7001: 
Moving slot 1547 from 127.0.0.1:7004 to 127.0.0.1:7001: 
Moving slot 1548 from 127.0.0.1:7004 to 127.0.0.1:7001: 
Moving slot 1549 from 127.0.0.1:7004 to 127.0.0.1:7001: 
省略.....
#3.可以再次执行1命令检查一下

用到的命令:

  • redis-cli -a password -p 7004 cluster nodes
  • redis-cli -a password --cluster reshard host:prot
  1. 执行删除命令:
#1.命令
redis-cli -a password --cluster del-node ip:prot 删除点ID
#2.例子
[root@T98899999 ~]# redis-cli -a 123456 --cluster del-node 127.0.0.1:7004 11c3459ccdb510973ed5e61a755aaecc923405f7
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 11c3459ccdb510973ed5e61a755aaecc923405f7 from cluster 127.0.0.1:7004
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
  1. 查看是否删除成功(发现已经没有这个节点了)
[root@T98899999 ~]# redis-cli -a 123456 -p 7001 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

4efa79ebad2f410049ab59edf695d6be63ed0a25 127.0.0.1:7003@17003 master - 0 1654095165860 3 connected 10923-16383

8140ca0e986ec863881b6dede6f7555d04fe5c06 127.0.0.1:7002@17002 master - 0 1654095164857 2 connected 5461-10922

e236e0ec685118abc67da92ad67c2db4b3f1abc6 127.0.0.1:8001@18001 slave 4efa79ebad2f410049ab59edf695d6be63ed0a25 0 1654095163854 3 connected

c836695daad38bcea59eb71dece7f860eab5f15e 127.0.0.1:8003@18003 slave 8140ca0e986ec863881b6dede6f7555d04fe5c06 0 1654095164000 2 connected

145b99ca42e4ddf2ad7fc43bdbc410ed0729e818 127.0.0.1:7001@17001 myself,master - 0 1654095164000 8 connected 0-5460

633546d3d75199e202d66ac56bca7e4c387bb453 127.0.0.1:8002@18002 slave 145b99ca42e4ddf2ad7fc43bdbc410ed0729e818 0 1654095164000 8 connected
  1. 关闭服务:先查看ps进程,然后kill掉进程
[root@T98899999 ~]# ps -ef|grep  redis-server
root     1751233       1  0 5月26 ?       00:06:51 redis-server *:6379
root     2244353       1  0 5月27 ?       00:05:55 redis-server 0.0.0.0:7001 [cluster]
root     2244355       1  0 5月27 ?       00:06:00 redis-server 0.0.0.0:7002 [cluster]
root     2244357       1  0 5月27 ?       00:05:56 redis-server 0.0.0.0:7003 [cluster]
root     2244359       1  0 5月27 ?       00:05:53 redis-server 0.0.0.0:8001 [cluster]
root     2244361       1  0 5月27 ?       00:05:53 redis-server 0.0.0.0:8002 [cluster]
root     2244367       1  0 5月27 ?       00:05:56 redis-server 0.0.0.0:8003 [cluster]
root     2749064       1  0 5月30 ?       00:02:17 redis-server 0.0.0.0:7004 [cluster]
root     3875558 3762488  0 22:54 pts/4    00:00:00 grep --color=auto redis-server
[root@T98899999 ~]# kill -9 2749064

2、删除slave节点

删除从节点就比较简单了。步骤如下:

  1. 执行删除命令
#1.命令
redis-cli -a password --cluster del-node ip:prot 删除点ID
#2.例子
redis-cli -a 123456 --cluster del-node 127.0.0.1:7004 11c3459ccdb510973ed5e61a755aaecc923405f7
  1. 关闭服务:先查看ps -ef|grep redis-server,然后执行kill命令。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐