能搭,但必须用内网可互通的私有IP(如10.x.x.x、172.16.x.x–172.31.x.x、192.168.x.x),所有节点需ping通且端口双向互通(含Redis端口及对应+10000集群总线端口),bind须显式配置为实际内网IP而非0.0.0.0,cluster-announce-ip建议显式设置,cluster-require-full-coverage应设为no以提升内网容错性。

直接说结论:能搭,但必须用内网可互通的私有IP(如 10.x.x.x、172.16.x.x–172.31.x.x、192.168.x.x),且所有节点之间 ping 通、端口互通(包括 Redis 端口和集群通信端口 +10000)。公网 IP 不是必需项,反而是用公网 IP 在内网反而会导致连接失败。
为什么 bind 0.0.0.0 会失败
很多人在内网部署时习惯把 bind 设成 0.0.0.0,结果集群初始化报错或节点互相发现不了。根本原因是:redis-cli --cluster create 依赖每个节点在 CLUSTER NODES 中上报的 IP 地址必须是其他节点能直连的地址。如果机器 A 的网卡只有 192.168.10.11,但配置里写了 bind 0.0.0.0,Redis 启动后可能在集群拓扑中广播成 127.0.0.1 或随机网卡 IP,导致机器 B 尝试连 127.0.0.1:7001 失败。
实操建议:
- 每台机器运行
ip a,确认用于集群通信的网卡 IP(比如ens33:) - 在
redis.conf中明确写死bind 192.168.10.11,不要写0.0.0.0或多个 IP - 同时配
protected-mode no(内网可信环境可关,否则会拒绝非 127.0.0.1 的连接) - 确保
cluster-announce-ip(Redis 6.2+)或老版本靠myself自发现机制推断的 IP 是对的;若不确定,显式加cluster-announce-ip 192.168.10.11
防火墙和服务端口必须双向放开
内网没公网不等于网络通畅。常见错误是只开了 Redis 端口(如 7000),却忘了集群节点间要用 port + 10000 端口通信(比如 7000 对应的集群总线端口是 17000)。这个端口用于 Gossip 协议交换节点状态,不通就无法握手、无法分片、无法故障转移。
检查与修复步骤:
- 确认所有节点都执行了
systemctl stop firewalld && systemctl disable firewalld(CentOS/RHEL)或ufw disable(Ubuntu) - 或者精细化放行:
firewall-cmd --permanent --add-port=7000-7005/tcp和firewall-cmd --permanent --add-port=17000-17005/tcp,再firewall-cmd --reload - 用
telnet 192.168.10.12 17001从节点 A 测试能否连通节点 B 的集群总线端口
redis-cli --cluster create 必须用内网 IP 显式指定
不能依赖 localhost 或域名。哪怕你改了 /etc/hosts 把 r1 指向 192.168.10.11,redis-cli --cluster create r1:7000 r2:7000 ... 仍可能因 DNS 解析延迟或 glibc 行为不一致导致失败。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
安全做法是全部使用点分十进制 IP:
redis-cli --cluster create \ 192.168.10.11:7000 192.168.10.12:7000 192.168.10.13:7000 \ 192.168.10.11:7001 192.168.10.12:7001 192.168.10.13:7001 \ --cluster-replicas 1
注意:
- 顺序无关,但主从配对由
--cluster-replicas 1自动分配(3 主 3 从) - 所有 IP 必须是各节点上
bind配置的真实内网地址 - 首次创建失败后,删掉所有节点上的
nodes-*.conf和appendonly.aof,再重启服务重试
客户端连接时别踩 cluster-require-full-coverage 陷阱
内网集群偶尔因某节点短暂失联(比如运维重启、网络抖动),cluster-require-full-coverage yes(默认)会让整个集群拒绝服务——哪怕只剩 1 个槽不可用,redis-cli -c 连上去执行 SET 就报 CLUSTERDOWN。
生产内网建议改为:
cluster-require-full-coverage no
这样即使个别槽暂时无主,其余槽仍可读写,避免雪崩。但要注意:这不解决根本问题,只是提高容忍度;真正要稳,得靠足够冗余的从节点 + 合理的 cluster-node-timeout(建议 15000,太小易误判下线)。
最易被忽略的一点:集群初始化成功后,redis.conf 里的 cluster-enabled yes 是永久生效的,但 nodes-*.conf 是二进制文件,不能手动编辑。任何节点 IP 变更、角色调整,都必须用 redis-cli --cluster 子命令操作,直接改配置重启会导致集群分裂。

















