You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:17:23