苍老的岁月 2021-09-27 22:39 采纳率: 50%
浏览 448
已结题

k8s部署Redis集群,节点重启pod IP变化,Java代码不能自动连接到新的pod IP,如何自动刷新?

k8s部署redis集群,节点重启pod ip变化,java代码不能自动获取到新的pod ip,导致redis集群不可用。
技术栈:spring cloud
目前是通过JedisCluster获取到redis集群的节点,再配置到redis集群。

try (JedisCluster jedisCluster = new JedisCluster(ipAndPortSet, 10000, 10000, RedisConstants.MAX_RE_DIRECTIONS, password, new JedisPoolConfig())) {
    Map<String, JedisPool> jedisPoolMap = jedisCluster.getClusterNodes();
    for (String hostAndPort : jedisPoolMap.keySet()) {
        String[] hostAndPortArray = hostAndPort.split(":");
         RedisNode redisNode = new RedisNode(hostAndPortArray[0], Integer.parseInt(hostAndPortArray[1]));
         redisNodes.add(redisNode);
    }
}

RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
redisClusterConfiguration.setClusterNodes(redisNodes);
redisClusterConfiguration.setPassword(password);
redisClusterConfiguration.setMaxRedirects(RedisConstants.MAX_RE_DIRECTIONS);
return new LettuceConnectionFactory(redisClusterConfiguration, lettuceClientConfiguration);
  • 写回答

2条回答 默认 最新

  • 苍老的岁月 2021-09-28 19:02
    关注

    使用这种方式配置k8s容器板redis 集群。

    针对集群节点发生变化,使用lettuce自适应刷新

            GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
            genericObjectPoolConfig.setMaxTotal(redisPropertiesConfig.getPoolMaxTotal());
            genericObjectPoolConfig.setMaxIdle(redisPropertiesConfig.getPoolMaxIdle());
            genericObjectPoolConfig.setMinIdle(redisPropertiesConfig.getPoolMinIdle());
    
            //支持自适应集群拓扑试图刷新
            ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
                    //.enablePeriodicRefresh(Duration.ofSeconds(5))
                    .enableAllAdaptiveRefreshTriggers()
                    .adaptiveRefreshTriggersTimeout(Duration.ofSeconds(30))
                    //.enablePeriodicRefresh(Duration.ofSeconds(10))
                    .build();
    
            ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder()
                    .timeoutOptions(TimeoutOptions.enabled(Duration.ofSeconds(connTimeout)))
                    .autoReconnect(true)
                    //.pingBeforeActivateConnection(Boolean.TRUE)
                    //.cancelCommandsOnReconnectFailure(Boolean.TRUE)
                    //.disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS)
                    .topologyRefreshOptions(clusterTopologyRefreshOptions).build();
    
            LettuceClientConfiguration lettuceClientConfiguration = LettucePoolingClientConfiguration.builder()
                    .poolConfig(genericObjectPoolConfig)
                    //.readFrom(ReadFrom.NEAREST)
                    .clientOptions(clusterClientOptions).build();
    
            RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(Arrays.asList(serversArray));
            redisClusterConfiguration.setPassword(password);
            redisClusterConfiguration.setMaxRedirects(RedisConstants.MAX_RE_DIRECTIONS);
            lettuceConnectionFactory = new LettuceConnectionFactory(redisClusterConfiguration, lettuceClientConfiguration);
            return lettuceConnectionFactory;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月28日
  • 已采纳回答 9月28日
  • 创建了问题 9月27日

悬赏问题

  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥200 求能开发抖音自动回复卡片的软件
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。