Redis系列之新增节点与删除节点(四)

在上一篇文章中,简单实现了一个Redis集群,假如需要在集群中增加或删除节点,怎么办呢,下面以一个例子来绍介下。
1、首先把前面搭建好的集群启动起来

longwentaodeMacBook-Pro:redis-cluster longwentao$ cd 9001
longwentaodeMacBook-Pro:9001 longwentao$ ./redis-server redis.conf 
longwentaodeMacBook-Pro:9001 longwentao$ cd ../9002
longwentaodeMacBook-Pro:9002 longwentao$ ./redis-server redis.conf 
longwentaodeMacBook-Pro:9002 longwentao$ cd ../9003
longwentaodeMacBook-Pro:9003 longwentao$ ./redis-server redis.conf 
longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -c -p 9001
127.0.0.1:9001> quit
longwentaodeMacBook-Pro:src longwentao$ ./redis-trib.rb check 127.0.0.1:9001
>>> Performing Cluster Check (using node 127.0.0.1:9001)
M: e41c2776755aa86322582dc37a0f6904b05c0dd3 127.0.0.1:9001
   slots:0-5460 (5461 slots) master
   0 additional replica(s)
M: dddc296b4a3e26a536db40004f3d36a1561d35d9 127.0.0.1:9002
   slots:5461-10922 (5462 slots) master
   0 additional replica(s)
M: 8fdc274fc6c341ef4c74bfe53ac9ad4309029a4a 127.0.0.1:9003
   slots:10923-16383 (5461 slots) master
   0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
longwentaodeMacBook-Pro:src longwentao$ 

2、现在需要在集群中增加一个端口号为9004的节点,首先需要在redis-cluster目录下创建9004的文件夹,然后将redis-server,redis.conf文件复制到9004目录下,再修改redis.conf文件的端口号为9004

longwentaodeMacBook-Pro:redis-cluster longwentao$ mkdir 9004
longwentaodeMacBook-Pro:redis-cluster longwentao$ cp 9001/redis-server 9004
longwentaodeMacBook-Pro:redis-cluster longwentao$ cp 9001/redis.conf 9004
longwentaodeMacBook-Pro:redis-cluster longwentao$ ls 9004
redis-server    redis.conf
longwentaodeMacBook-Pro:redis-cluster longwentao$ vi 9004/redis.conf 

3、启动9004节点,并通过 redis-trib.rb 命令将节点加入到集群中

longwentaodeMacBook-Pro:redis-cluster longwentao$ cd 9004
longwentaodeMacBook-Pro:9004 longwentao$ ./redis-server redis.conf 
longwentaodeMacBook-Pro:9004 longwentao$ cd ~/java/redis-3.2.5/src/
longwentaodeMacBook-Pro:src longwentao$ ls redis-trib.rb 
redis-trib.rb
longwentaodeMacBook-Pro:src longwentao$ ./redis-trib.rb add-node 127.0.0.1:9004 127.0.0.1:9001

第一个参数是新增加的节点9004,第二个参数是已有的节点9001

4、检测新增的节点是否已在集群中

longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -c -p 9001
127.0.0.1:9001> CLUSTER nodes
dddc296b4a3e26a536db40004f3d36a1561d35d9 127.0.0.1:9002 master - 0 1480432283064 2 connected 5461-10922
af2b5eb05d6b4fe7ee2057c7b3d480df0df43b69 127.0.0.1:9004 master - 0 1480432283569 0 connected
e41c2776755aa86322582dc37a0f6904b05c0dd3 127.0.0.1:9001 myself,master - 0 0 1 connected 0-5460
8fdc274fc6c341ef4c74bfe53ac9ad4309029a4a 127.0.0.1:9003 master - 0 1480432283569 3 connected 10923-16383
127.0.0.1:9001> 

可以看到,新增的节点已经加到集群中,并且是主节点,我们还可以为主节点增加只读从节点

5、为9001增加只读从节点9005,同样需要在redis-cluster目录下创建9005的文件夹,然后将redis-server,redis.conf文件复制到9005目录下,再修改redis.conf文件的端口号为9005

longwentaodeMacBook-Pro:redis-cluster longwentao$ mkdir 9005
longwentaodeMacBook-Pro:redis-cluster longwentao$ cp 9001/redis-server 9005
longwentaodeMacBook-Pro:redis-cluster longwentao$ cp 9001/redis.conf 9005
longwentaodeMacBook-Pro:redis-cluster longwentao$ vi 9005/redis.conf 

6、启动9005节点,并把它作为9001的slave增加到集群中

longwentaodeMacBook-Pro:9005 longwentao$ ./redis-server redis.conf 
longwentaodeMacBook-Pro:src longwentao$ ./redis-trib.rb add-node --slave 127.0.0.1:9005 127.0.0.1:9001

使用redis-cli检测下9005是否已经加入到集群中

longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -c -p 9001
127.0.0.1:9001> CLUSTER nodes
291d085ab60e2cc3692dc0d94e0af08a02f40f4a 127.0.0.1:9005 slave e41c2776755aa86322582dc37a0f6904b05c0dd3 0 1480433708699 1 connected
af2b5eb05d6b4fe7ee2057c7b3d480df0df43b69 127.0.0.1:9004 master - 0 1480433709205 0 connected
e41c2776755aa86322582dc37a0f6904b05c0dd3 127.0.0.1:9001 myself,master - 0 0 1 connected 0-5460
dddc296b4a3e26a536db40004f3d36a1561d35d9 127.0.0.1:9002 master - 0 1480433708194 2 connected 5461-10922
8fdc274fc6c341ef4c74bfe53ac9ad4309029a4a 127.0.0.1:9003 master - 0 1480433707690 3 connected 10923-16383

可以看到,9005已经加到集群中,并是9001节点的slave

下面我们来看下如何删除一个节点
要注意,删除的节点必须是空节点,也就是说节点不不能有任务数据。对应非空节点,在删除之前需要重新分片,将数据分到其他节点上,因此在删除之前我们先在节点中增加点数据

127.0.0.1:9001> set foo 1111
-> Redirected to slot [12182] located at 127.0.0.1:9003
OK
127.0.0.1:9003> 

现在9003的节点上已经有数据了,我们尝试删除一下

longwentaodeMacBook-Pro:src longwentao$ ./redis-trib.rb del-node 127.0.0.1:9001 '8fdc274fc6c341ef4c74bfe53ac9ad4309029a4a'
>>> Removing node 8fdc274fc6c341ef4c74bfe53ac9ad4309029a4a from cluster 127.0.0.1:9001
[ERR] Node 127.0.0.1:9003 is not empty! Reshard data away and try again.
longwentaodeMacBook-Pro:src longwentao$ 

删除时需要指定主节点和删除节点的ID,ID可以通过CLUSTER nodes 查看到,上面的执行结果删除失败,提示节点不为空

现在我们把9003上的数据进行转移

longwentaodeMacBook-Pro:src longwentao$ ./redis-trib.rb reshard 127.0.0.1:9003
>>> Performing Cluster Check (using node 127.0.0.1:9003)
M: 8fdc274fc6c341ef4c74bfe53ac9ad4309029a4a 127.0.0.1:9003
   slots:10923-16383 (5461 slots) master
   0 additional replica(s)
M: e41c2776755aa86322582dc37a0f6904b05c0dd3 127.0.0.1:9001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: dddc296b4a3e26a536db40004f3d36a1561d35d9 127.0.0.1:9002
   slots:5461-10922 (5462 slots) master
   0 additional replica(s)
M: af2b5eb05d6b4fe7ee2057c7b3d480df0df43b69 127.0.0.1:9004
   slots: (0 slots) master
   0 additional replica(s)
S: 291d085ab60e2cc3692dc0d94e0af08a02f40f4a 127.0.0.1:9005
   slots: (0 slots) slave
   replicates e41c2776755aa86322582dc37a0f6904b05c0dd3
[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)? 5461
What is the receiving node ID? e41c2776755aa86322582dc37a0f6904b05c0dd3  --这是9001节点的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:8fdc274fc6c341ef4c74bfe53ac9ad4309029a4a  --这是9003节点的ID
Source node #2:done

会提示需要移动多少个Hash槽,可以看到,9003的Hash槽共有5461个,我们全部移走,接下会会提示移动到哪个ID上,这里我们选择9001的ID,也就是移动到9001节点上,Source node是9003节点的ID,之后,redis 列出了重新分片计划,最后问你是否需要执行计划

Do you want to proceed with the proposed reshard plan (yes/no)? yes

执行完成后,我们看下9003上是否还有数据

longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -p 9003
127.0.0.1:9003> keys *
(empty list or set)

再到9001上看是否有foo

longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -p 9001
127.0.0.1:9001> keys *
1) "foo"
127.0.0.1:9001> 

上面的结果,说明数据已经从9003的节点上转移到9001上来了,下面进行对9003节点的删除

longwentaodeMacBook-Pro:src longwentao$ ./redis-trib.rb del-node 127.0.0.1:9001 '8fdc274fc6c341ef4c74bfe53ac9ad4309029a4a'
>>> Removing node 8fdc274fc6c341ef4c74bfe53ac9ad4309029a4a from cluster 127.0.0.1:9001
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
longwentaodeMacBook-Pro:src longwentao$ 

最后查看集群,发现9003已经不在集群中

longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -p 9001
127.0.0.1:9001> CLUSTER nodes
291d085ab60e2cc3692dc0d94e0af08a02f40f4a 127.0.0.1:9005 slave e41c2776755aa86322582dc37a0f6904b05c0dd3 0 1480436013802 5 connected
af2b5eb05d6b4fe7ee2057c7b3d480df0df43b69 127.0.0.1:9004 master - 0 1480436014309 0 connected
e41c2776755aa86322582dc37a0f6904b05c0dd3 127.0.0.1:9001 myself,master - 0 0 5 connected 0-5460 10923-16383
dddc296b4a3e26a536db40004f3d36a1561d35d9 127.0.0.1:9002 master - 0 1480436012794 2 connected 5461-10922
127.0.0.1:9001> 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值