MASTERDOWN 与 TRYAGAIN 是什么
这两类是「可以重试」的错误。MASTERDOWN 出现在副本上:与主库的复制链路断开,且副本被配置为不提供旧数据时,连读请求都会直接失败;默认配置下副本会继续用旧数据提供服务。TRYAGAIN 多出现在集群的临时状态里,例如槽位迁移过程中的多键请求。处理它们的共同点是带退避的重试,而不是原地忙等。
基本信息
| MASTERDOWN 含义 | 复制链路断开,且副本不允许提供旧数据 |
|---|---|
| 关键配置 | replica-serve-stale-data,默认 yes 即默认可读旧数据 |
| TRYAGAIN 含义 | 集群处于临时状态,当前请求无法执行 |
| 处理策略 | 指数退避加随机抖动,并限制最大重试次数 |
| 不可重试的错误 | 参数错误、类型错误应直接失败 |
| 观测 | INFO replication 的 master_link_status、CLUSTER INFO 的状态 |
典型使用场景
- 读请求成片失败:副本断链且不服务旧数据时,先确认是复制问题而非应用问题
- 迁移窗口:槽位迁移期间出现 TRYAGAIN,退避重试即可恢复
- 客户端加固:确认重试策略带退避与上限,避免忙等
- 告警设计:把持续出现的重试类错误纳入告警,不要静默吞掉
- 架构取舍:决定是否允许副本在断链时继续服务旧数据
最小示例
最小示例
redis-cli INFO replication | grep -E 'role|master_link_status|master_last_io_seconds_ago'
redis-cli CONFIG GET replica-serve-stale-data # no 时断链会直接对读请求报 MASTERDOWN
redis-cli -c CLUSTER INFO | grep cluster_state # 集群整体状态
redis-cli -c CLUSTER NODES | head -20 # 核对节点角色与槽位分布
redis-cli INFO stats | grep -E 'sync_full|sync_partial_err' # 复制同步情况错误与处置
| 错误 | 出现场景 | 处置 |
|---|---|---|
| MASTERDOWN | 复制链路断开且不允许读旧数据 | 查主库与网络,并评估旧数据策略 |
| TRYAGAIN | 槽位迁移等集群临时状态 | 退避重试,等待状态收敛 |
| LOADING | 实例启动后仍在加载数据 | 等待加载完成,客户端要能识别并重试 |
| CLUSTERDOWN | 集群整体不可用 | 先恢复多数派与槽位覆盖,再谈重试 |
| 参数或类型错误 | 请求本身有问题 | 不可重试,直接失败并修调用方 |
重试必须带退避与随机抖动并设置上限;不带退避的立即重试会形成忙等,在故障期间把服务端压力放大。
只重试幂等操作:写操作的重试要配合业务幂等设计,否则可能造成重复写入。