JedisCluster работает в 2.7.x, но не работает в Jedis 2.9.x с JedisConnectionException и отказом в подключении

У меня есть код в Jedis 2.7.x уже несколько месяцев. Но я обнаружил, что у меня та же проблема, что и у https://github.com/xetorthio/jedis/issues/1625 (блокировка JedisPool.getResource при перезапуске сервера Redis). Поэтому я перешел с 2.7.x на 2.9.x. Я использую тот же код для создания JedisCluster. Но ему не удалось подключиться и получить данные от джедаев.

Я создал одноэлементный экземпляр JedisCluster и каждый раз просто использую JedisCluster.get() для получения данных. Я не закрываю соединения для кластера.

Дополнительная информация: у меня Redis 3.2.8. Я использую один-единственный хост в качестве JedisCluster, и ведомого устройства нет. Причина, по которой я хочу использовать режим JedisCluster вместо режима Jedis, заключается в том, что у меня есть другая система, которая должна вызывать JedisCluster с несколькими хостами. Я хочу сначала протестировать код в текущем кластере с одним хостом, а затем развернуть код в этой системе.

cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:1
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0

Тот же код работал в 2.7.x, но не в 2.9.x.

@Singleton
JedisCluster jedisCluster(){
        Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
        jedisClusterNodes.add(new HostAndPort("10.xx.xx.xx", 6379));
        GenericObjectPoolConfig jedisPoolConfig = new GenericObjectPoolConfig();
        jedisPoolConfig.setMaxTotal(16);
        jedisPoolConfig.setMaxIdle(16);
        return new JedisCluster(jedisClusterNodes, 2000, 1000, 5, jedisPoolConfig);
}
//When using cluster
jedisCluster.set("foo", "bar");
String value = jedisCluster.get("foo");

Ниже код работал в 2.9.x

Jedis jedis = new Jedis("xx.xx.xxx.xx",6379);
System.out.println(jedis.get("foo"));

Я подключаюсь по ssh к моему хосту Redis и запускаю cli

127.0.0.1:6379> get foo
"bar

Исключение, которое я получаю

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:53) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnectionFromSlot(JedisSlotBasedConnectionHandler.java:66) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:116) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:31) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisCluster.get(JedisCluster.java:124) ~[jedis-2.9.x.jar:?]
.........
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused (Connection refused)
at redis.clients.jedis.Connection.connect(Connection.java:207) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106) ~[jedis-2.9.x.jar:?]
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:836) ~[commons-pool2-2.2.jar:2.2]
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:434) ~[commons-pool2-2.2.jar:2.2]
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361) ~[commons-pool2-2.2.jar:2.2]
at redis.clients.util.Pool.getResource(Pool.java:49) ~[jedis-2.9.x.jar:?]
... 45 more
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[?:1.8.0_144]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[?:1.8.0_144]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[?:1.8.0_144]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[?:1.8.0_144]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:1.8.0_144]
at java.net.Socket.connect(Socket.java:589) ~[?:1.8.0_144]
at redis.clients.jedis.Connection.connect(Connection.java:184) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767) ~[jedis-2.9.x.jar:?]
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106) ~[jedis-2.9.x.jar:?]
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:836) ~[commons-pool2-2.2.jar:2.2]
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:434) ~[commons-pool2-2.2.jar:2.2]
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361) ~[commons-pool2-2.2.jar:2.2]
at redis.clients.util.Pool.getResource(Pool.java:49) ~[jedis-2.9.x.jar:?]
... 45 more

войти на сторону Redis

3088:M 21 Mar 21:42:24.187 - Accepted xx.xx.xxx.xxx:36064
3088:M 21 Mar 21:42:24.197 - Accepted xx.xx.xxx.xxx:36065
3088:M 21 Mar 21:42:24.212 - Reading from client: Connection reset by peer
3088:M 21 Mar 21:42:28.481 - DB 0: 12407076 keys (0 volatile) in 16777216 slots HT.
3088:M 21 Mar 21:42:28.482 - 1 clients connected (0 slaves), 1852164712 bytes in use

https://github.com/xetorthio/jedis/issues/1792


person Kola    schedule 21.03.2018    source источник
comment
Отключить брандмауэр   -  person Roman C    schedule 21.03.2018
comment
Я чувствую, что брандмауэр не может быть проблемой, потому что моя система может подключаться к JedisCluster в Jedis 2.7.x и может использовать Jedis от new Jedis (xx.xx.xxx.xx,6379) в Jedis 2.9.x. Единственная проблема заключается в том, что он не может подключиться к JedisCluster в Jedis 2.9.x.   -  person Kola    schedule 21.03.2018
comment
Дополнительная информация: у меня Redis 3.2.8. Я использую один-единственный хост в качестве JedisCluster, и ведомого устройства нет. Причина, по которой я хочу использовать режим JedisCluster вместо режима Jedis, заключается в том, что у меня есть другая система, которая должна вызывать JedisCluster с несколькими хостами. Я хочу сначала протестировать код в текущем кластере с одним хостом, а затем развернуть код в этой системе.   -  person Kola    schedule 21.03.2018


Ответы (1)


На мой вопрос ответил Маркос Нильс в jedis github - https://github.com/xetorthio/jedis/issues/1792, который указал мне на https://github.com/xetorthio/jedis/pull/1211

Раньше я не создавал кластер на своем единственном хосте и мог напрямую использовать его как кластер в 2.7.x. Я выполнил приведенную ниже команду, которая решила мою проблему.

for i in {0..16383}; do bin/redis-cli -h <ipOfHost1> CLUSTER ADDSLOTS $i; done
cluster meet <ip> 6379
person Kola    schedule 22.03.2018