You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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集群状态健康,各项指标均符合预期。

解决建议

  1. 检查目标槽位的归属状态
    直接在Redis集群任意节点执行CLUSTER SLOTS命令,确认槽位12004是否被正确分配至某个主节点,是否存在槽位未分配、处于迁移中或丢失的情况。

  2. 优化拓扑刷新策略

    • 缩短周期性刷新间隔,比如调整为10秒,加快客户端获取集群拓扑变更的速度;
    • 开启动态拓扑源刷新,允许客户端从任意集群节点获取拓扑信息,避免依赖单一节点导致的信息不全:
      ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
          .enablePeriodicRefresh(Duration.ofSeconds(10))
          .enableAllAdaptiveRefreshTriggers()
          .dynamicRefreshSources(true)
          .build();
      
  3. 调整连接池参数
    当前连接池maxTotal和maxIdle设置可能无法应对高并发场景,导致无法获取对应节点的连接。可尝试调高参数,例如:

    genericObjectPoolConfig.setMinIdle(16);
    genericObjectPoolConfig.setMaxIdle(32);
    genericObjectPoolConfig.setMaxTotal(32);
    
  4. 验证集群网络连通性
    检查客户端所在服务器是否能ping通所有Redis集群节点(主+从),同时确认端口是否开放,避免网络分区导致客户端无法获取完整拓扑。

  5. 升级Lettuce版本
    尝试升级至Lettuce 6.2.x系列稳定版本,新版本修复了部分集群拓扑同步相关的已知bug,可能解决此问题。

内容的提问来源于stack exchange,提问作者Mandeep jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:15:31