首页 > 解决方案 > 有没有办法用生菜在 Redis 集群中自动发现新的集群节点 IP

问题描述

我有一个在Kubernetes集群内运行的 Redis 集群(3 个主服务器和 3 个从属服务器)。集群通过Kubenetes-Service (Kube-Service)公开。

我的应用程序服务器通过 Redis 的 Lettuce java 客户端连接到 Redis 集群(使用Kube-Service作为 URI)。我还在 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's (pods)来测试这个设置时,Kubernetes 通过重新安排一个新的 pod 来完成它的工作。但是新的 pod 有一个新的 IP 地址,它永远不会被 Lettuce 发现。生菜如何处理重新发现。似乎上面的拓扑刷新逻辑不会再次对新 IP 进行 DNS 查找。

是否有任何样品或任何处理过这个的人。我已经阅读了有关生菜本身的多个 Github 问题,这些问题并没有明确说明它是如何处理的。

最好的

标签: kubernetesredisfailoverredis-clusterlettuce

解决方案


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

所以我能够解决这个问题,如下所示。

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

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


推荐阅读