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

从节点连接主节点必须用 ACL 用户,不能靠 default 或 requirepass
Redis 6.0+ 启用 ACL 后,default 用户若被修改(比如加了 -@all 或限制键空间),从节点 handshake 就会失败,报错看似是 NOAUTH Authentication required,实则是认证通过但后续命令被拒。根本原因:从节点在 PSYNC/SYNC 阶段发起的连接和普通客户端一样,需完整走 AUTH 流程,不继承主节点上下文。
旧版靠 masterauth 单密码的方式已失效——它只对 default 用户生效,无法透传 ACL 用户凭据。所以必须显式配置从节点的 masteruser 和 masterauth,且该用户必须提前在主节点上创建并授权。
-
masteruser必须是主节点上已存在的 ACL 用户名,不能是default -
masterauth是该用户的密码,不是主节点的requirepass - 主节点配置里删掉
requirepass或保留都行,但它对复制无效
复制专用用户必须显式授予 +replconf +psync +sync +ping
只给 +@all 或 +@read 不够。因为 replconf 和 psync 属于底层协议命令,不在标准权限分类里,ACL 不自动包含它们。漏掉任一命令,从节点日志就会反复出现 Failed to AUTH with master: -NOAUTH Authentication required——其实是认证成功,但执行 REPLCONF 时被拒绝。
最小必要命令集就是这四个:+replconf、+psync、+sync、+ping。如果主节点启用了 replica-announce-ip/replica-announce-port,还需加 +client(用于 CLIENT SETINFO)。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 禁止给该用户写权限:
-@write必须加上,防止从节点意外触发写操作 - 键空间必须放开:
~*,否则同步时读不到 key - 示例命令:
ACL SETUSER repl_user on >$(redis-cli ACL GENPASS) ~* +replconf +psync +sync +ping -@write
从节点自身要设为 readonly,且不能靠 config set 临时生效
CONFIG SET readonly yes 只在当前进程有效,重启即失效。正确做法是在从节点的 redis.conf 中写死:replica-read-only yes(Redis 5.0+ 推荐用这个,旧版用 slave-read-only yes)。这个配置决定从节点是否接受写命令,和 ACL 无关——即使 ACL 给了写权限,只要 replica-read-only 为 yes,写操作仍会返回 (error) READONLY You can't write against a read only replica。
- 该配置必须在从节点启动前设置,不能靠运行时命令持久化
- 检查是否生效:
redis-cli info replication | grep replica_read_only返回1 - 注意:这个只禁写,不防连;真正的访问控制还得靠 ACL + bind + 防火墙组合
ACL reload 或配置变更后容易中断复制
ACL 规则不是静态快照,而是实时生效的。如果用 ACL LOAD 重载 users.acl 文件,或用 ACL SETUSER 动态修改用户,只要改动波及复制用户(比如误删命令、改错密码、缩小键空间),复制立刻断开,且不会自动重试——从节点会卡在 master_link_status:down 状态,直到手动 REPLICAOF 或重启。
最容易被忽略的是:default 用户哪怕没动过,一旦你启用了 ACL(比如加了第一个用户),Redis 就默认把 default 当作“可能被改过”的状态,后续 reload 时若没显式保留它的复制权限,就会丢掉 +replconf 等关键命令。
- 安全做法:ACL 文件里始终显式定义
default用户的最小复制权限,或干脆禁用它(ACL SETUSER default off) - 每次 ACL 变更后,用
ACL LIST检查复制用户权限是否完整 - 别依赖日志里的 “NOAUTH” 字样判断问题根源——先看
INFO REPLICATION的master_link_status和master_last_io_seconds_ago

















