现象
redis集群中某节点宕机
处理过程
- 登录集群中任意节点执行"移除宕机节点"操作(CLUSTER FORGET NODE_ID)
- 移除之后不久发现宕机节点状态变更为handshake,且NODE_ID每15s变更一次
- 集群中所有节点执行"移除宕机节点"操作(文章末尾)
- 集群恢复正常
FORGET单节点执行失效原因
1、在节点A执行FORGET 节点D后,此时节点D会从节点A的集群清单剔除,同时会置于节点A的禁用列表(cluster-node-timeout,默认15s)
2、此时节点D仍存在于集群中其他节点的可用清单,集群间同步失败。后续通信时节点A仍会继续尝试连接被移除的节点D
总结
- CLUSTER FORGET NODE_ID 用于清除宕机节点,需要在所有节点执行;CLUSTER DELETE IP:PORT NODE_ID用于节点下线,只能在节点正常工作时生效。
- 清除集群中不可用、失败节点。forget.sh
# ./forget.sh 127.0.0.7 6379 123456
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