JedisCluster:redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException:集群中没有可到达的节点

时间:2018-01-16 09:20:32

标签: java 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();
        }

工作正常。但不是jedis集群。

2 个答案:

答案 0 :(得分:2)

t::s :*:_t::T 开始,很明显您正在使用 Redis SSL Scheme 来创建Jedis的成功连接。但是JedisCluster还没有SSL支持。

对此有一个pending feature request

答案 1 :(得分:0)

JedisCluster在连接启用了SSL的Redis集群服务器时遇到了一些问题。即使使用最新版本(截至2020年7月),我们也遇到了异常JedisNoReachableClusterNodeException。有关各种服务器要求的配置的文章很少。

我们需要两种语言的库,一种使用Java,另一种使用Python。对于python,我使用了python redis-py-cluster。对于Java,最初我们尝试使用Jedis,然后尝试使用Jedis Cluster,但两者都没有帮助。 所以我发现了另一个图书馆

生菜

对于具有SSL支持的Redis集群服务器,配置非常简单,并且支持构建器模式来构造带有可选参数的连接对象。这是创建并连接到redis-cluster服务器的示例

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库也很好用。