断链时还能不能读
从库与主库断链之后,默认仍然会用本地已有的旧数据响应读请求,客户端拿到的是过期数据但服务不中断。把这个配置改成不允许之后,除少量管理类命令以外,断链期间的读请求会直接返回错误,避免脏读但可用性随之下降。选哪一种取决于业务对过期数据和直接报错这两个后果的容忍度。
基本信息
| 默认行为 | 允许用本地旧数据继续服务读请求 |
|---|---|
| 改为拒绝 | 断链期间大部分命令直接返回错误 |
| 折中方案 | 业务先探测链路状态再决定是否读从库 |
| 判断依据 | 复制链路状态字段 |
| 影响范围 | 主从切换窗口内从库读请求的表现 |
典型使用场景
- 读多写少且能容忍短暂过期的业务,保持默认让服务更平滑
- 涉及金额或权限判断的读取,宁可报错也不要返回过期数据
- 主从切换窗口内需要明确从库读的行为,避免业务侧出现难以解释的旧值
- 排查「读到的数据明显过期」问题时确认该配置的取值
- 为读写分离架构设计降级策略时,明确断链情况下的降级动作
查看与调整
查看与调整
redis-cli CONFIG GET replica-serve-stale-data
redis-cli INFO replication | grep -E 'master_link_status|master_last_io_seconds_ago'
redis-cli CONFIG SET replica-serve-stale-data no # 宁可不服务也不返回旧数据
redis-cli CONFIG SET replica-serve-stale-data yes # 恢复默认,保可用性
redis-cli CONFIG REWRITE取值对照
| 取值 | 断链期间行为 | 适用判断 |
|---|---|---|
| 允许(默认) | 继续用旧数据响应读请求 | 可容忍过期,优先保证可用性 |
| 拒绝 | 大部分读请求直接报错 | 数据新鲜度优先,可接受报错 |
| 业务侧探测后降级 | 按链路状态决定是否读从库 | 需要精细控制时的折中做法 |
改成拒绝之后,主从切换窗口内的从库读会全部失败,业务侧的重试与降级逻辑必须同步准备好。
多数缓存场景保留默认更平滑:短暂读到旧值对业务影响有限,而整体读失败会直接变成可用性事故。