首页 > 解决方案 > redis.clients.jedis.exceptions.JedisConnectionException:连接到redis集群时无法从池中获取资源

问题描述

我正在尝试使用 java JedisCluster客户端连接到 redis 集群。

首先,我使用这个 docker 镜像制作了 Redis Cluster

grokzen/redis-cluster

创建了 6 个节点(3 个主节点 && 3 个从节点)

在 Windows 中使用 docker machine 我使用这个命令启动了 redis 集群

docker run -p 7000:7000 -p 7001:7001 -p 7002:7002 -p 7003:7003 -p 7004:7004 -p 7005:7005 -p 7006:7006 -p 7007:7007 dockerImageId

Redis 集群启动短日志:

使用 3 个主控:

172.17.0.2:7000

172.17.0.2:7001

172.17.0.2:7002

将副本 172.17.0.2:7004 添加到 172.17.0.2:7000 添加副本 172.17.0.2:7005

到 172.17.0.2:7001 添加副本

172.17.0.2:7003 到 172.17.0.2:7002

Redis 集群的 Java 客户端:

Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
        jedisClusterNodes.add(new HostAndPort("192.168.99.100", 7000));
        JedisCluster jc = new JedisCluster(jedisClusterNodes);
        jc.set("key", "Redis-Val");
        String value = jc.get("key");
        System.out.println("key is : "+value);

运行此代码后,我得到了这个异常

线程“主”redis.clients.jedis.exceptions.JedisConnectionException 中的异常:无法从位于 redis.clients.jedis.JedisPool 的 redis.clients.util.Pool.getResource(Pool.java:53) 的池中获取资源。 getResource(JedisPool.java:226) 在 redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnectionFromSlot(JedisSlotBasedConnectionHandler.java:66) 在 redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:116) 在 redis.clients.jedis.JedisClusterCommand .runWithRetries(JedisClusterCommand.java:141) 在 redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) 在 redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) 在 redis.clients.jedis。 JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) 在 redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:31) 在 redis.clients.jedis.JedisCluster.set(JedisCluster.java:103) 在 redis.redis_example.App.main(App.java:20) ) 引起:redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out

我通过 telnet 命令检查了 redis 是否在集群中的任何节点上运行:

远程登录 192.168.99.100 7000

连接成功

标签: javadockerredis

解决方案


我通过在运行容器时设置 IP env 变量来解决它:

docker run -d -p 7000-7005:7000-7005 -e "IP=0.0.0.0" grokzen/redis-cluster:latest

推荐阅读