社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
问题现象:
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
执行脚本,检查集群状态,问题解决
更多源码信息咨询一下网址:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!