Redis集群总线怎么在端口上连起来,端口配置那些事儿
- 问答
- 2025-12-23 17:40:42
- 3
Redis集群要能正常工作,除了我们平时连接用的客户端端口(默认6379)之外,还依赖一个额外的端口,这个端口号通常是在客户端端口的基础上加上一个固定的偏移量10000,如果你的Redis实例客户端端口是6379,那么它的集群总线端口就是16379,这个集群总线是集群的“神经系统”,负责节点之间的通信,比如检测节点是否存活、传播集群的元数据信息(哪个槽由哪个节点负责)、在节点之间迁移数据时的信息同步等等,如果没有这个总线端口正确连接,集群就无法形成,或者会处于故障状态。

要让这些端口“连起来”,核心在于确保所有集群节点之间能够通过这两个端口(客户端端口和集群总线端口)互相通信,这听起来简单,但在实际配置中,尤其是在有防火墙、云平台或者Docker等容器化环境的网络限制下,会遇到各种问题。
最基础的配置是在每个Redis节点的配置文件(redis.conf)里明确设置,你需要关注以下几个关键配置项:

port:这个就是客户端连接端口,比如6379,每个节点的这个端口可以一样(如果机器不同),也可以不一样,但集群内必须唯一。cluster-enabled:必须设置为yes,这样才能以集群模式启动。cluster-config-file:这个文件保存了集群的状态信息,比如节点ID、它负责的哈希槽等,通常命名为nodes-6379.conf(端口号作为区分),这个文件是Redis自动生成和维护的,不要手动修改。cluster-announce-ip:这是最关键的配置之一,特别是在云服务器或Docker容器中,Redis节点需要告诉集群中的其他节点,应该通过哪个IP地址来访问自己,如果你不设置这个,Redis可能会使用服务器的内网IP,而其他节点可能无法通过这个内网IP访问它,你的服务器有一个公网IP和一个私网IP,你需要在这里填写其他节点能够访问到的那个IP,通常是公网IP或宿主机IP(在Docker情况下)。cluster-announce-port:通常不需要设置,除非你的客户端端口不是标准的,或者做了特殊的端口映射,它会告知其他节点自己的客户端端口。cluster-announce-bus-port:同样,在复杂网络环境下非常重要,它明确告诉其他节点自己的集群总线端口是多少,如果你不设置,其他节点会默认尝试连接你的cluster-announce-ip:你的客户端端口+10000,但如果你做了端口映射(比如在Docker里把容器内的16379映射到宿主机的某个随机端口),就必须在这里明确告知其他节点应该连接哪个端口来访问你的总线。
根据Redis官方文档关于集群总线的说明,集群中的每个节点都使用TCP连接与每个其他节点建立连接,这些连接使用一种专门的二进制协议(集群总线协议)进行节点间的数据交换,这些连接始终保持连接状态,而不是按需创建的,如果某个节点在超过cluster-node-timeout配置的时间(默认为15秒)内没有回复PING请求,它就会被标记为疑似下线,如果大多数主节点都确认了这一点,它就会被标记为已下线。
配置好文件只是第一步,更常见的问题是网络连通性,你必须在所有节点的防火墙(包括云服务商的安全组)上打开双向的端口访问,也就是说,节点A必须能访问节点B的端口(如6379)和端口+10000(如16379),节点B也同样要能访问节点A的这两个端口,一个常见的错误是只打开了客户端端口,完全忘记了总线端口,导致集群创建失败,节点一直处于handshake状态。
举个例子,假设你在三台云服务器上搭建一个三主三从的集群,每台服务器运行两个Redis实例(一主一从),端口分别为6379、6380。
- 配置上:你需要在每个redis.conf中设置
cluster-enabled yes,并且根据情况可能需要设置cluster-announce-ip为服务器的公网IP。 - 防火墙上(安全组):你需要为这三台服务器配置安全组规则,允许来自其他两台服务器IP的流量访问端口范围
6379-6380和16379-16380,更简单的做法是,如果服务器之间完全信任,可以允许整个安全组内网IP段的全端口访问。
再举一个Docker的例子,如果你用Docker Compose在单机搭建伪集群,你可能会把每个Redis容器的6379端口映射到宿主机的不同端口,比如6381->6379, 6382->6379等等,但集群总线端口16379也需要被映射,并且其他容器需要知道这个映射后的端口,这时,cluster-announce-bus-port就派上用场了,你需要在容器内的配置中设置cluster-announce-ip为宿主机的IP(或者其他容器能访问到的IP),并且设置cluster-announce-bus-port为你映射到宿主机上的那个总线端口号,否则,容器内的Redis节点会告诉同伴“我的总线端口是16379”,但同伴通过宿主机网络却无法连接到16379,因为宿主机上映射的可能是另一个端口。
让Redis集群总线端口“连起来”的核心就是两点:一是正确配置,特别是cluster-announce-ip和cluster-announce-bus-port,确保节点告诉彼此正确的联系地址;二是打通网络,确保防火墙、安全组、网络策略允许所有节点之间在客户端端口和总线端口上双向通信,只要有一个环节出错,集群的“神经系统”就会瘫痪。

本文由太叔访天于2025-12-23发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://www.haoid.cn/wenda/67047.html
