代码之家  ›  专栏  ›  技术社区  ›  JShao

到Redis集群的Jedis TLS连接

  •  0
  • JShao  · 技术社区  · 2 年前

    我们正在使用Redis企业版 5个碎片:主机:6379-6383 端点:redis-endpoint.example.com 6378 使用Jedis 4.3.x,当我使用JedisPooled时,它可以正常工作

    GenericObjectPoolConfig<Connection> genericPoolConfig = new GenericObjectPoolConfig<>();
    genericPoolConfig.setMaxIdle(4);
    genericPoolConfig.setMaxTotal(5);
    genericPoolConfig.setMinIdle(2);
    
    JedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
          .sslSocketFactory(sslContext.getSocketFactory()) // key/trust stores here
          .ssl(true)
          .user("user_here")
          .password(redisPassword)
          .hostnameVerifier(hostnameVerifier)
          .build();
    JedisPooled jedis = new JedisPooled(genericPoolConfig, new HostAndPort("redis-endpoint.example.com", 6378), clientConfig);
    jedis.set("key_1", "value_1"); // this cmd works
    

    但是当我尝试使用JedisCluster时,它抛出Exception

    Set<HostAndPort> jedisClusterNodes = new HashSet<>();
    jedisClusterNodes.add(new HostAndPort("redis-endpoint.example.com", 6378));
    JedisCluster cluster = new JedisCluster(jedisClusterNodes, clientConfig, 3, genericPoolConfig); // <== ERROR here
    cluster.set("key_2", "value_2"); 
    

    我有错误:

    Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: ERR command is not allowed
        at redis.clients.jedis.Protocol.processError(Protocol.java:96)
        at redis.clients.jedis.Protocol.process(Protocol.java:137)
        at redis.clients.jedis.Protocol.read(Protocol.java:192)
        at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:316)
        at redis.clients.jedis.Connection.getUnflushedObjectMultiBulkReply(Connection.java:282)
        at redis.clients.jedis.Connection.getObjectMultiBulkReply(Connection.java:287)
        at redis.clients.jedis.JedisClusterInfoCache.executeClusterSlots(JedisClusterInfoCache.java:320)
        at redis.clients.jedis.JedisClusterInfoCache.discoverClusterNodesAndSlots(JedisClusterInfoCache.java:60)
        at redis.clients.jedis.providers.ClusterConnectionProvider.initializeSlotsCache(ClusterConnectionProvider.java:42)
        at redis.clients.jedis.providers.ClusterConnectionProvider.<init>(ClusterConnectionProvider.java:33)
        at redis.clients.jedis.UnifiedJedis.<init>(UnifiedJedis.java:122)
        at redis.clients.jedis.JedisCluster.<init>(JedisCluster.java:173)
        at redis.clients.jedis.JedisCluster.<init>(JedisCluster.java:167)
    

    问题:

    1. 我应该把所有5个碎片都放在Set jedisClusterNodes中,还是只需要放集群端点。
    2. 我在使用时做错了什么 new JedisCluster(jedisClusterNodes, clientConfig, 3, genericPoolConfig); ?
    3. JedisPooled在集群模式下工作得好吗?
    0 回复  |  直到 2 年前
        1
  •  0
  •   sazzad    2 年前

    默认情况下,您应该将Redis Enterprise(RE)视为客户端的单个节点。所以你可以使用 JedisPooled 以与RE通信。

    注1:集群特定命令实际上在默认模式下被禁用。这就是您可以在错误消息中看到的内容 ERR command is not allowed .

    注2:Redis Enterprise有一个 OSS Cluster 允许集群特定命令的模式。只有在这种RE模式下,您才应该使用 JedisCluster 代替JedisPooled进行交流。