redis_cluster命令官方文档翻译及实践

CLUSTER ADDSLOTS slot [slot ...]


Available since 3.0.0. 从3.0.0开始可用
Time complexity: O(N) where N is the total number of hash slot arguments
时间复杂度:O(N) N是总的哈希槽数参数


This command is useful in order to modify a node's view of the cluster configuration. 
Specifically it assigns a set of hash slots to the node receiving the command. If the command is successful, 
the node will map the specified hash slots to itself, and will start broadcasting the new configuration.
这个命令的作用是修改集群配置的一个节点的视图。
明确的分配一组哈希槽到接收这个命令的节点,如果命令是成功的,这个接收命令的节点会映射指定的哈希槽到它自己,然后会广播这个新的配置


However note that:
1,The command only works if all the specified slots are, from the point of view of the node receiving the command, currently not assigned. 
A node will refuse to take ownership for slots that already belong to some other node (including itself).
2,The command fails if the same slot is specified multiple times.
如果相同的槽被多次指定命令就会报错
3,As a side effect of the command execution, if a slot among the ones specified as argument is set as importing, 
this state gets cleared once the node assigns the (previously unbound) slot to itself.


命令执行的副作用,如果指定为参数指定的一个槽被设置为导入,那么这个状态在节点将(以前未绑定的)槽分配给自身时就会被清除。




然而注意:
1,这个命令仅仅工作在如果指定的槽是,从收到命令的节点的视点看,当前尚未分配的槽,
一个节点会拒绝所有权已经属于其他节点的槽(包括他自己)
A,执行CLUSTER ADDSLOTS命令的这个节点是给自己分配槽,并且这个槽要是尚未分配的,如果已经分配过的槽,会报错,即使这个槽当前属于它自己也会报错


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504252798782 12 connected 10923-16383
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 myself,master - 0 0 10 connected 5462-10922
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504252799282 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 master - 0 1504252798782 7 connected 0 2-5460


这里可以看到槽号1是属于192.168.4.71:7008节点,我们现在把这个槽分配给192.168.4.70:7004


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster addslots 1
(error) ERR Slot 1 is already busy


槽2目前属于192.168.4.70:7004,那么这个槽还可以再次分配给192.168.4.70:7004?


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster addslots 2
(error) ERR Slot 2 is already busy




B,已经分配的槽需要使用delslots删除之后才可以再次使用addslots


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster delslots 2
OK


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504253092265 12 connected 10923-16383
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504253092766 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 myself,master - 0 0 7 connected 0 3-5460
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 master - 0 1504253092767 10 connected 5462-10922


这里可以看到192.168.4.70:7004删除了槽2




再次使用cluster addslots命令把槽2加入到192.168.4.70 -p 7004


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster addslots 2
OK
[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504253172912 12 connected 10923-16383
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504253174915 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 myself,master - 0 0 7 connected 0 2-5460
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 master - 0 1504253174915 10 connected 5462-10922
[root@redis1 ~]# 




再次测试:


从192.168.4.70:7005节点删除槽2,3,4,5


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504254313199 12 connected 10923-16383
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 myself,master - 0 0 10 connected 2-5 5462-10922
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504254313700 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 master - 0 1504254313700 7 connected 0 6-5460


redis-cli -h 192.168.4.70 -p 7005 -c cluster delslots 2 3 4 5


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster delslots 2 3 4 5
OK
[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504254363385 12 connected 10923-16383
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 myself,master - 0 0 10 connected 5462-10922
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504254361381 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 master - 0 1504254363385 7 connected 0 6-5460


在192.168.4.70:7004中加入这4个槽


redis-cli -h 192.168.4.70 -p 7004 -c cluster addslots 2 3 4 5


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504254421992 12 connected 10923-16383
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 myself,master - 0 0 10 connected 5462-10922
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504254421491 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 master - 0 1504254422994 7 connected 0 6-5460


从这里看到2,3,4,5已经从192.168.4.70:7005中去除了


redis-cli -h 192.168.4.70 -p 7004 -c cluster nodes|grep master


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504254486505 12 connected 10923-16383
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504254487108 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 myself,master - 0 0 7 connected 0 6-5460
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 master - 0 1504254488009 10 connected 2-5 5462-10922


但是在192.168.4.70:7004中看到这个2,3,4,5还在192.168.4.70:7005,这个我猜测是slot状态刷新的慢


redis-cli -h 192.168.4.70 -p 7004 -c cluster delslots 2 3 4 5
redis-cli -h 192.168.4.70 -p 7004 -c cluster addslots 2 3 4 5


我们手动在192.168.4.70 -p 7004执行这2条命令
[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster delslots 2 3 4 5
redis-cli -h 192.168.4.70 -p 7004 -c cluster addslots 2 3 4 5OK
[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster addslots 2 3 4 5
OK
[root@redis1 ~]# 
[root@redis1 ~]# 
[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504254598730 12 connected 10923-16383
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504254600731 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 myself,master - 0 0 7 connected 0 2-5460
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 master - 0 1504254600230 10 connected 5462-10922


看到192.168.4.70:7005也直接刷新了


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster nodes|grep master 
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504254645897 12 connected 10923-16383
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 myself,master - 0 0 10 connected 5462-10922
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504254644395 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 master - 0 1504254645395 7 connected 0 2-5460



使用redis客户端命令行的方式迁移slot:


查看当前的集群的master节点
[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504254853974 12 connected 10923-16383
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 myself,master - 0 0 10 connected 5462-10922
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504254854475 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 master - 0 1504254852972 7 connected 0 2-5460


cluster setslot slot_num migrating target_node_id


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster setslot 5462 migrating 48c261163414d244d65fb9a70e09de166440da31
OK


cluster setslot slot_num importing source_node_id


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7004 -c cluster setslot 5462 importing b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f
OK


这里是准备迁移5462到48c261163414d244d65fb9a70e09de166440da31:


[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504254934796 12 connected 10923-16383
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 myself,master - 0 0 10 connected 5462-10922 [5462->-48c261163414d244d65fb9a70e09de166440da31]
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504254933793 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 master - 0 1504254933793 7 connected 0 2-5460


确认开始迁移操作:
[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster setslot 5462 node 48c261163414d244d65fb9a70e09de166440da31 
OK


查看迁移结果:
[root@redis1 ~]# redis-cli -h 192.168.4.70 -p 7005 -c cluster nodes|grep master
b4a9a578069a3b2a413fcb4125d17c8768b13359 192.168.4.70:7006 master - 0 1504255395244 12 connected 10923-16383
b23bfc9ac1fdd4bfb9c799f7985622f54338cb0f 192.168.4.70:7005 myself,master - 0 0 10 connected 5463-10922
631bff889fbb5600febb896d075eeca5a2cd7322 192.168.4.71:7008 master - 0 1504255394744 11 connected 1 5461
48c261163414d244d65fb9a70e09de166440da31 192.168.4.70:7004 master - 0 1504255394744 7 connected 0 2-5460 5462












Example
For example the following command assigns slots 1 2 3 to the node receiving the command:
> CLUSTER ADDSLOTS 1 2 3
OK


However trying to execute it again results into an error since the slots are already assigned:
> CLUSTER ADDSLOTS 1 2 3
ERR Slot 1 is already busy


Usage in Redis Cluster
This command only works in cluster mode and is useful in the following Redis Cluster operations:
To create a new cluster ADDSLOTS is used in order to initially setup master nodes splitting the available hash slots among them.
In order to fix a broken cluster where certain slots are unassigned.
Information about slots propagation and warnings
Note that once a node assigns a set of slots to itself, it will start propagating this information in heartbeat packet headers. However the other nodes will accept the information only if they have the slot as not already bound with another node, or if the configuration epoch of the node advertising the new hash slot, is greater than the node currently listed in the table.
This means that this command should be used with care only by applications orchestrating Redis Cluster, like redis-trib, and the command if used out of the right context can leave the cluster in a wrong state or cause data loss.
Return value
Simple string reply: OK if the command was successful. Otherwise an error is returned.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值