lettuce集群模式下RedisClusterClient异常:java.lang.IllegalArgumentException: Connection to x.x.x.x:x not allowed. This connection point is not known in the cluster view

异常:

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);
        };
    }

 

posted @ 2018-10-12 15:25  zbjice  阅读(2855)  评论(0编辑  收藏  举报