从库默认只读的意义
replica-read-only 默认为 yes,从库会拒绝所有写命令并返回 READONLY 错误,这是防止「从库被当成主库写」的第一道保护。把它设为 no 后,从库可以接受本地写入,但这些数据不会同步到主库,其他节点也无从感知。更关键的是:一旦该从库重新执行全量同步(首次同步、积压缓冲不足触发重新同步、被重新挂载等),本地写入的数据会被主库的数据集整体覆盖。
基本信息
| 默认值 | replica-read-only yes |
|---|---|
| 改为 no | 从库接受写入,但不参与复制传播 |
| 主要风险 | 全量同步时本地写入被整体覆盖 |
| 典型报错 | READONLY You can't write against a read only replica |
| 适用范围 | 只适合临时缓存类、可随时丢失的数据 |
典型使用场景
- 临时在从库上做数据校验时打标记的权宜做法
- 迁移期把从库当独立实例预热本地缓存,接受可丢
- 排查 READONLY 报错:确认客户端是否误连了从库
- 演练「有人误写从库」的后果,用事实验证风险
- 评估是否应该改用独立实例,而不是让从库承担写入
示例与后果
示例与后果
redis-cli CONFIG GET replica-read-only
redis-cli -h <从库> SET local:cache 1 # 默认返回 READONLY 错误
redis-cli -h <从库> CONFIG SET replica-read-only no
redis-cli -h <从库> INFO replication | grep -E 'role|master_link_status'
# 该从库一旦发生全量同步,上面写入的键会被主库数据集覆盖
redis-cli -h <从库> CONFIG REWRITE # 用完记得改回并落盘写入后果对照
| 场景 | 数据是否保留 | 说明 |
|---|---|---|
| 从库可写并写入 | 保留到下次全量同步 | 不参与复制,主库完全不知情 |
| 发生全量同步 | 被覆盖 | 主库数据集整体替换本地数据 |
| 旧从库被提升为主库 | 取决于是否被覆盖过 | 数据可能既没同步也没备份 |
| 保持只读 | 拒绝写入 | 客户端得到 READONLY 报错 |
从库可写只适合临时缓存类、可随时重建的数据。把持久业务数据写到从库属于设计错误:它既不在复制链路上,也不会进入基于主库的备份,故障时没有任何可靠的恢复路径。