浅谈 Redis 主从复制 psync1 和 psync2

本文介绍了Redis主从复制的演变,重点解析了psync1和psync2的实现机制。psync1通过复制偏移量、复制积压缓冲区和运行ID实现部分重同步,而psync2在4.0版本中进行了优化,支持更多场景的部分重同步,减少了全量同步带来的开销。文章详细阐述了psync1和psync2的流程和优化细节。
摘要由CSDN通过智能技术生成

写在前面

在分布式环境中,数据副本 (Replica) 和复制 (Replication) 作为提升系统可用性和读写性能的有效手段被大量应用系统设计中,Redis 也不例外。Redis 作为单机数据库使用时,适用常见有限且存在单点宕机问题,无法维持高可用。因此 Redis 允许通过 SLAVEOF 命令或者 slaveof 配置项来让一个 Redis server 复制另一个 Redis server 的数据集和状态,我们称之为主从复制,主服务器下文称 master,从服务器下文称 slave,Redis 采用异步的复制机制。

主从复制机制的演变

从 Redis 2.6 到 4.0 开发人员对复制流程进行逐步的优化,以下是演进过程:

  • 2.8 版本之前 Redis 复制采用 sync 命令,无论是第一次主从复制还是断线重连后再进行复制都采用全量同步,成本高
  • 2.8 ~ 4.0 之间复制采用 psync 命令,这一特性主要添加了 Redis 在断线重连时候可通过 offset 信息使用部分同步
  • 4.0 版本之后也采用 psync,相比于 2.8 版本的 psync 优化了增量复制,这里我们称为 psync2,2.8 版本的 psync 可以称为 psync1

我们先介绍 psync1 的实现,再介绍 psync2 的优化点,至于旧版 sync 的机制本文不再赘述。

psync1

为了解决旧版 SYNC 在处理断线重连复制场景下的低效问题,Redis 2.8 采用 PSYNC 代替 SYNC 命令。PSYNC 命令具有全量同步和部分同步两种模式。

全量重同步

前者和 SYNC 大致相同,都是让 master 生成并发送 RDB 文件,然后再将保存在缓冲区中的写命令传播给 slave 来进行同步,相当于只有同步和命令传播两个阶段。

部分重同步

部分同步适用于断线重连之后的同步,slave 只需要接收断线期间丢失的写命令就可以,不需要进行全量同步。为了实现部分同步,引入了复制偏移量(offset)、复制积压缓冲区(replication backlog buffer)和运行 ID (run_id)三个概念。

复制偏移量

执行主从复制的双方都会分别维护一个复制偏移量,master 每次向 slave 传播 N 个字节,自己的复制偏移量就增加 N;同理 slave 接收 N 个字节,自身的复制偏移量也增加 N。通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值