【Redis / 缓存内核】复制:PSYNC · backlog · 副本只读与读己之写

💡 原文中文,约6800字,阅读约需17分钟。
📝

内容提要

Redis 的异步复制模型可能导致副本读取到旧数据。主库通过 replication.c 向副本广播命令,副本在断连期间仍可提供陈旧数据。配置参数如 repl-backlog-size 和 replica-read-only 会影响复制行为。理解这些特性有助于优化 Redis 的使用和故障处理。

🎯

关键要点

  • Redis 的异步复制模型导致副本可能读取到旧数据。

  • 主库通过 replication.c 向副本广播命令,副本在断连期间仍可提供陈旧数据。

  • 配置参数如 repl-backlog-size 和 replica-read-only 会影响复制行为。

  • 主库不等待副本确认即向客户端返回成功,复制延迟是设计特性。

  • 副本在断连期间仍可服务读请求,可能返回旧数据。

  • repl-backlog-size 影响部分重同步的能力,需根据写带宽和断连时长进行规划。

  • 副本只读配置防止误写,但不保证读己之写的语义。

  • 全量同步的成本高于增量同步,需避免频繁的全量同步。

🔎

延伸解读

异步复制的风险

Redis 的异步复制模型意味着主库在返回成功后,副本可能尚未同步最新数据。这种设计虽然提高了主库的响应速度,但也带来了数据一致性风险,尤其是在高并发写入场景下。运维人员需关注副本的滞后情况,以避免读取到过时数据。

配置参数的重要性

配置参数如 repl-backlog-size 和 replica-read-only 对 Redis 的复制行为有显著影响。合理设置 backlog 大小可以减少全量重同步的频率,而只读配置则防止副本被误写。用户应根据实际写入带宽和业务需求,仔细调整这些参数,以优化性能和数据一致性。

读己之写的局限性

Redis 默认不保证读己之写的语义,这意味着在写入后立即从副本读取数据可能会得到旧值。对于需要强一致性的应用,开发者应考虑将读请求直接发送到主库,或实现客户端逻辑以确保读取到最新数据。

延伸问答

Redis 的异步复制模型有什么特点?

Redis 的异步复制模型可能导致副本读取到旧数据,主库不等待副本确认即向客户端返回成功,复制延迟是设计特性。

如何配置 Redis 的 repl-backlog-size 参数?

repl-backlog-size 参数影响部分重同步的能力,需根据写带宽和断连时长进行规划,默认值为 1MB。

副本只读配置有什么作用?

副本只读配置防止误写,但不保证读己之写的语义,读副本时可能返回旧数据。

Redis 中的全量同步与增量同步有什么区别?

全量同步的成本高于增量同步,通常在 backlog 不足或 ID 未知时触发全量重同步。

如何避免 Redis 的全量重同步?

避免全量重同步需要稳定网络、足够的 backlog、控制主库频繁重启,并观察 master_link_status。

Redis 的副本在断连期间能否提供服务?

副本在断连期间仍可服务读请求,但可能返回旧数据。

🏷️

标签

➡️

继续阅读