如何使用jedis for Java连接到Docker Redis集群实例?

时间:2020-04-11 18:49:54

标签: java docker redis jedis

我使用redis docker-compose(3个主节点和3个从属节点)创建了一个由6个节点组成的集群,并且还链接了所有这些节点。 集群信息

cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:5
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:23
cluster_stats_messages_pong_sent:31
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:55
cluster_stats_messages_ping_received:26
cluster_stats_messages_pong_received:24
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:55

集群节点

d794a9ab002f0c3cb699ce68a09310dd0fdb17de 192.168.65.3:32789@32783 slave c6c05515c3be01a1438b6d2aad823c0fa50b1743 0 1586629088989 5 connected
7d4fab850bcfac8754a559c5e9469698b7f182bc 192.168.65.3:32792@32787 master - 0 1586629087000 2 connected 5461-10922
c6c05515c3be01a1438b6d2aad823c0fa50b1743 192.168.65.3:32793@32788 master - 0 1586629089995 4 connected 10923-16383
229b9b4f919f79a1c24b7b849c42acb9e3378532 192.168.65.3:32790@32785 slave 9b649a67dc53084ed7416b20e8bab00289e636d2 0 1586629089000 6 connected
9b649a67dc53084ed7416b20e8bab00289e636d2 192.168.65.3:32791@32786 myself,master - 0 1586629086000 1 connected 0-5460

如上所示,集群似乎可以正常工作,但是当我尝试通过使用代码使用jedis在Java应用程序中调用集群实例时

jedis = new JedisCluster(new HostAndPort("0.0.0.0", 32790));
jedis.set("events/city/rome", "32,15,223,828");

然后出现以下错误

Exception in thread "main" redis.clients.jedis.exceptions.JedisClusterMaxAttemptsException: No more cluster attempts left.
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:86)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:124)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:124)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:124)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:124)
    at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:124)
    at redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:25)
    at redis.clients.jedis.JedisCluster.set(JedisCluster.java:112)
    at sc.dev.algordf.ALGORDF.main(ALGORDF.java:53)

请帮助我找出可能是什么问题。是因为创建Jedis实例时没有指定正确的IP和端口号。还是我想念的东西。

谢谢。

1 个答案:

答案 0 :(得分:0)

问题出在Redis Cluster config!

您的应用向配置的节点之一发出请求。它接收所有 Redis 节点的地址,在您的情况下是 Docker 网络中的 IP。因此,您会收到连接错误。

要解决这个问题,请在集群中的每个节点添加以下参数以更新“广告”地址

节点 192.168.83.101:7000:17000 示例(docker 主机为 192.168.83.101,命令端口为 7000,集群总线端口为 17000

cluster-announce-ip 192.168.83.100
cluster-announce-port 7000
cluster-announce-bus-port 17000
相关问题