redis集群初始化报“node is not empty”需先flushall并清理rdb/aof文件;slot分配不均用reshard均衡;从节点failover失败需检查cluster-require-full-coverage和cluster-replica-no-failover配置。

redis-cli –cluster create 报错 Node is not empty
集群初始化时提示 Node is not empty,说明目标 redis 实例的 db0 里已有数据或 AOF/RDB 文件残留,redis-cli --cluster create 默认拒绝覆盖。
- 先连上该节点执行
FLUSHALL,再删掉本地dump.rdb和appendonly.aof(路径看config get dir和config get dbfilename) - 确认
redis.conf中cluster-enabled yes已开启,且port、bind、protected-mode no都配对——尤其protected-mode no在集群通信中不设会直接被拒绝握手 - 别用
redis-server redis.conf &启动后立刻跑--cluster create:Redis 启动有延迟,建议加sleep 2或用redis-cli ping轮询确认服务就绪
集群 slot 分配不均导致写入卡顿
用 redis-cli --cluster check 发现某些 master 的 slot 数远高于其他节点,写请求集中打到少数实例,CPU 或内存飙升。
- 分配 slot 时别手敲 16384 个数,用
--cluster create自动均分;若已部署,用redis-cli --cluster reshard迁移,指定源节点 hash slot 范围而非单个 slot -
reshard过程中客户端可能收到MOVED或ASK重定向,要求 client 支持集群协议(如 Jedis 3.0+、redis-py 4.0+),旧版 client 会报ConnectionError - 迁移大 key(如 >1MB 的 hash)会阻塞源节点,建议提前用
redis-cli --bigkeys扫描,拆分或剔除
从节点无法自动故障转移(failover)
主节点宕机后,集群没升任从节点,状态卡在 fail? ,应用持续报 CLUSTERDOWN。
- 检查从节点的
cluster-require-full-coverage no是否设置——默认是yes,只要有一个 slot 不可用就拒绝服务;设为no才允许部分 slot 下线时继续响应 - 确认从节点的
cluster-replica-no-failover是no(旧版叫cluster-slave-validity-factor),否则它会主动放弃参选 - 网络延迟超过
cluster-node-timeout(默认 15000ms)会导致误判,生产环境建议调低到 5000–8000ms,并确保所有节点间ping延迟
使用 redis-py 连集群总连错节点或超时
Python 程序用 RedisCluster 初始化后,读写随机失败,日志频繁出现 ConnectionError: Error 111 connecting to xxx:7001。
- 别传单个节点地址,必须传全部 master 节点(至少一个):构造时用
startup_nodes=[{"host": "10.0.1.10", "port": "7001"}, ...] - 关闭
skip_full_coverage_check=True,否则集群部分不可用时 client 直接抛异常而不是降级访问 - 连接池参数要显式设大些:
max_connections=100、socket_timeout=3,避免短连接风暴压垮节点
集群拓扑变更(如增删节点、reshard)后,client 缓存的 slot 映射不会自动刷新,得靠定期 CLUSTER SLOTS 轮询或等下次 MOVED 触发更新——这个延迟期就是最易出错的时间窗口。