一,問題描述:
(如題目)通過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日志開啟 有需要就開啟,它會每次寫操作都記錄一條日志