K8s环境下Jedis如何实现Redis集群动态拓扑刷新?
Jedis实现Redis集群动态拓扑刷新的方案
Jedis 4.0及以上版本已经原生提供了集群拓扑自动刷新能力,无需额外定制开发,适配K8s环境下Redis节点IP变更的场景,具体配置分两种场景:
一、原生Jedis使用场景
构造JedisCluster实例时,通过ClusterTopologyRefreshOptions配置开启刷新能力即可,代码示例:
// 配置拓扑刷新规则 ClusterTopologyRefreshOptions refreshOptions = ClusterTopologyRefreshOptions.builder() // 开启定时刷新,间隔可自定义,此处设为5分钟 .enablePeriodicRefresh(Duration.ofMinutes(5)) // 开启自适应刷新,遇到MOVED/ASK重定向、未知节点等异常时自动触发刷新 .enableAdaptiveRefreshTrigger( ClusterTopologyRefreshOptions.RefreshTrigger.MOVED_REDIRECT, ClusterTopologyRefreshOptions.RefreshTrigger.ASK_REDIRECT, ClusterTopologyRefreshOptions.RefreshTrigger.UNKNOWN_NODE) // 固定用初始配置的负载均衡域名拉取拓扑,不要用集群返回的节点IP作为刷新源 .dynamicRefreshSources(false) .build(); // 绑定刷新配置到集群配置 JedisClusterConfig clusterConfig = new JedisClusterConfig(); clusterConfig.setTopologyRefreshOptions(refreshOptions); // 初始化JedisCluster,仅传入负载均衡域名即可 Set<HostAndPort> nodes = Collections.singleton(new HostAndPort("prod-redis-cluster.xyz.com", 6379)); JedisCluster jedisCluster = new JedisCluster(nodes, clusterConfig);
dynamicRefreshSources设为false是K8s场景的核心配置,可避免Jedis缓存旧的节点IP导致刷新失效。
二、Spring Data Redis集成Jedis场景
如果使用Spring Boot集成Jedis,可直接通过yaml配置实现:
spring: redis: cluster: nodes: prod-redis-cluster.xyz.com:6379 timeout: 150ms jedis: cluster: refresh: # 开启自适应刷新 adaptive: true # 定时刷新周期 period: 5m # 关闭动态刷新源,固定用配置的域名拉取拓扑 dynamic-refresh-sources: false
如果需要代码自定义更精细的刷新规则,可通过注入JedisClientConfiguration实现:
@Bean public JedisClientConfiguration jedisClientConfiguration() { ClusterTopologyRefreshOptions refreshOptions = ClusterTopologyRefreshOptions.builder() .enablePeriodicRefresh(Duration.ofMinutes(5)) .enableAdaptiveRefreshTrigger( ClusterTopologyRefreshOptions.RefreshTrigger.MOVED_REDIRECT, ClusterTopologyRefreshOptions.RefreshTrigger.ASK_REDIRECT, ClusterTopologyRefreshOptions.RefreshTrigger.UNKNOWN_NODE) .dynamicRefreshSources(false) .build(); return JedisClientConfiguration.builder() .clusterTopologyRefreshOptions(refreshOptions) .connectTimeout(Duration.ofMillis(150)) .build(); }
低版本Jedis兼容方案
如果使用的是Jedis 4.0以下版本,没有原生拓扑刷新能力,建议优先升级Jedis版本到4.0+;如果不能升级,可以自定义定时任务,每隔固定周期重新构造JedisCluster实例替换旧实例,替换时需要做好旧实例的连接资源释放,避免连接泄漏。
内容的提问来源于stack exchange,提问作者jagannathan rajagopalan
相关产品推荐
相关产品推荐

