项目场景:
redis cluster有一台slave挂掉了,并且不准备在启用,但是使用cluster nodes命令时,还会有handshake出现,该怎么把他去掉
问题描述
以下是一个 Bash 脚本,可以自动化 Redis 集群的节点移除过程。请注意,您需要根据您的环境调整脚本中的参数。
#!/bin/bash
# Redis集群节点的IP地址和端口
ACTIVE_NODE_IP="<ip_of_any_active_node>"
ACTIVE_NODE_PORT="<port_of_any_active_node>"
# 获取当前的节点列表
NODES=$(redis-cli -h $ACTIVE_NODE_IP -p $ACTIVE_NODE_PORT CLUSTER NODES)
# 从节点列表中提取失败节点ID
FAILED_NODE_IDS=$(echo "$NODES" | grep -E "fail|disconnected" | awk '{print $1}')
# 从节点列表中提取正常节点ip:port
NODE_IDS=$(echo $NODE |grep -v fail| awk '{print $2}')
# 判断是否有失败节点
if [ -z "$FAILED_NODE_IDS" ]; then
echo "没有发现失败节点。"
exit 0
fi
# 循环移除每个失败节点
for NODE_ID in $FAILED_NODE_IDS; do
echo "正在移除失败节点: $NODE_ID"
# 遍历集群中的所有活跃节点来移除失败节点
for NODE in $NODE_IDS; do
#NODE_INFO1=$(echo $NODE | awk '{print $1, $3}') # 提取节点ID和状态
NODE_IP="$(echo $NODE | cut -d@ -f1 | cut -d: -f1)"
NODE_PORT="$(echo $NODE | cut -d@ -f1 | cut -d: -f2)"
# 移除失败节点
redis-cli -h $NODE_IP -p $NODE_PORT CLUSTER FORGET $NODE_ID
echo "已从节点 $NODE_IP:$NODE_PORT 移除 $NODE_ID"
done
done
echo "所有失败节点已移除。"
原因分析:
node-id
一直在变化,这可能是因为节点在集群中的状态频繁变化(例如,节点会因为宕机、网络问题等原因而变为“失败”状态),或者由于某种原因节点被重新配置或重启,或者该node-id是从其他节点获取到的本节点已经forget掉的node-id,可以换一台节点查看。
解决方案:
- 只需在集群中的任意一个活跃节点上执行
CLUSTER FORGET <node-id>
,该节点需要是当前状态被标识为"FAIL"的节点的 ID。- 在所有正常节点上将fail的节点forget掉