使用Lettuce 6.0.x连接带TLS的Redis集群失败求助
问题分析与解决
从错误信息ERR command is not allowed来看,核心问题是Lettuce在获取Redis集群拓扑信息时,执行的集群相关命令被拒绝,主要有两种可能性:账号权限不足,或者Lettuce的拓扑刷新逻辑未正确处理认证/命令权限。
解决步骤
1. 验证账号的集群命令权限
先通过redis-cli验证连接账号是否能执行集群拓扑命令:
# 连接集群后执行 CLUSTER SLOTS
如果返回ERR command is not allowed,说明账号缺少集群命令权限,需要给账号授权:
- 如果Redis使用ACL:
(ACL SETUSER your_username ON >your_password +@cluster +@read+@cluster表示授予所有集群相关命令权限,可根据实际需求调整) - 如果Redis使用传统
requirepass配置,确认requirepass和masterauth已正确设置,且默认用户有权限执行集群命令。
2. 修正Lettuce的RedisURI配置
确保SSL连接的URI配置正确,建议直接使用rediss协议(SSL专用)构建URI,替代redis()加withSsl(true)的方式:
RedisURI redisUri = RedisURI.Builder.rediss(enterpriseConfig.getEndpoint()) .withAuthentication(userName, password) .withPort(port) .build();
3. 调整拓扑刷新的命令来源
如果集群禁用了CLUSTER命令,但允许INFO命令,可以配置Lettuce使用INFO获取拓扑信息:
ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder() .enablePeriodicRefresh() .enableAllAdaptiveRefreshTriggers() .refreshTriggersReconnectAttempts(3) .useInfoForRefresh(true) // 启用INFO命令获取拓扑 .build();
4. 确认SSL配置正确性
检查buildSslOptions()方法的以下细节:
- 确保keystore和truststore的路径、密码、类型完全正确
- 确认keystore中包含完整的证书链(和redis-cli使用的
redis.example.com.chain.pem一致) - 确认truststore中包含Redis服务端证书的根CA(和redis-cli信任的CA一致)
5. 验证端口一致性
确认代码中使用的port变量和redis-cli连接时的端口一致(比如你步骤2中用的是6375,代码中是否正确设置了该端口)
内容的提问来源于stack exchange,提问作者JShao
相关产品推荐
相关产品推荐

