Redisson未使用配置的浮动Redis IP,转而连接内部IP问题咨询
解决Redisson连接Redis内部IP而非浮动IP的问题
这种情况我之前在Redis集群搭配Redisson的场景里也碰到过,核心原因其实是Redis集群节点自身向客户端返回了内部IP地址——Redisson初始化集群连接时,会先从你配置的初始节点拉取整个集群的拓扑信息,如果Redis节点的集群公告IP(cluster-announce-ip)设的是内部地址,Redisson就会自动切换到这些内部IP通信,直接忽略你一开始配置的浮动IP。
下面是具体的排查和解决步骤:
1. 优先修改Redis集群的公告IP配置(推荐方案)
这是最根本的解决办法,确保Redis集群向外部客户端返回正确的浮动IP:
- 登录每个Redis集群节点,修改
redis.conf配置文件,添加或调整以下参数:
# 设置节点对外公告的IP为你的浮动IP cluster-announce-ip 你的浮动公网/内部浮动IP地址 # 公告节点的服务端口(默认6379,根据实际配置调整) cluster-announce-port 6379 # 公告节点的集群总线端口(默认16379,开启集群总线时需要配置) cluster-announce-bus-port 16379
- 重启所有Redis节点后,用
redis-cli连接浮动IP,执行CLUSTER NODES命令,检查返回的节点地址是否都是浮动IP。如果是,Redisson就能正常使用浮动IP连接集群了。
2. 在Redisson中配置地址转换(应急方案)
如果暂时无法修改Redis集群的配置,可以通过Redisson的AddressTransformer功能,强制把Redis返回的内部IP替换为浮动IP:
Config redissionConfig = new Config(); redissionConfig.setTransportMode(TransportMode.EPOLL); redissionConfig.useClusterServers() .addNodeAddress(System.getenv("redis_url")) .addNodeAddress("redis://XXX.XX.XXX.X:6379","redis://XXX.XX.XXX.X:6379") // 你的其他节点地址 // 添加地址转换逻辑 .setAddressTransformer(address -> { // 把所有Redis返回的内部IP映射到你的浮动IP String internalIp = address.getHostName(); // 这里可以根据实际内部IP段调整判断逻辑 if (internalIp.startsWith("192.168.") || internalIp.startsWith("10.")) { return new InetSocketAddress("你的浮动IP地址", address.getPort()); } return address; });
这种方式相当于在客户端做了一层IP映射,能临时解决问题,但不如修改Redis配置彻底。
3. 验证初始连接节点的正确性
确认你通过System.getenv("redis_url")获取的地址确实是浮动IP,并且Redisson所在的Ratpack服务能正常访问这个地址。如果初始连接的节点本身无法访问,Redisson可能会尝试其他配置的节点,但如果那些节点也返回内部IP,问题依旧会出现。
内容的提问来源于stack exchange,提问作者hisdudeness
相关产品推荐
相关产品推荐

