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

来源:互联网 发布:mac上制作iphone铃声 编辑:程序博客网 时间:2024/04/28 00:51

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

longwentaodeMacBook-Pro:redis-cluster longwentao$ cd 9001longwentaodeMacBook-Pro:9001 longwentao$ ./redis-server redis.conf longwentaodeMacBook-Pro:9001 longwentao$ cd ../9002longwentaodeMacBook-Pro:9002 longwentao$ ./redis-server redis.conf longwentaodeMacBook-Pro:9002 longwentao$ cd ../9003longwentaodeMacBook-Pro:9003 longwentao$ ./redis-server redis.conf 
longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -c -p 9001127.0.0.1:9001> quitlongwentaodeMacBook-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 9004longwentaodeMacBook-Pro:redis-cluster longwentao$ cp 9001/redis-server 9004longwentaodeMacBook-Pro:redis-cluster longwentao$ cp 9001/redis.conf 9004longwentaodeMacBook-Pro:redis-cluster longwentao$ ls 9004redis-server    redis.conflongwentaodeMacBook-Pro:redis-cluster longwentao$ vi 9004/redis.conf 

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

longwentaodeMacBook-Pro:redis-cluster longwentao$ cd 9004longwentaodeMacBook-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.rblongwentaodeMacBook-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 9001127.0.0.1:9001> CLUSTER nodesdddc296b4a3e26a536db40004f3d36a1561d35d9 127.0.0.1:9002 master - 0 1480432283064 2 connected 5461-10922af2b5eb05d6b4fe7ee2057c7b3d480df0df43b69 127.0.0.1:9004 master - 0 1480432283569 0 connectede41c2776755aa86322582dc37a0f6904b05c0dd3 127.0.0.1:9001 myself,master - 0 0 1 connected 0-54608fdc274fc6c341ef4c74bfe53ac9ad4309029a4a 127.0.0.1:9003 master - 0 1480432283569 3 connected 10923-16383127.0.0.1:9001> 

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

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

longwentaodeMacBook-Pro:redis-cluster longwentao$ mkdir 9005longwentaodeMacBook-Pro:redis-cluster longwentao$ cp 9001/redis-server 9005longwentaodeMacBook-Pro:redis-cluster longwentao$ cp 9001/redis.conf 9005longwentaodeMacBook-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 9001127.0.0.1:9001> CLUSTER nodes291d085ab60e2cc3692dc0d94e0af08a02f40f4a 127.0.0.1:9005 slave e41c2776755aa86322582dc37a0f6904b05c0dd3 0 1480433708699 1 connectedaf2b5eb05d6b4fe7ee2057c7b3d480df0df43b69 127.0.0.1:9004 master - 0 1480433709205 0 connectede41c2776755aa86322582dc37a0f6904b05c0dd3 127.0.0.1:9001 myself,master - 0 0 1 connected 0-5460dddc296b4a3e26a536db40004f3d36a1561d35d9 127.0.0.1:9002 master - 0 1480433708194 2 connected 5461-109228fdc274fc6c341ef4c74bfe53ac9ad4309029a4a 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:9003OK127.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)? 5461What is the receiving node ID? e41c2776755aa86322582dc37a0f6904b05c0dd3  --这是9001节点的IDPlease 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节点的IDSource 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 9003127.0.0.1:9003> keys *(empty list or set)

再到9001上看是否有foo

longwentaodeMacBook-Pro:src longwentao$ ./redis-cli -p 9001127.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 9001127.0.0.1:9001> CLUSTER nodes291d085ab60e2cc3692dc0d94e0af08a02f40f4a 127.0.0.1:9005 slave e41c2776755aa86322582dc37a0f6904b05c0dd3 0 1480436013802 5 connectedaf2b5eb05d6b4fe7ee2057c7b3d480df0df43b69 127.0.0.1:9004 master - 0 1480436014309 0 connectede41c2776755aa86322582dc37a0f6904b05c0dd3 127.0.0.1:9001 myself,master - 0 0 5 connected 0-5460 10923-16383dddc296b4a3e26a536db40004f3d36a1561d35d9 127.0.0.1:9002 master - 0 1480436012794 2 connected 5461-10922127.0.0.1:9001> 
0 0
原创粉丝点击