Redis集群操作遇PartitionSelectorException:无法确定槽分区求助
Redis Cluster操作中遇到PartitionSelectorException异常的问题
异常堆栈信息
Caused by: io.lettuce.core.cluster.PartitionSelectorException: Cannot determine a partition for slot 12004. at io.lettuce.core.cluster.PooledClusterConnectionProvider.getWriteConnection(PooledClusterConnectionProvider.java:164) at io.lettuce.core.cluster.PooledClusterConnectionProvider.getConnectionAsync(PooledClusterConnectionProvider.java:149) at io.lettuce.core.cluster.ClusterDistributionChannelWriter.doWrite(ClusterDistributionChannelWriter.java:170) at io.lettuce.core.cluster.ClusterDistributionChannelWriter.write(ClusterDistributionChannelWriter.java:103) at io.lettuce.core.RedisChannelHandler.dispatch(RedisChannelHandler.java:218) at io.lettuce.core.cluster.StatefulRedisClusterConnectionImpl.dispatch(StatefulRedisClusterConnectionImpl.java:216) at io.lettuce.core.AbstractRedisAsyncCommands.dispatch(AbstractRedisAsyncCommands.java:676) at io.lettuce.core.AbstractRedisAsyncCommands.get(AbstractRedisAsyncCommands.java:960) at sun.reflect.GeneratedMethodAccessor425.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.lettuce.core.cluster.ClusterFutureSyncInvocationHandler.handleInvocation(ClusterFutureSyncInvocationHandler.java:122) at io.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80) at com.sun.proxy.$Proxy254.get(Unknown Source) at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.get(LettuceStringCommands.java:68)
代码配置
拓扑刷新配置
ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder() .enablePeriodicRefresh(Duration.ofSeconds(30)) .enableAllAdaptiveRefreshTriggers() .build();
客户端选项配置
ClientOptions options = ClusterClientOptions.builder() .disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS) .autoReconnect(true) .topologyRefreshOptions(topologyRefreshOptions) .build();
连接池配置
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig(); genericObjectPoolConfig.setMinIdle(8); genericObjectPoolConfig.setMaxIdle(16); genericObjectPoolConfig.setMaxTotal(16); LettucePoolingClientConfiguration.builder() .poolConfig(genericObjectPoolConfig) .clientOptions(options) .clientResources(clientResources) .build();
环境信息
- Lettuce版本:6.1.5.RELEASE
- Redis版本:5.0.6
- 分片数:6
- 节点总数:12
当前分析
Redis集群状态健康,各项指标均符合预期。
解决建议
检查目标槽位的归属状态
直接在Redis集群任意节点执行CLUSTER SLOTS命令,确认槽位12004是否被正确分配至某个主节点,是否存在槽位未分配、处于迁移中或丢失的情况。优化拓扑刷新策略
- 缩短周期性刷新间隔,比如调整为10秒,加快客户端获取集群拓扑变更的速度;
- 开启动态拓扑源刷新,允许客户端从任意集群节点获取拓扑信息,避免依赖单一节点导致的信息不全:
ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder() .enablePeriodicRefresh(Duration.ofSeconds(10)) .enableAllAdaptiveRefreshTriggers() .dynamicRefreshSources(true) .build();
调整连接池参数
当前连接池maxTotal和maxIdle设置可能无法应对高并发场景,导致无法获取对应节点的连接。可尝试调高参数,例如:genericObjectPoolConfig.setMinIdle(16); genericObjectPoolConfig.setMaxIdle(32); genericObjectPoolConfig.setMaxTotal(32);验证集群网络连通性
检查客户端所在服务器是否能ping通所有Redis集群节点(主+从),同时确认端口是否开放,避免网络分区导致客户端无法获取完整拓扑。升级Lettuce版本
尝试升级至Lettuce 6.2.x系列稳定版本,新版本修复了部分集群拓扑同步相关的已知bug,可能解决此问题。
内容的提问来源于stack exchange,提问作者Mandeep jain
相关产品推荐
相关产品推荐

