有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

2024-05-10

我有一个Redis集群(3主3从)运行在一个库伯内斯簇。该集群通过Kubernetes 服务(Kube 服务).

我将我的应用程序服务器连接到 Redis 集群(使用Kube-服务作为 URI)通过 Redis 的 Lettuce java 客户端。我还在 Lettuce 连接对象上设置了以下客户端选项:

ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
              .enablePeriodicRefresh(Duration.ofMinutes(10))
              .enableAllAdaptiveRefreshTriggers()
              .build();

ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder()
              .topologyRefreshOptions(topologyRefreshOptions)
              .autoReconnect(true)
              .disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
              .build();
redisClient.setOptions(clusterClientOptions);

现在,当我通过杀死我的 Redis master 之一来测试此设置时(pods),Kubernetes 通过重新调度新的 Pod 来完成其工作。但新的 pod 具有新的 IP 地址,并且 Lettuce 从未发现它。 Lettuce 如何处理重新发现。上面的拓扑刷新逻辑似乎不会再次对新 IP 进行 DNS 查找。

有没有任何样本或处理过此问题的人。我读过多个关于 Lettuce 本身的 Github 问题,但没有给出明确的处理方式。

Best


感谢对上述问题的第一条评论。

所以我能够按如下方式解决这个问题。

  • 对于具有给定选项的客户端来说,上述设置很好。但是,我必须设置disconnectedBehavior to ACCEPT_COMMANDS。这确保了客户端在故障转移期间继续与 Redis 进行操作。
  • 由于这种连续接受操作的结果,对于故障转移成功选举新主节点后到达客户端的第一个 READ 或 WRITE,cluster 将正确返回新节点的新 IP 地址。从今以后,客户端知道故障节点所持有的插槽的新 IP 是什么。

这是一种在下次尝试读取或写入时进行协调的惰性方法。但它确实有效,而且我相信它已经足够好了。我不确定是否有更好的方法来处理这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法用Lettuce自动发现Redis集群中新的集群节点IP 的相关文章

随机推荐