Redis trouble05 -- 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/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值