kubernetes - 有没有办法用生菜在 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 问题,这些问题并没有明确说明它是如何处理的。
最好的
解决方案
感谢对上述问题的第一条评论。
所以我能够解决这个问题,如下所示。
- 具有给定选项的客户端的上述设置很好。但是,我必须将其设置
disconnectedBehavior
为ACCEPT_COMMANDS
. 这确保了客户端在故障转移期间继续与 Redis 进行操作。 - 由于这种不断接受操作的结果,对于在故障转移成功选出新的主节点后到达客户端的第一个 READ 或 WRITE,集群将正确返回新节点的新 IP 地址。从今以后,客户端知道故障节点持有的插槽的新 IP 是什么。
这是在下次尝试读取或写入时协调的一种惰性方法。但它有效,我相信它已经足够好了。我不确定是否有更好的方法来处理这个问题。
推荐阅读
- android - 如何将数据从适配器类传递到底部工作表对话框片段
- flutter - 如何在颤动中更改应用程序图标的形状?
- python - Plotly:如何自定义轴转换?
- mysql - mysql按天统计新访问者的数量
- sql - 选择 Distinct field 和 row num 只是为了显示一个 id 号会给出重复的数据
- docker - Autossh docker 将端点暴露给主机和容器
- java - JAVA如何存储搜索结果和显示数据
- node.js - 保存时Docker Nodemon未启动
- elasticsearch - Elasticsearch NEST 客户端 ReindexOnServer 类型问题
- android - 当应用程序完全终止时接收 DATA 消息的解决方法。颤振火力基地