开发者社区 问答 正文

idea使用jedis连接Centos中的Redis集群时出现Connection refused:

错误信息: Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:53) at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226) at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnectionFromSlot(JedisSlotBasedConnectionHandler.java:66) at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:116) at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) at redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:31) at redis.clients.jedis.JedisCluster.set(JedisCluster.java:103) at com.xzk.Demo3.main(Demo3.java:25) Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect at redis.clients.jedis.Connection.connect(Connection.java:207) at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93) at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767) at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106) at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435) at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) at redis.clients.util.Pool.getResource(Pool.java:49) ... 10 more Caused by: java.net.ConnectException: Connection refused: connect at java.base/java.net.PlainSocketImpl.waitForConnect(Native Method) at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:107) at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) at java.base/java.net.Socket.connect(Socket.java:608) at redis.clients.jedis.Connection.connect(Connection.java:184) ... 17 more

我在单独使用6379端口号做连接测试或连接池测试时都可以成功,但是在使用集群时就会报错。 在安全组规则中已经配置了那12个端口号(7001-7006、17001-17006),出入方向都有

这个具体错误是什么?怎么修改呀?

展开
收起
游客r5uwyhh3pmxrm 2020-11-27 21:13:14 1202 分享 版权
阿里云 AI 助理回答

这个错误信息表明你的Java应用在尝试连接到Redis集群时遇到了问题,具体来说是JedisConnectionException: Could not get a resource from the pool,意味着从连接池中获取资源失败。进一步看,底层原因是java.net.ConnectException: Connection refused: connect,表示应用程序无法建立到Redis节点的连接。

尽管你已经确认了安全组规则允许了7001-7006和17001-17006端口的访问,但还是出现连接被拒绝的问题,这可能由以下几个原因导致:

  1. Redis集群配置问题:请确保所有Redis节点都正确配置为集群模式,并且彼此之间可以相互通信。使用redis-cli --cluster check <任意节点IP>:<端口>命令检查集群状态。

  2. 网络配置问题

    • 确认你的应用服务器与Redis集群之间的网络路径没有其他防火墙或网络设备阻止这些端口的通信。
    • 检查Redis集群各节点的实际监听地址(IP)。有时候,Redis可能绑定在localhost(127.0.0.1)上,而不是外网地址,这将阻止外部连接。
  3. 连接池配置问题:检查你的Jedis连接池配置是否正确。例如,确保指定了正确的主机列表、端口以及集群模式。错误的配置如过时的节点信息、错误的密码等都可能导致连接失败。

  4. 服务运行状态:确认所有的Redis节点都在运行并且健康。使用ping命令测试每个节点的可达性。

  5. 时间同步问题:Redis集群对节点间的时间同步有严格要求,时间不同步也可能导致集群操作失败。确保所有节点的系统时间一致。

解决步骤建议:

  • 首先,通过Redis集群的管理工具或命令行工具检查集群状态,确认集群本身无误。
  • 检查并更新你的Jedis客户端配置,确保集群模式下使用的IP地址和端口正确无误。
  • 使用网络诊断工具(如telnetnc)测试从应用服务器到每个Redis节点的端口连通性。
  • 查看Redis服务器的日志文件,可能会有更详细的错误信息帮助定位问题。
  • 如果使用的是云服务上的Redis集群,确保云服务商的安全组设置也正确无误,有时需要同时检查VPC内的网络策略。

根据上述排查方向,你应该能够定位并解决问题。如果问题依旧,请提供更多的环境细节以便进行更深入的分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答