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

Anu*_*ran 5 java redis jedis docker

我使用 redis docker-compose 创建了一个包含 6 个节点的集群(3 个主节点和 3 个从节点),并将所有节点链接起来。集群信息

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
Run Code Online (Sandbox Code Playgroud)

集群节点

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
Run Code Online (Sandbox Code Playgroud)

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

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

然后我得到以下错误

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)
Run Code Online (Sandbox Code Playgroud)

请帮我找出可能是什么问题。是不是因为我在创建jedis实例时没有指定正确的IP和端口号。或者是我缺少的东西。

谢谢。

小智 4

问题出在 Redis 集群配置中!

您的应用程序请求已配置的节点之一。它接收所有 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
Run Code Online (Sandbox Code Playgroud)