哨兵模式下acl不自动同步,必须为每个redis实例(主/从)单独配置并执行acl save持久化,否则故障转移后新主节点因无acl规则导致客户端认证失败。

哨兵模式下 ACL 不自动同步,必须逐节点配置
Redis 哨兵(Sentinel)本身不参与数据访问,它只监控主从状态并做故障转移;ACL 是 Redis 实例自身的权限机制,每个 Redis 服务进程(包括主节点、从节点)都独立加载和维护自己的 ACL 规则。你在主节点上执行 ACL SETUSER app_svc on >p123 ~app:* +@read,从节点完全不会感知——哪怕哨兵刚把它提升为主节点,它仍只有默认 default 用户,客户端连过去就会报 NOAUTH Authentication required 或 NOPERM。
常见错误现象:
- 客户端用
AUTH app_svc p123连主节点成功,但故障转移后连接新主(原从节点)失败 - 哨兵日志里反复出现
+switch-master,但业务侧开始大量NOAUTH报错 -
ACL GETUSER app_svc在主节点能查到,在从节点返回空
解决方案只能是:对每个 Redis 实例(无论当前角色是主还是从),都单独执行 ACL 配置 + 持久化。不能只配主节点,也不能依赖哨兵“帮忙同步”。
配置前必须统一 aclfile 路径并启用文件持久化
哨兵环境通常有多个 Redis 实例分布在不同机器或端口,如果各节点的 redis.conf 中 aclfile 路径不一致(比如有的写 /etc/redis/acl.conf,有的写 /var/lib/redis/acl.acl),即使你用脚本批量执行了 ACL SETUSER,重启后也会因找不到对应文件而丢失全部 ACL 设置。
必须确保:
- 所有 Redis 实例的
redis.conf中显式声明相同路径:aclfile /etc/redis/acl.conf - 该路径所在目录对 redis 进程用户(如
redis)有读写权限 - 首次配置完后,必须在每个节点上运行
ACL SAVE,把内存规则刷入aclfile - 后续修改建议优先用
ACL LOAD(重载文件),而非反复SETUSER,避免手动遗漏
验证方式:登录任一节点执行 CONFIG GET aclfile 和 ACL LIST,确认路径一致且用户存在。
哨兵客户端连接时必须显式传用户名,不能只靠 AUTH password
旧式 AUTH password 本质是隐式认证 default 用户。哨兵模式下,客户端(如 Jedis、Lettuce)通常通过 sentinel:// URL 初始化,底层会先连哨兵获取当前主地址,再连主节点——但这个“再连”的过程不会自动带上你之前在别的连接里用过的用户名。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
所以:
- Jedis 必须用
JedisSentinelPool配合JedisClientConfig显式设置 user/password,Jedis 3.x 不支持,需升到 4.0+ - Lettuce 推荐用
RedisURI.Builder构造带username和password的 URI:redis://app_svc:p123@127.0.0.1:26379 - redis-cli 测试时不能只写
redis-cli -h sentinel-host -p 26379,得用--user app_svc --pass p123并指定目标 Redis 地址(哨兵不处理 ACL 认证)
漏掉用户名参数,连接会 fallback 到 default 用户,而你很可能已执行过 ACL SETUSER default off 来禁用默认账户——结果就是直接拒绝连接。
监控与运维账号必须额外授权 @cluster 和 @admin 子集
哨兵环境离不开人工干预和自动化巡检。如果你给监控脚本配的用户只给了 +@read ~monitor:* ,它连 INFO replication 都可能失败,因为部分信息需要 @admin 或 @dangerous 分类里的命令(如 ROLE、CLIENT LIST)。更关键的是:哨兵自身不提供集群拓扑,客户端 SDK(如 redis-py)初始化时会尝试发 CLUSTER NODES ——这属于 @cluster 类别,没授权就直接初始化失败。
最小可用监控用户示例:
ACL SETUSER monitor on >m0n1t0r ~* +@read +@admin +@cluster -FLUSHDB -FLUSHALL
注意:
-
~*是必须的,否则INFO返回的 key(如master_host)无法匹配 -
+@cluster才能让 SDK 正确识别当前是哨兵模式而非集群模式 -
+@admin包含CLIENT LIST、SLOWLOG等运维刚需,但记得用-显式禁掉SHUTDOWN、DEBUG等高危命令 - 别忘了给哨兵进程自己配一个专用用户(通过
sentinel auth-pass),它和 Redis 实例的 ACL 是两套体系
最易被忽略的一点:哨兵模式下没有“集群重定向”,但 ACL 权限校验发生在每个 Redis 实例连接建立瞬间——这意味着哪怕只漏配一个从节点,故障转移后整个服务权限链就断了。










