Redis集群启动失败、节点无法握手、CLUSTER NODES显示fail或connecting,大概率是Bus端口(client port+10000)被占用;需确保各节点client port与其对应bus端口区间互不重叠,如7000→17000,则下一节点client port至少为1700

Redis集群启动失败,节点之间死活握不上手,用CLUSTER NODES一看,要么是fail,要么一直卡在connecting——遇到这种情况,十有八九是端口冲突在作祟,而且问题往往出在那个不起眼的Bus端口上。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
这事儿得从Redis集群的内部通信机制说起。每个节点其实维护着两条通信通道:一条是大家熟悉的tcp端口,负责处理客户端连接和部分命令;另一条就是bus端口,专门用于集群内部的心跳、故障检测和配置更新。关键在于,Bus端口并不复用客户端端口,而是默认在客户端端口号上直接加10000。比如你启动redis-server --port 7000,它除了监听7000,还会自动在17000端口上竖起耳朵。
这个设计很巧妙,但也相当隐蔽。一旦多个实例的客户端端口号挨得太近,比如一个用6999,另一个用7000,它们的Bus端口(16999和17000)要么直接重叠,要么因为相邻而在某些系统策略下引发冲突。更常见的是,如果你手动启动了其他服务占用了17000,redis-server启动时可能不会报错,但集群节点之间就彻底“失联”了。
redis-cli -p 7000 cluster nodes,如果返回空,或者只有自己且状态显示noaddr,第一反应就该去查17000端口是不是被占了。netstat -tuln | grep :17000 或者 lsof -i :17000。核心原则就一句话:确保任意两个节点的client_port与client_port + 10000这两个数字区间,完全没有重叠。举个例子,7000这个端口,实际上占用了7000(客户端)和17000(Bus)两个位置。那么,下一个节点的客户端端口,至少要从17001开始,否则它的Bus端口就可能和前面节点的客户端端口撞上。
7000, 7001, 7002, 7003, 7004, 7005。这样一来,对应的Bus端口17000–17005也自然形成连续且互不干扰的序列。6999和7000这种搭配最好避免。因为6999的Bus端口是16999,与7000的客户端端口只差1,在某些严格的内核参数或防火墙规则下,仍然可能被误判为冲突。8000, 8001, 8002这样的序列(Bus端口为18000–18002),主动避开10000–12000这类容易被Docker或虚拟机占用的“热门”区间。千万别只看redis-server日志里那句“Ready to accept connections”就以为万事大吉。必须确认Bus端口真的处于LISTEN状态。一个成功的Redis集群节点启动后,在netstat或ss的输出里,应该能看到两个与它进程PID相关的监听端口:一个是客户端端口,另一个就是加10000后的Bus端口。
ss -tlnp | grep $(pgrep -f "redis-server.*7000")。理想情况下,你应该看到两行输出,分别对应:7000和:17000。bind配置问题,比如你绑定了127.0.0.1,但Bus端口默认尝试绑定所有网络接口。这时,可能需要显式设置cluster-announce-ip和cluster-announce-port来指明。"Failed to join the cluster"或"Unable to send PING"这类错误信息,基本就能锁定问题——Bus通道不通,不是网络隔离,就是端口根本没起来。Bus端口不像客户端端口那样明明白白写在配置文件里,很容易被当成“内部实现细节”而忽略。但话说回来,集群能否成功组建,故障转移是否及时可靠,全都系于这条内部总线。规划时多花一分钟,算清楚那个“+10000”,远比上线后抓包排查MEET请求为什么超时要省心得多。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述