Redis从节点可以设置禁止写入吗?

作者:袖梨 2026-08-31

Redis从节点默认启用只读保护,由slave-read-only(或replica-read-only)配置控制,运行时通过INFO replication查看role=slave且slave_read_only=1确认,客户端写命令会报错“READONLY You can't write against a read only slave”。

可以,但必须明确:Redis从节点的写入控制只靠 slave-read-only(或新版 replica-read-only)配置项,且它只对客户端写命令生效,不防内部操作或管理命令。

这个配置不是“可选功能”,而是默认开启的安全基线——自 Redis 2.6 起,所有从节点默认就是 slave-read-only yes,一旦启用主从复制,客户端执行 SETDEL 等写命令就会直接报错:(error) READONLY You can't write against a read only slave.


怎么确认从节点已启用只读保护

别只看配置文件,运行时状态才作数:

  1. 检查配置文件中是否设置了 slave-read-only yes(Redis replica-read-only yes(Redis ≥ 5.0),注意旧版参数名在新版本中仍兼容,但推荐统一用新名
  2. 连接从节点后执行 CONFIG GET slave-read-onlyCONFIG GET replica-read-only,返回值必须是 "yes"
  3. 执行 INFO replication,确认 role:slavemaster_host 非空;若显示 role:master,说明已脱离复制拓扑,该配置失效

为什么改了配置还是能写?常见误判点

报错消失 ≠ 写入被允许,很多“能写”其实是绕过了只读限制:

  1. slave-read-only no 是危险操作,仅用于极少数临时调试场景,重启后失效(除非写入配置文件并重载)
  2. CONFIG SET slave-read-only no 可动态关闭,但不持久化,服务重启即恢复默认 yes
  3. SLAVEOF NO ONE 会让从节点升为主节点,角色变更后 slave-read-only 不再起作用——此时它已是主,自然可写
  4. CONFIGDEBUGMODULE 等管理命令默认仍可用,哪怕只读模式下也能执行 CONFIG SET 修改自身配置,必须配合 rename-command 或 ACL 禁用

Redis Cluster 中从节点的只读行为不一样

Cluster 模式下没有传统 slave-read-only 这个配置项,它的只读是硬编码逻辑:

  1. Cluster 的从节点(replica)默认拒绝所有客户端写命令,无论配置如何,slave-read-only 参数在 Cluster 中完全无效
  2. 只读由 CLUSTER REPLICATE <node-id> 建立关系后自动触发,无法通过 config 命令关闭
  3. 想让 Cluster 从节点接受写入?不行。唯一合法方式是执行 CLUSTER FAILOVER 触发故障转移,让它变成 master —— 但这属于拓扑变更,不是“解除只读”

真正要防住写入,光靠 slave-read-only 不够

它只拦普通客户端命令,不拦三类风险:

  1. ACL 用户权限未收敛:即使只读模式,若用户有 +@all 权限,仍可执行 CONFIG SET 关闭只读
  2. 未禁用危险命令:CONFIGDEBUGMODULE 等默认开放,应通过 rename-command CONFIG "" 或 ACL 显式屏蔽
  3. 运维误操作:比如用 redis-cli -h slave-host -p 6379 直连后执行 SLAVEOF NO ONE,瞬间打破只读边界

线上环境必须把 slave-read-only yes 写死在配置文件里,配合 ACL 锁死管理命令,并监控 INFO replication 中的 roleslave_read_only 字段变化。任何“从节点变可写”,基本都源于角色切换或权限失控,而不是只读开关本身失灵。

相关文章

精彩推荐