无损移除Redis集群节点的核心步骤:1. 使用redis-cli --cluster rebalance 将从节点数据重新平衡到其他从节点;2. redis-cli --cluster del-node <cluster_host>:<cluster_port> <node_id> 移除空闲从节点;3. 对于主节点,先将所有槽重新分配到其他主节点,使用redis-cli --cluster reshard,然后del-node移除;确保在高峰期外操作,避免数据丢失。
步骤详解
首先,连接到集群:redis-cli -c -h 127.0.0.1 -p 7000。然后查看集群信息:cluster nodes,记录要移除节点的ID。对于从节点,直接执行:redis-cli --cluster del-node 127.0.0.1:7005 <NODE_ID>。如果是从节点且无数据,会直接移除。
主节点移除流程
主节点移除前必须清空槽位:redis-cli --cluster reshard 127.0.0.1:7000 --cluster-from <NODE_ID> --cluster-to <TARGET_NODE_ID> --cluster-slots 16384。将所有16384个槽迁移完毕后,再del-node移除。整个过程数据会自动迁移,不会丢失。
常见问题一
移除时提示"node is not empty":说明节点还有槽或数据未迁移完。先用cluster countkeysinslot检查每个槽是否有key,然后reshard迁移。
无故障转移移除
为了无损,确保集群至少有3个主节点,且每个主有从节点。移除前检查cluster info,确保cluster_state:ok。操作后验证cluster nodes无异常。
脚本自动化
redis-cli --cluster rebalance --cluster-weight <NODE_ID>=0 127.0.0.1:7000 将权重设为0后自动平衡,然后del-node。适用于大规模集群。
故障排除
如果节点下线:cluster forget <NODE_ID>手动忘记顽固节点。网络问题导致reshard失败:检查防火墙和端口7000/16379。
FAQ
Q: 移除主节点数据会丢失吗?
A: 不会,只要正确reshard迁移槽位,数据会复制到新主节点。
Q: 从节点直接del-node可以吗?
A: 可以,如果它是空闲从节点,直接移除无影响。
Q: 集群只剩2主节点能移除吗?
A: 不推荐,至少保持3主以确保高可用,先加新节点。
Q: reshard卡住怎么办?
A: 用--cluster-timeout 30000增加超时,或手动migrating/auth slots。