项目场景:
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}') # 判断是否有失败节点
if [ -z "$FAILED_NODE_IDS" ]; then echo "没有发现失败节点。" exit 0
fi # 循环移除每个失败节点
for NODE_ID in $FAILED_NODE_IDS; do echo "正在移除失败节点: $NODE_ID" # 遍历集群中的所有活跃节点来移除失败节点 for NODE in $NODES; do NODE_INFO=$(echo $NODE | awk '{print $1, $3}') # 提取节点ID和状态 NODE_IP="$(echo $NODE_INFO | cut -d@ -f1 | cut -d: -f1)" NODE_PORT="$(echo $NODE_INFO | 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
一直在变化,这可能是因为节点在集群中的状态频繁变化(例如,节点会因为宕机、网络问题等原因而变为“失败”状态),或者由于某种原因节点被重新配置或重启
解决方案:
- 只需在集群中的任意一个活跃节点上执行
CLUSTER FORGET <node-id>
,该节点需要是当前状态被标识为"FAIL"的节点的 ID。- 若
node-id
一直变化,您可能需要多次运行CLUSTER NODES
来获取最新的节点 ID