我有一个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问题,但对于如何处理它并不清楚。
最佳
答案 0 :(得分:0)
对上述问题的第一条评论。
所以我能够按以下方法解决此问题。
disconnectedBehavior
设置为ACCEPT_COMMANDS
。这样可以确保客户端在故障转移期间继续与Redis进行操作。这是一种懒惰的方法,可在下次尝试读取或写入时进行协调。但这有效,我相信它已经足够了。我不确定是否有更好的方法来解决这个问题。