异常:
com.lambdaworks.redis.RedisException: java.lang.IllegalArgumentException: Connection to 192.168.60.59:7001 not allowed. This connection point is not known in the cluster view at com.lambdaworks.redis.cluster.PooledClusterConnectionProvider.getConnection(PooledClusterConnectionProvider.java:220) at com.lambdaworks.redis.cluster.ClusterDistributionChannelWriter.write(ClusterDistributionChannelWriter.java:85) at com.lambdaworks.redis.cluster.ClusterCommand.complete(ClusterCommand.java:38) at com.lambdaworks.redis.protocol.CommandHandler.decode(CommandHandler.java:211) at com.lambdaworks.redis.protocol.CommandHandler.channelRead(CommandHandler.java:185) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345) at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345) at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1294) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:911) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:572) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:513) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:427) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:399) at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:140) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.IllegalArgumentException: Connection to 192.168.60.59:7001 not allowed. This connection point is not known in the cluster view at com.lambdaworks.redis.cluster.PooledClusterConnectionProvider.invalidConnectionPoint(PooledClusterConnectionProvider.java:399) at com.lambdaworks.redis.cluster.PooledClusterConnectionProvider.getConnection(PooledClusterConnectionProvider.java:209) ... 27 common frames omitted
原因:
That's a security feature of Lettuce to prevent redirects to nodes that are not (yet) known through CLUSTER NODES
. The state can arise if the topology changes while your client has a different view. Lettuce loads the topology upon startup/the first cluster connection. Periodic/adaptive refresh can help or you disable validateClusterNodeMembership
in ClusterClientOptions
.See also https://github.com/lettuce-io/lettuce-core/wiki/Client-Options.
参考https://github.com/lettuce-io/lettuce-core/issues/731、https://groups.google.com/forum/#!msg/lettuce-redis-client-users/yks37yodyeE/zeis4aOVAgAJ
https://www.lizenghai.com/archives/42959.html
@ConditionalOnClass({ ClusterTopologyRefreshOptions.class, ClientOptions.class }) @ConditionalOnMissingBean public LettuceClientConfigurationBuilderCustomizer lettuceClientConfigurationBuilderCustomizer( RedisSDKProperties redisSDKProperties) { return clientConfigurationBuilder -> { ClusterTopologyRefreshOptions.RefreshTrigger[] refreshTriggers; Set<ClusterTopologyRefreshOptions.RefreshTrigger> refreshTriggersArray = redisSDKProperties .getClustertopology().getRefreshTriggers(); if (refreshTriggersArray.size() > 0) { refreshTriggers = refreshTriggersArray .toArray(new ClusterTopologyRefreshOptions.RefreshTrigger[refreshTriggersArray.size()]); } else { refreshTriggers = ClusterTopologyRefreshOptions.RefreshTrigger.values(); } ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder() .enableAdaptiveRefreshTrigger(refreshTriggers) .adaptiveRefreshTriggersTimeout(Duration .ofMillis(redisSDKProperties.getClustertopology().getAdaptiveRefreshTriggersTimeout())) .build(); ClientOptions clientOptions = ClusterClientOptions.builder() .topologyRefreshOptions(clusterTopologyRefreshOptions).build(); clientConfigurationBuilder.clientOptions(clientOptions); }; }