redis 6.0主从复制必须使用专用acl用户(如repl_user),禁用default用户;从节点需配置masteruser和masterauth,并显式授予+replconf、+psync、+sync、+ping权限及~*键空间,否则握手失败。

Redis 6.0 主从复制必须用专用 ACL 用户,不能复用 default 或业务账号;否则从节点握手失败,报错看似是认证问题(如 NOAUTH Authentication required),实则是权限缺失导致同步命令被拒。
从节点连接必须显式配置 masteruser + masterauth
旧版靠 masterauth 单密码的方式在 ACL 启用后已失效。从节点配置里若只写 masterauth foobar,它会尝试以 default 用户身份登录——而一旦你改过 default 权限(哪怕只是加了 -@all),连接立刻失败。
-
masteruser必须设为一个真实存在的、专用于复制的用户(如repl_user) -
masterauth必须是该用户的密码(不是requirepass值) - 配置方式:可在从节点
redis.conf中写入,或运行时执行CONFIG SET masteruser repl_user和CONFIG SET masterauth "xxx" - 重启或重连后生效,不需重启整个 Redis 进程
repl_user 必须手动授予底层同步命令
仅给 +@all 或 +@admin 不够。Redis 复制协议依赖几个未归类进标准命令集的底层指令,ACL 不自动包含它们。
- 最小必要权限集合:
+replconf+psync+sync+ping - 键空间必须放开:
~*(不能写成~app:*等受限模式) - 务必禁用写权限:
-@write(防止从节点意外执行写命令破坏一致性) - 若主节点启用了
replica-announce-ip/port,还需加+client(用于CLIENT SETINFO)
创建示例:ACL SETUSER repl_user on >$(redis-cli ACL GENPASS) ~* +replconf +psync +sync +ping -@write
别动 default 用户,或至少保留它的复制能力
即使你不打算用 default,只要它存在且被修改过(比如删掉了 +ping),从节点在未指定 masteruser 时仍会 fallback 到它,然后因缺权限失败。
- 最稳妥做法:显式重置
default并补全复制所需命令:ACL SETUSER default +replconf +psync +sync +ping - 或者干脆禁用:
ACL SETUSER default off,并确保所有从节点都配了masteruser -
ACL LOAD或ACL SAVE后记得检查default状态,reload ACL 文件可能意外覆盖它
真正容易被忽略的是:从节点日志里反复出现 Failed to AUTH with master,不代表密码错了,大概率是 repl_user 缺了 +replconf 或键空间没开到 ~* —— 这个错误信息极具误导性,得看主节点的 ACL LOG 才能定位到具体被拒的命令。











