Lettuce一定要打开redis集群拓扑刷新功能

在使用Lettuce访问Redis的时候,一定要记得打开它的Redis 集群拓扑刷新功能,否则他压根就不存在高可用。因为他的集群拓扑刷新功能是默认没开启的。

上面的3个文章其实说的就是这个事情,在redis集群拓扑结构发生变化,比如Redis的master挂掉了后,lettuce的client端就会长时间不能恢复。因此可以通过下面的配置打开拓扑刷新功能:

	//默认超时时间, lettuce默认超时时间为60s太长了,此处默认设置为15s
	private Long timeoutInMillis = Duration.ofSeconds(15).toMillis();

	static ClusterClientOptions.Builder initDefaultClusterClientOptions(ClusterClientOptions.Builder builder) {
		ClusterTopologyRefreshOptions defaultClusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
				//开启集群拓扑结构周期性刷新,和默认参数保持一致
				.enablePeriodicRefresh(60, TimeUnit.SECONDS)
				//开启针对{@link RefreshTrigger}中所有类型的事件的触发器
				.enableAllAdaptiveRefreshTriggers()
				//和默认一样,30s超时,避免短时间大量出现刷新拓扑的事件
				.adaptiveRefreshTriggersTimeout(30, TimeUnit.SECONDS)
				//和默认一样重连5次先,然后在刷新集群拓扑
				.refreshTriggersReconnectAttempts(5)
				.build();

		return builder
				// 配置用于开启自适应刷新和定时刷新。如自适应刷新不开启,Redis集群变更时将会导致连接异常
				.topologyRefreshOptions(defaultClusterTopologyRefreshOptions)
				//默认就是重连的,显示定义一下
				.autoReconnect(true)
				//和默认一样最大重定向5次,避免极端情况无止境的重定向
				.maxRedirects(5)
				//Accept commands when auto-reconnect is enabled, reject commands when auto-reconnect is disabled.
				.disconnectedBehavior(ClientOptions.DisconnectedBehavior.DEFAULT)
				.socketOptions(SocketOptions.builder().keepAlive(true).tcpNoDelay(true).build())
				//取消校验集群节点的成员关系
				.validateClusterNodeMembership(false);
	}

	public static ClusterClientOptions.Builder getDefaultClusterClientOptionBuilder() {
		return initDefaultClusterClientOptions(ClusterClientOptions.builder());
	}

上面的配置其实就是修改默认的连接参数,打开集群拓扑刷新功能。其中有几个比较重要的地方,redis的默认超时时间是1分钟,其实这个时间太长了,很多的时候几秒钟就可以了,我这里是改为了15秒。 另外一个比较重要的参数就是validateClusterNodeMembership,这个大家一定要注意,默认这个属性是true的,也就是你的redis cluster集群增加一个redis节点,Lettuce默认是不信任这个节点的, 因此在内网的情况下,我们基本上都要关闭这个功能。也就是:validateClusterNodeMembership(false);

comments powered by Disqus