JedisCluster:redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException:集群中没有可访问的节点
JedisCluster : redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster
我试图从 java 连接到 JedisCluster (ElastiCache Redis)。但是我得到了集群中没有可访问节点的 JedisConnectionException。
这是我连接到 JedisCluster 的代码
public static void main(String[] args) throws IOException{
final GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxWaitMillis(2000);
poolConfig.setMaxTotal(300);
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com",6379));
jedisClusterNode.add(new HostAndPort("mycachecluster.eaogs8.0002.usw2.cache.amazonaws.com",6379));
JedisCluster jedisCluster = new JedisCluster(jedisClusterNode,poolConfig);
System.out.println("Cluster Size...." + jedisCluster.getClusterNodes().size());
try{
jedisCluster.set("foo", "bar");
jedisCluster.get("foo");
}
catch(Exception e){
e.printStackTrace();
}
finally{
jedisCluster.close();
}
}
我在运行这个
之后得到的异常
redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster
at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnection(JedisSlotBasedConnectionHandler.java:57)
at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnectionFromSlot(JedisSlotBasedConnectionHandler.java:74)
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:116)
at redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:31)
at redis.clients.jedis.JedisCluster.set(JedisCluster.java:103)
我检查过
telnet mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com 6379
如 AWS Doc 中所述,我收到的回复是已连接。
这里有什么问题,为什么我无法使用 java 连接到 JedisCluster?
注:
我使用的是jedis 2.9.0版本
更新:
在 AWS 中 传输中加密和静态加密已激活
所以
Jedis jedis = null;
try{
jedis = new Jedis(URI.create("rediss://mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com:6379"));
System.out.println(jedis.ping());
System.out.println("XXXXX: "+jedis.get("c"));
}
catch(Exception exception){
exception.printStackTrace();
}
finally{
jedis.close();
}
工作正常。但不是绝地集群。
来自URI.create("rediss://...")
,很明显您正在使用Redis SSL Scheme 通过Jedis 创建成功的连接。但是 JedisCluster 还没有 SSL 支持。
关于这个有一个pending feature request。
JedisCluster 在连接启用了 SSL 的 redis 集群服务器时遇到了一些问题。即使是最新修订版(截至 2020 年 7 月),我们也遇到了异常 JedisNoReachableClusterNodeException
。各种服务器要求需要配置的文章非常少
我们需要 2 种语言的库,一种是 Java,另一种是 Python。对于 python,我使用了 python redis-py-cluster。虽然 Java 最初我们尝试使用 Jedis,然后尝试使用 Jedis Cluster,但两者都没有帮助。
所以我找到的另一个图书馆是
生菜
对于支持 SSL 的 redis 集群服务器,配置非常简单,并且支持构建器模式以使用可选参数构建连接对象。这是创建并连接到 redis-cluster server
的示例
RedisURI redisURI = RedisURI.Builder.redis("<<Redis Server primary endpoint>>", 6379).withSsl(true).withVerifyPeer(false).build();
RedisClusterClient redisClient = RedisClusterClient.create(redisURI);
StatefulRedisClusterConnection<String, String> conn = redisClient.connect();
List<KeyValue<String, String>> res_1= conn.sync().mget(keys...)_
conn.close();
但注意,如果redis服务器是单节点实例,那么即使是Jedis库也很好用。
我试图从 java 连接到 JedisCluster (ElastiCache Redis)。但是我得到了集群中没有可访问节点的 JedisConnectionException。
这是我连接到 JedisCluster 的代码
public static void main(String[] args) throws IOException{
final GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxWaitMillis(2000);
poolConfig.setMaxTotal(300);
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com",6379));
jedisClusterNode.add(new HostAndPort("mycachecluster.eaogs8.0002.usw2.cache.amazonaws.com",6379));
JedisCluster jedisCluster = new JedisCluster(jedisClusterNode,poolConfig);
System.out.println("Cluster Size...." + jedisCluster.getClusterNodes().size());
try{
jedisCluster.set("foo", "bar");
jedisCluster.get("foo");
}
catch(Exception e){
e.printStackTrace();
}
finally{
jedisCluster.close();
}
}
我在运行这个
之后得到的异常redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster
at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnection(JedisSlotBasedConnectionHandler.java:57)
at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnectionFromSlot(JedisSlotBasedConnectionHandler.java:74)
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:116)
at redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:31)
at redis.clients.jedis.JedisCluster.set(JedisCluster.java:103)
我检查过
telnet mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com 6379
如 AWS Doc 中所述,我收到的回复是已连接。
这里有什么问题,为什么我无法使用 java 连接到 JedisCluster?
注:
我使用的是jedis 2.9.0版本
更新:
在 AWS 中 传输中加密和静态加密已激活
所以
Jedis jedis = null;
try{
jedis = new Jedis(URI.create("rediss://mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com:6379"));
System.out.println(jedis.ping());
System.out.println("XXXXX: "+jedis.get("c"));
}
catch(Exception exception){
exception.printStackTrace();
}
finally{
jedis.close();
}
工作正常。但不是绝地集群。
来自URI.create("rediss://...")
,很明显您正在使用Redis SSL Scheme 通过Jedis 创建成功的连接。但是 JedisCluster 还没有 SSL 支持。
关于这个有一个pending feature request。
JedisCluster 在连接启用了 SSL 的 redis 集群服务器时遇到了一些问题。即使是最新修订版(截至 2020 年 7 月),我们也遇到了异常 JedisNoReachableClusterNodeException
。各种服务器要求需要配置的文章非常少
我们需要 2 种语言的库,一种是 Java,另一种是 Python。对于 python,我使用了 python redis-py-cluster。虽然 Java 最初我们尝试使用 Jedis,然后尝试使用 Jedis Cluster,但两者都没有帮助。 所以我找到的另一个图书馆是
生菜
对于支持 SSL 的 redis 集群服务器,配置非常简单,并且支持构建器模式以使用可选参数构建连接对象。这是创建并连接到 redis-cluster server
的示例RedisURI redisURI = RedisURI.Builder.redis("<<Redis Server primary endpoint>>", 6379).withSsl(true).withVerifyPeer(false).build();
RedisClusterClient redisClient = RedisClusterClient.create(redisURI);
StatefulRedisClusterConnection<String, String> conn = redisClient.connect();
List<KeyValue<String, String>> res_1= conn.sync().mget(keys...)_
conn.close();
但注意,如果redis服务器是单节点实例,那么即使是Jedis库也很好用。