有没有一种方法可以使用Lettuce自动发现Redis群集中的新群集节点IP

时间:2020-08-05 04:00:38

标签: kubernetes redis failover redis-cluster lettuce

我有一个Redis集群 (3个主服务器和3个从属) Kubernetes 集群中运行。集群是通过 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主机的(pods)之一来测试此设置时,Kubernetes会通过重新安排新的pod来完成其工作。但是新的Pod具有新的IP地址,而Lettuce从未发现过。生菜如何处理重新发现。似乎上述用于拓扑刷新的逻辑不会为新IP再次执行DNS查找。

那里有样品吗?我读过有关莴苣本身的多个Github问题,但对于如何处理它并不清楚。

最佳

1 个答案:

答案 0 :(得分:0)

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

所以我能够按以下方法解决此问题。

  • 使用给定选项的客户端的上述设置很好。但是,我必须将disconnectedBehavior设置为ACCEPT_COMMANDS。这样可以确保客户端在故障转移期间继续与Redis进行操作。
  • 作为这种持续接受操作的结果,对于故障转移成功选出新的主服务器之后到达客户端的第一个READ或WRITE,分支将正确返回新节点的新IP地址。从此以后,客户端将知道发生故障的节点所拥有的插槽的新IP。

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