You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Redisson连接远程Redis集群失败,求无需改网络的解决办法

解决Redisson连接Redis集群时的内部IP映射问题

这个场景我太熟悉了——Redis集群节点之间用内网IP通信,外部的Redisson客户端连上去后,拿到集群返回的内网节点地址就直接懵了,根本连不通。好消息是,不用折腾网络配置,Redisson本身就支持地址映射,完美解决这个问题。

最直接的方案:用Redisson的NodeAddressMapper做IP映射

Redisson的集群配置里提供了setNodeAddressMapper方法,专门用来处理这种集群返回地址和实际访问地址不一致的情况。你只需要在配置里加一段映射逻辑,把集群返回的内部IP替换成你预先指定的外部IP就行。

具体代码修改

把你的原代码改成这样:

Config config = new Config();
config.setUseLinuxNativeEpoll(false);

ClusterServersConfig clusterConfig = config.useClusterServers();
// 还是用你原来的外部节点地址初始化
clusterConfig.addNodeAddress(redisURL.split(","));

// 核心:添加地址映射逻辑
clusterConfig.setNodeAddressMapper(new NodeAddressMapper() {
    @Override
    public InetSocketAddress map(InetSocketAddress address) {
        // 把集群返回的内部IP替换成你的外部IP
        String externalIp = "<external-ip>";
        // 端口保持不变,因为集群的服务端口和总线端口都是对应的
        return new InetSocketAddress(externalIp, address.getPort());
    }
});

RedissonClient redisson = Redisson.create(config);

如果你的集群有多个不同的内部IP,也可以用映射表来精准匹配:

// 先定义好内部IP到外部IP的对应关系
Map<String, String> ipMap = new HashMap<>();
ipMap.put("<internal-ip-7000>", "<external-ip>");
ipMap.put("<internal-ip-7001>", "<external-ip>");
// 剩下的节点IP也加进去

clusterConfig.setNodeAddressMapper(new NodeAddressMapper() {
    @Override
    public InetSocketAddress map(InetSocketAddress address) {
        // 找不到对应映射的话,就用原地址(避免意外)
        String targetIp = ipMap.getOrDefault(address.getHostString(), address.getHostString());
        return new InetSocketAddress(targetIp, address.getPort());
    }
});

为什么这个方案有效?

Redisson连接集群的流程是这样的:先连你配置的初始外部节点,然后从这个节点获取整个集群的节点列表(里面是内网IP)。这时候NodeAddressMapper会自动拦截这些内网地址,把它们替换成你指定的外部IP,后续Redisson就会用外部IP去连接所有节点,自然就不会出现连接失败的问题了。

其他可选方案(不用改网络)

如果你愿意稍微动一下Redis的配置,还有个更彻底的办法:给每个Redis节点配置cluster-announce-ip <external-ip>,这样集群返回给客户端的直接就是外部IP,Redisson不用做任何映射就能正常连接。不过你说不想修改网络配置,这个办法只需要改Redis配置文件,不需要调整网络拓扑,也算符合要求。

另外,测试环境还可以用SSH端口转发,把集群的每个节点端口映射到本地,然后Redisson连本地端口,但生产环境不推荐这么干,维护起来太麻烦。


内容的提问来源于stack exchange,提问作者munHunger

火山引擎 最新活动