ruby-2.4.6和redis-4.1.3.gem环境下的redis-cluster集群中的bug
bug场景说明:
ruby-2.4.6和redis-4.1.3.gem环境下的redis-cluster集群中,在移除redis-cluster集群中含有数据的节点时出现的bug。下面详细说明下bug出现的场景。
redis-cluster移除节点:
和节点添加一样,移除节点也有移除主节点,从节点。
redis-trib del-node 127.0.0.1:7002 ${node-id}
127.0.0.1:7002是redis-cluster 集群中的任意节点,node-id为要删除的主节点。 和添加节点不同,移除节点node-id是必需的,测试删除7002主节点:
实例:删除redis-cluster集群节点f7a95238e3de39b616b93949ec7c9f86d3867d63 对应的实例:192.168.1.39:1986
这个节点正好有数据
删除节点失败,提示节点中存在数据,不能从redis-cluster中删除,需要将他的数据转移出去,也就是和新增主节点一样需重新分片.
需要重新分片:(移除192.168.1.39:1986的4096 个hash slots 到be2a864214a624789748c7f753377638c6f88751 192.168.1.54:1986 这master节点)
** 需要移动到全部主节点上还是单个主节点:**
确认之后会一个一个将192.168.1.39:1986的卡槽移到到192.168.1.54:1986上
如果在迁移过程遇到下面这样的错误:
[WARNING] Node 192.168.1.39:1986 has slots in migrating state (8530).
[WARNING] Node 192.168.1.54:1986 has slots in importing state (8530).
[WARNING] The following slots are open: 8530
[root@mysql-redis39 ~]# /usr/local/redis/bin/redis-cli -h 192.168.1.39 -p 1986
192.168.1.39:1986> cluster setslot 8530 stable
OK
[root@mysql-redis39 ~]# /usr/local/redis/bin/redis-cli -h 192.168.1.54 -p 1986
192.168.1.54:1986> cluster setslot 8530 stable
OK
可以考虑使用命令“redis-trib.rb fix 192.168.0.3:1986”尝试修复。需要显示有节点处于migrating或importing状态,可以登录到相应的节点,使用命令“cluster setslot (8530 stable”修改,参数8530为问题显示的slot的ID。
再次执行下面的命令:
报错:
[ERR] Calling MIGRATE: ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY)
参考网上资料:
https://blog.csdn.net/m0_37128231/article/details/80755478
说这个是redis-cluster集群管理命令:redis-trib.rb的一个bug
按照网上说的方法,但是结果还是在报错,没得到解决。
于是重新安装ruby和redis-gem版本:
然后再测试删除节点:
删除节点注意:
redis-trib.rb del-node host:port node_id
在删除节点之前,其对应的槽必须为空,所以,在进行节点删除动作之前,必须使用redis-trib.rb reshard将其迁移出去。
需要注意的是,如果某个节点的槽被完全迁移出去,其对应的slave也会随着更新,指向迁移的目标节点。
到此处已经成功的删除掉了先还有数据的redis-cluster中的节点实例。解决一开始出现的bug问题