Tag - spring boot

redis spring boot    2019-04-18 09:47:47    20    0    0

今天在测试redis节点主备切换时出现了大量连接超时的情况,正常情况下redis客户端连接到任意可用server入口节点都可以获取到整个集群的拓扑,一旦集群节点有变动也会迅速刷新拓扑,保证高可用性。

测试集群共有4主,4备,经检查发现4台备节点被运维迁移了,程序使用的一半是老地址,但是这也无法解释超时的问题(上面说过,成功连接到一台就可以获取整个集群的拓扑)。

经过调试发现,SpringBoot2默认使用Lettuce 作为redis客户端,在默认配置下关闭了拓扑更新功能。。。 上面说过,超时是在主从切换的时候出现的,也就是之前的从节点全部失效,主节点又变为了从节点,而Lettuce为了保证一致性默认只从主节点读写数据(开启从节点读可以参考这里),而拓扑没有更新导致读写主节点(其实已经是从节点了)重定向到当前拓扑不存在的节点,Lecttuce无法使用非集群中的节点,导致超时

  1. public class ClusterTopologyRefreshOptions {
  2. public static final boolean DEFAULT_PERIODIC_REFRESH_ENABLED = false; //定时更新关闭
  3. public static final long DEFAULT_REFRESH_PERIOD = 60;
  4. public static final TimeUnit DEFAULT_REFRESH_PERIOD_UNIT = TimeUnit.SECONDS;
  5. public static final Duration DEFAULT_REFRESH_PERIOD_DURATION = Duration.ofSeconds(DEFAULT_REFRESH_PERIOD);
  6. public static final boolean DEFAULT_DYNAMIC_REFRESH_SOURCES = true;
  7. public static final Set<RefreshTrigger> DEFAULT_ADAPTIVE_REFRESH_TRIGGERS = Collections.emptyS