655 字
3 分钟
Redis 断线后如何通过 PSYNC 部分重同步?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?本文
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

副本与主节点短暂断开后,不一定重新复制整个数据集。Redis 通过复制历史标识、复制偏移量与 replication backlog判断是否可以补发遗漏的复制流,能够续接时执行部分重同步。

三个信息分别解决什么?#

复制 ID 用于标识一段复制历史;offset 表示在该历史的复制流中推进了多少字节;主节点的 backlog 是保存近期复制流的缓冲区。只有 ID 能衔接,且副本缺失的内容仍保留在缓冲区,才有条件续传。

例如主节点偏移量已到 1,000,000,副本断线时处理到 900,000。重连后副本请求后续内容。如果 backlog 仍覆盖这个起点,主节点补发缺少的字节流;若缓冲只保留了 950,000 之后的内容,中间出现无法补齐的空洞,就需要全量复制。

backlog 的大小是共享复制历史容量,不是给每个副本单独保存无限的未确认日志。副本自身的输出缓冲和复制连接还有其他内存与限制,不能混为一谈。Redis 的 PSYNC2 还会维护第二复制 ID 等信息,使某些主从切换后的历史能够衔接,细节应以版本实现为准。

如何估算 backlog?#

可按峰值复制流量乘以希望容忍的断线时间,再留一定余量。这里的流量是实际复制字节量,不是 Key 数或数据库总大小。过小会频繁触发全量复制,过大则占用内存;还需关注 repl-backlog-ttl 等生命周期配置。

常见追问#

offset 相同就一定是相同数据吗?#

必须结合复制 ID。来自不同复制历史的相同 offset 没有相同含义,就像两个不同文件中的同一字节位置。

backlog 是 AOF 文件吗?#

不是。它服务于复制续传,通常是内存中的近期历史;AOF 服务于本节点持久化,不能直接用 AOF 替代 PSYNC 的 backlog。

主节点重启后总能部分重同步吗?#

不能一概而论。是否能够保持所需复制历史与元数据,取决于重启、持久化及版本条件。设计可用性时应接受部分场景回退到全量同步。

只要副本连接正常就没有延迟吗?#

不是。网络、CPU、慢命令和快照加载都可能让应用复制流的速度落后。要检查复制状态和进度,而不只看连接是否建立。

Redis 断线后如何通过 PSYNC 部分重同步?
https://blog.xqcherry.top/posts/interview/redis/redis-partial-resynchronization/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0