首页/数据/Redis 进阶速查/READONLY 错误:写错了实例
性能与排障129 条

READONLY 错误:写错了实例

READONLY 表示向副本发起了写命令:检查路由配置与故障切换后的主从指认,切换窗口内客户端配置未更新是常见原因。

Redis 进阶速查数据更新于 2026-10-13

READONLY 错误是什么

READONLY You can't write against a read only replica 表示写命令被发到了副本上。Redis 的主从复制是单向的,副本默认只读,所以这不是数据或权限问题,而是路由问题:要么客户端指向了副本,要么故障切换后仍指向已经降级为副本的旧主。

基本信息

错误文本READONLY You can't write against a read only replica
典型根因写请求发到副本,含切换后仍指向旧主
确认角色INFO replication 的 role 字段
拓扑查询CLUSTER NODES、CLUSTER SLOTS 或 Sentinel 的主库地址查询
副本开关replica-read-only 默认 yes
修复方向刷新拓扑后写新主,而不是改副本的可写开关

典型使用场景

  • 切换后报错定位:故障切换窗口内客户端仍指向旧主,是最常见的一幕
  • 发布期排查:只配置了单一地址的客户端在新拓扑下会持续报错
  • 代理层核对:确认代理是否跟随拓扑自动更新后端列表
  • 误操作核对:确认没有变更把主库直接降级成了副本
  • 演练验收:主从切换演练后确认所有写客户端都能自愈

最小示例

最小示例
redis-cli -h <host> -p <port> INFO replication | grep -E '^role|master_link_status'  # 确认角色
redis-cli -h <host> -p <port> INFO server | grep -E 'tcp_port|redis_version'         # 确认连的是哪个实例
redis-cli -c -h <cluster_node> CLUSTER NODES                                        # 集群拓扑与主节点
redis-cli -h <sentinel> SENTINEL get-master-addr-by-name mymaster                    # 哨兵记录的当前主
redis-cli -h <replica> CONFIG GET replica-read-only                                 # 副本只读开关(默认 yes)

根因与处置

根因识别方式处置
写请求打到副本该实例 role 为 slave修正客户端路由,只有读流量才走副本
切换后仍指向旧主旧主 role 已变为 slave刷新拓扑,或改用支持拓扑发现的客户端
客户端只配单一地址配置里没有哨兵或集群节点列表换成带拓扑发现能力的连接配置
代理后端未更新代理健康检查与拓扑同步滞后修代理的后端发现逻辑
误把主库改成副本实例 role 突然变为 slave核对变更记录并恢复主从关系
写请求重试到同一个副本永远不会成功;正确做法是刷新拓扑后写到新主,读请求才可以继续留在副本上。
不要靠在副本上关闭只读开关来「解决」报错:副本接受写会与主库数据分叉,后续复制与切换都会出问题。

易错点

  • 把写请求重试到同一副本:永远失败,还白白放大副本负载
  • 切换后靠人工更新客户端配置:窗口内持续报错,应该让客户端支持拓扑发现
  • 为掩盖报错把副本设成可写:主从数据分叉,切换到该副本时会造成数据丢失
  • 只看报错不看角色:先确认目标实例的 role 再定位,否则排查方向容易跑偏
  • 读请求也一律走主库:副本容量闲置,主库压力无谓增大

数据来源与参考

  • Redis 官方文档:READONLY 错误说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌