Linux Redis 集群搭建与调优

1次阅读

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

Linux Redis 集群搭建与调优

redis-cli –cluster create 报错 Node is not empty

集群初始化时提示 Node is not empty,说明目标 redis 实例的 db0 里已有数据或 AOF/RDB 文件残留,redis-cli --cluster create 默认拒绝覆盖。

  • 先连上该节点执行 FLUSHALL,再删掉本地 dump.rdbappendonly.aof(路径看 config get dirconfig get dbfilename
  • 确认 redis.confcluster-enabled yes 已开启,且 portbindprotected-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 过程中客户端可能收到 MOVEDASK 重定向,要求 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-failoverno(旧版叫 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=100socket_timeout=3,避免短连接风暴压垮节点

集群拓扑变更(如增删节点、reshard)后,client 缓存的 slot 映射不会自动刷新,得靠定期 CLUSTER SLOTS 轮询或等下次 MOVED 触发更新——这个延迟期就是最易出错的时间窗口。

text=ZqhQzanResources