Redis异常02-redis5.0.5 cluster节点handshake状态问题 - Go语言中文社区

Redis异常02-redis5.0.5 cluster节点handshake状态问题


问题现象:

redis5.0 3×3集群 其中一台机器宕掉,执行以下命令进行删除节点,发现此命令不适用于宕机的情况

redis-cli -a 123456 --cluster del-node 10.19.111.111:7111 b13572217a29c7921de5ce545b1847c36d365c6e

后进入到集群中的一个节点,执行cluster forget node_id命令,此时查询是正常的,节点移除掉,过一会会发现节点又出现状态为handshake,且nodeid会15s一更换

当节点接收到CLUSTER FORGET node-id命令后,会把node-id指定的节点加入到禁用列表中,在禁用列表内的节点不再发送Gossip消息。禁用列表有效期为60秒,超过60秒节点会再次参与消息交换。也就是说第一次forget命令发出后,需60秒内在集群各节点上执行forget命令

1.handshake这个状态是由fail引起的
2.handshake状态的node_id是一直变化的,fail状态的node_id是不变的
3.当handshake持续超过节点配置的超时时间,则从该节点的nodes里删除该handshake节点.然后下次收到goosip带该节点fail的信息又开始handshake.. 并且如果在handshake期间收到goosip消息,由于handshake nodeid一直变化,会进一步判断以防止相同ip:port多次handshake.

最后总结一下forget.sh脚本执行 cluster forget 

#echo "usage: host port"
nodes_addrs=$(redis-cli -a $3 -h $1 -p $2 cluster nodes|grep -v handshake| awk '{print $2}')
echo $nodes_addrs
for addr in ${nodes_addrs[@]}; do
    host=${addr%:*}
    port=${addr#*:}
    del_nodeids=$(redis-cli -a $3 -h $host -p $port cluster nodes|grep -E 'handshake|fail'| awk '{print $1}')
    for nodeid in ${del_nodeids[@]}; do
        echo $host $port $nodeid
        redis-cli -a $3 -h $host -p $port cluster forget $nodeid
    done
done

执行脚本,检查集群状态,问题解决

 更多源码信息咨询一下网址:

https://githubmota.github.io/2018/06/15/TODO/

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39523456/article/details/104934176
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-04-11 03:23:07
  • 阅读 ( 1655 )
  • 分类:Redis

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢