连接远程的redis 集群报Could not get a resource from the pool异常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接远程的redis 集群报Could not get a resource from the pool异常相关的知识,希望对你有一定的参考价值。
参考技术A 在阿里云Ubuntu新搭建的redis集群,始终无法连接,报Could not get a resource from the pool异常查找资料发现是redist的一些限制,Protected mode is a layer of security protection, in order to avoid that
Redis instances left open on the internet are accessed and exploited. 就是说出于安全考虑,redis的实例不能在网络上被访问,所以修改protected-mode就好了
所以将redis.conf中的protected-mode yes改为protected-mode no
重启redis实例,以为问题就解决了?发现还是报Could not get a resource from the pool异常
这个是什么情况,要逆天嘛?
查看redis node信息看一下,终于发现了问题
怎么会有172的IP,到这里终于找到问题根源了,修改node.conf配置,重启redis,问题终于解决。
通过jedis连接redis单机成功,使用redis客户端可以连接集群,但使用JedisCluster连接redis集群一直报Could not get a resource from the poo
一,问题描述:
(如题目)通过jedis连接redis单机成功,使用JedisCluster连接redis集群一直报Could not get a resource from the pool
但是使用redis客户端可以连接集群(我使用的redis desktop manager)
在java中通过jedis连接redis单机也成功,但使用JedisCluster连接redis集群一直报Could not get a resource from the pool,
我以命令行方式操作是没问题的,如下:
先贴代码:
<!-- redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.2</version>
</dependency>
//相关代码如下:
JedisPoolConfig config = new JedisPoolConfig();
config =new JedisPoolConfig();
config.setMaxTotal(60000);//设置最大连接数
config.setMaxIdle(1000); //设置最大空闲数
config.setMaxWaitMillis(3000);//设置超时时间
config.setTestOnBorrow(true);
// 集群结点
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("192.168.246.128", Integer.parseInt("7001")));
jedisClusterNode.add(new HostAndPort("192.168.246.128", Integer.parseInt("7002")));
jedisClusterNode.add(new HostAndPort("192.168.246.128", Integer.parseInt("7003")));
jedisClusterNode.add(new HostAndPort("192.168.246.128", Integer.parseInt("7004")));
jedisClusterNode.add(new HostAndPort("192.168.246.128", Integer.parseInt("7005")));
jedisClusterNode.add(new HostAndPort("192.168.246.128", Integer.parseInt("7006")));
JedisCluster jc = new JedisCluster(jedisClusterNode, config);
//JedisCluster jc = new JedisCluster(jedisClusterNode);
jc.set("name", "zhangsan");
String value = jc.get("name");
System.out.println(value);
纠结了两天也是没sei了,就这么几行代码,看来看去没问题啊,甚至上github去看作者的例子,一模一样啊,一度怀疑人生啊;
由于我的单机版用命令行和java代码访问都没问题,而且集群通过命令行方式也没问题,所以一直没怀疑我搭建的环境的问题,我怀疑代码,怀疑是否是工程依赖的jedis的版本的bug,换了几个版本还是报同样的错误,最后我才开始查环境,环境的话先关了防火墙,没用,然后再查配置文件,查到
二:找到问题:这个地方IP的问题,以上是正确的版本,以前有问题的版本的Ip是127.0.0.1,
原因是这个地方以前我没注释redis.conf文件中的bind 127.0.0.1 然后做集群时使用的命令是:
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
三:解决问题:
删除以上所有里面这个node.conf文件
然后:
重新做集群:
./redis-trib.rb create --replicas 1 192.168.246.128:7001 192.168.246.128:7002 192.168.246.128:7003 192.168.246.128:7004 192.168.246.128:7005 192.168.246.128:7006
然后重新测试就解决了;
还要注意一下每个redis下面的redis.conf的配置(以下是我的):
port 7001 //端口7001,7002,7003
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群,我直接注释掉了
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7001,7002,7003
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
以上是关于连接远程的redis 集群报Could not get a resource from the pool异常的主要内容,如果未能解决你的问题,请参考以下文章
通过jedis连接redis单机成功,使用redis客户端可以连接集群,但使用JedisCluster连接redis集群一直报Could not get a resource from the poo
jedis连接集群报Could not get a resource from the pool错误
java 连接 redis集群时报错:Could not get a resource from the pool
本地连接远程mysql服务报错:MySQL is running but PID file could not be found [FAILED]
本地连接远程mysql服务报错:MySQL is running but PID file could not be found [FAILED]
.net 4.6.2连接redis报The assembly for System.Buffers and System.IO.Pipelines could not be loaded问题