Redis 6.0+主从复制必须使用专用ACL用户,禁用default用户;从节点需配置masteruser和masterauth,权限须显式授予+replconf、+psync、+sync、+ping且键空间为~*,否则握手失败。

主节点必须显式创建 ACL 用户,不能只靠 requirepass
Redis 6.0+ 启用 ACL 后,requirepass 对主从复制已失效——它只作用于 default 用户,而从节点连接时不会自动以 default 身份登录。如果你只配了 requirepass,但从节点又没设 masteruser,它会尝试用空用户名 + masterauth 密码去认证 default,一旦 default 被禁用(比如执行过 ACL SETUSER default off),就会卡在 NOAUTH Authentication required。
正确做法是:在主节点上用 ACL SETUSER 创建专用用户,例如:
ACL SETUSER repl_user on >secret123 ~* +replconf +psync +sync +ping -@write
然后执行 ACL SAVE 持久化,否则重启后配置丢失。
从节点的 masteruser 和 masterauth 必须匹配 ACL 用户名和密码
masterauth 不再是“单密码”,而是“用户名:密码”格式(仅当使用 ACL 用户时)。很多团队沿用旧习惯,在从节点配置里写:
masterauth secret123
这会导致从节点仍试图以 default 用户身份认证,而非你创建的 repl_user。必须改成:
masterauth "repl_user:secret123"
注意双引号包裹,且中间是英文冒号。该配置需写入从节点 redis.conf 并重启生效;运行时用 CONFIG SET masterauth 只能临时生效,重启即丢。
- 如果主节点
default用户被关闭(off),但从节点仍用纯密码方式,复制握手必然失败 -
masteruser值必须与主节点上ACL SETUSER定义的用户名完全一致(大小写敏感) - 密码中若含特殊字符(如
$、@),建议用redis-cli ACL GENPASS生成,避免手动转义出错
ACL 权限缺一不可:+replconf +psync +sync +ping 是硬性要求
只给 +@all 或 +@read 不够。因为 replconf 和 psync 属于底层协议命令,不在任何标准命令分类(@read/@admin)中,ACL 不自动包含它们。漏掉任一个,从节点日志会反复打印:
Failed to AUTH with master: -NOAUTH Authentication required
实际是认证成功了,但在执行 REPLCONF listening-port 或 PSYNC 时被拒绝。最小必要集合就是这四个:
-
+replconf:用于从节点上报端口、缓冲区状态等元信息 -
+psync和+sync:触发全量或增量同步的核心命令 -
+ping:心跳探测,主节点用它判断从节点存活 - 若主节点启用了
replica-announce-ip或replica-announce-port,还需加+client(用于CLIENT SETINFO)
键空间权限必须放开为 ~*,且禁止写权限
从节点同步时需要读取所有 key,包括内部 key(如 __redis__:sync 等),所以 ACL 中的键模式必须是 ~*,不能是 ~app:* 这类受限前缀。否则会出现同步卡住、部分 key 漏同步、甚至握手直接中断。
同时必须显式禁用写权限:-@write。这不是可选项——即使从节点本身配置了 replica-read-only yes,ACL 层若保留 +@write,仍可能在某些异常路径下触发写操作(如模块加载、Lua 脚本误用),破坏数据一致性。
典型错误配置:
ACL SETUSER repl_user on >pwd ~app:* +replconf +psync +sync +ping
这里 ~app:* 键空间太窄,-@write 缺失,都属于高危配置。
最易被忽略的一点:ACL 规则顺序不重要,但 ~* 和 -@write 必须显式写出。很多人以为 +@all 包含全部键空间和全部命令,其实它只代表命令集,键空间默认为空,不加 ~* 就等于没授权任何 key。


















