根本原因是Redis集群通信的两个端口(客户端端口如7001和集群总线端口如17001)被防火墙或云安全组拦截,导致节点间无法建立连接;必须同时放行每个节点的成对端口,并验证双向连通性。

redis-cli --cluster create 卡在 Waiting for the cluster to join 的根本原因
不是配置写错了,也不是节点没启动,而是集群根本连不通。Redis 集群通信依赖两个端口:客户端端口(比如 7001)和集群总线端口(7001 + 10000 = 17001)。只要其中任意一个被防火墙或安全组拦住,redis-cli --cluster create 就会无限等待。
firewall-cmd 必须同时放行客户端端口和集群总线端口
CentOS/RHEL 系统用 firewall-cmd 时,不能只开 7001,必须显式加 17001。常见错误是只执行了:
firewall-cmd --permanent --add-port=7001/tcp
正确做法是成对添加:
firewall-cmd --permanent --add-port=7001/tcpfirewall-cmd --permanent --add-port=17001/tcpfirewall-cmd --reload
如果部署了多个节点(如 7002、7003),每个都要对应加 17002、17003 —— 没有捷径,必须逐个配。
云服务器还要检查安全组,且顺序不能错
阿里云、腾讯云等平台的安全组规则,优先级高于本地防火墙。即使 firewall-cmd 放通了,安全组没开照样失败。
关键点:
- 安全组入方向规则里,
7001和17001必须同时存在,协议选TCP - 源地址建议设为集群内所有节点的私网 IP 段(如
192.168.0.0/16),而不是0.0.0.0/0 - 修改安全组后无需重启实例,但规则生效可能有几秒延迟,别立刻重试
验证端口是否真正通了,别信“已添加”
加完规则后,别直接跑 redis-cli --cluster create。先从一个节点上用 telnet 或 nc 测试连通性:
-
nc -zv 192.168.131.135 7005(客户端端口) -
nc -zv 192.168.131.135 17005(集群总线端口)
任一返回 Connection refused 或超时,就说明该端口没通。这时候查防火墙日志比重看配置更快:sudo firewall-cmd --list-ports 看是否真加进去了,再确认 ss -tlnp | grep :7001 确保 Redis 进程确实在监听。
集群总线端口不对外暴露,但节点之间必须双向可通——这个细节最容易被忽略。


















