redis 2.8 版本起支持 psync,实现全量与部分同步;2.8 之前版本(如 2.6、2.4)仅支持 sync,强制全量同步且无法兼容 psync,协议不兼容导致降级不可行。

Redis 2.8 版本本身已支持 PSYNC,不存在“仅用 SYNC”的局限性;真正有局限的是 2.8 之前版本(如 2.6、2.4)——它们强制全量同步,且无法降级兼容 PSYNC。
SYNC 命令在 Redis
只要从节点发起的是 SYNC 命令(旧客户端或配置错误),主节点就无条件执行:BGSAVE → 生成 RDB → 发送 RDB → 回放缓冲区命令。哪怕只断开 1 秒,也得重传整个数据集。
- 主节点 fork 子进程时,内存瞬时翻倍(Copy-On-Write)
- RDB 文件写磁盘 + 网络传输,延迟高、带宽占用大
- 从节点载入 RDB 期间完全阻塞,无法响应读请求
- 没有 offset 或 runID 校验机制,无法判断是否可增量续传
PSYNC 在 2.8+ 中默认启用,但部分场景仍退化为全量
PSYNC 不等于“永远增量”。它依赖三个前提同时满足才能走部分重同步:runID 匹配 + offset 有效 + 复制积压缓冲区(repl-backlog)未被覆盖。
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
- 默认
repl-backlog-size是 1MB,小实例够用,大流量或长断连极易溢出 - 主节点重启后
runID变更,从节点再连必全量(即使 offset 还在) - 从节点首次连接或
slaveof no one后重连,也会走完整重同步流程 - 网络抖动导致
PSYNC ? -1(即不带 offset 的试探),主节点若没缓存 runID 就回退SYNC
2.8+ 的 PSYNC 实际行为比文档写的更保守
很多运维误以为 “开了 2.8 就自动高效”,但真实日志里常看到 Partial resync not possible (no cached master) 或 Failed to establish PSYNC with master —— 这说明主节点没保存上一次的上下文。
-
repl-backlog-ttl默认 3600 秒,空闲超时后缓冲区会被释放 - 主节点内存紧张时,可能提前丢弃 backlog(无显式提示)
- 从节点日志里出现
MASTER SLAVE sync: Finished with success并不表示是部分同步,需查INFO replication中的master_repl_offset和slave_repl_offset差值是否为 0
真正影响稳定性的不是协议名,而是积压缓冲区能否兜住断连窗口——这个大小必须根据你的写入 QPS × 命令平均体积 × 最大容忍断连时间来估算,而不是沿用默认 1MB。










