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