主从复制(Replication)是 Redis 高可用的地基:数据从 master 同步到 replica,实现读写分离(读扩展)与故障转移(Sentinel/Cluster 的依赖)。本章解析复制协议(PSYNC/PSYNC2)、同步机制与 7.x 下的实践要点。
replica-read-only yes),通过 REPLICAOF host port 指定主节点;replica 通过 PSYNC <replid> <offset> 向 master 请求同步:
PSYNC2 解决"主从切换后全量同步风暴":
replid(当前数据集血缘)+ replid2(上一个 replid,即故障前 master 的 ID)+ offset 唯一定位数据集版本;replid2,其余 replica 只需部分同步(基于旧 replid 的 offset 增量),而不是全量重传;# redis.conf
repl-backlog-size 1mb # 复制积压缓冲区:越大,部分同步命中率越高
repl-backlog-ttl 3600 # 无 replica 时 backlog 保留时间
repl-diskless-sync yes # 无盘同步:RDB 直接通过 socket 传输(7.0 起默认 yes)
repl-diskless-sync-delay 0 # 等待更多 replica 汇合的窗口秒数(7.0 起默认 0,旧版为 5)
min-replicas-to-write 1 # 至少 N 个 replica 在线才接受写(防脑裂丢数据)
min-replicas-max-lag 10建议:repl-backlog-size 按"峰值写速率 × 容忍断线时间"估算(如 10MB/s × 60s = 600MB),部分同步命中率直接影响故障恢复体验。
BGSAVE 预热。| 来源 | 说明 | 对策 |
|---|---|---|
| 网络 RTT | 跨机房明显 | 同机房部署 |
| master 写量大 | 命令流积压 | 分片、降低写放大 |
| replica 慢 | 单线程处理不过来 | 提高实例规格 |
| 大 value | 序列化/传输/重放耗时 | 拆分大 key |
min-replicas-to-write 可强制"至少 N 个副本在线才写",用可用性换一致性;WAIT numreplicas timeout 阻塞等待指定数量 replica 确认,实现同步复制的近似(仅保障"已传播",非分布式事务);min-replicas-to-write + Sentinel 的 quorum 降低概率。DEL;replica-serve-stale-data no 的作用域是"断线/全量同步期间从库对外供读"的语义,与过期键无关。BGSAVE(redis-cli --rdb 或 BGSAVE),避免影响 master 性能。replid 变化:客户端主从切换感知(Sentinel/Cluster 已封装);WAIT/min-replicas 收紧;下一章讲解 Sentinel:Redis 高可用的自动故障转移机制。