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

执行脚本,检查集群状态,问题解决redis5.0.5 cluster节点handshake状态问题_第1张图片

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

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

你可能感兴趣的:(Redis)