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

使用Lettuce调用RedisClusterCommands.scriptLoad()遇连接拒绝问题

问题分析与解决方案

这问题我之前排查过好几个类似的,核心原因就是Redis Cluster节点向客户端上报的地址和客户端实际能访问的地址不匹配,导致Lettuce后续连接节点时用了错误的地址(比如127.0.0.1),自然就连接被拒绝了。

为什么会出现这个情况?

Redis Cluster启动时,每个节点会默认用自己绑定的网卡地址(比如127.0.0.1)或者主机名来对外公告自己的地址。当你的Lettuce客户端第一次连接集群中的某个节点后,这个节点会把整个集群的节点列表(包含每个节点自己上报的地址/端口)返回给客户端。Lettuce为了和集群中各个节点直接通信,会使用这些返回的地址来建立新连接——如果节点上报的是127.0.0.1或者客户端无法解析的主机名(比如redis.domain.local),客户端肯定连不上。

具体解决方案

方案1:修改Redis Cluster节点的公告地址(推荐,从根源解决)

启动Redis Cluster节点时,通过--cluster-announce-ip和--cluster-announce-port参数,强制节点上报客户端能访问的正确IP和端口。

比如你的主节点7000对应IP是10.10.10.1,启动命令就改成:

redis-server redis.conf --cluster-announce-ip 10.10.10.1 --cluster-announce-port 7000

从节点同理,比如7003节点:

redis-server redis.conf --cluster-announce-ip 10.10.10.1 --cluster-announce-port 7003

所有节点都配置后,它们返回给客户端的就是统一的可访问地址,Lettuce后续连接就不会出错了。

方案2:在Lettuce客户端添加地址映射(临时 workaround)

如果暂时无法修改Redis集群的配置,可以在客户端层面做地址转换,把节点返回的错误地址映射成正确的IP:

val redisUri = with(redisServiceInfo) { 
    RedisURI.builder()
        .withHost(host)
        .also { if (password != null) it.withPassword(password) }
        .withPort(port)
        .withTimeout(Duration.ofMillis(timeout))
        .build() 
}

val clusterClient = RedisClusterClient.create(redisUri)

// 添加地址映射逻辑,把错误的地址替换成实际可访问的IP
clusterClient.setNodeAddressMapper { address ->
    val targetIp = "10.10.10.1" // 你的集群实际IP
    when (address.hostText) {
        "127.0.0.1", "redis.domain.local" -> InetSocketAddress.createUnresolved(targetIp, address.port)
        else -> address
    }
}

val connection = clusterClient.connect()
this.connection = connection
this.clusterClient = clusterClient

这样Lettuce在拿到节点返回的地址后,会自动转换成正确的IP再去连接。

额外检查项

  • 确保客户端所在机器能ping通所有集群节点的实际IP
  • 确认集群节点的端口(7000-7005)在防火墙中是开放的
  • 检查Redis节点的redis.conf中,bind配置是否允许客户端访问(如果绑定了127.0.0.1,外部客户端也会连不上,需要改成0.0.0.0或者客户端IP)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:10:26