Redis主从同步原理

在redis中为了保证redis的高可用,一般会搭建集群模式,其中一种就是主从模式,还有一种是集群模式。主从模式可以保证redis的高可用,那么redis是怎么保证主从服务器的数据一致性的,接下来我们谈谈redis主(master)从(slave)同步原理。

1. PSYNC命令

要想了解redis的主从同步原理,首先要了解下psync命令。Redis在2.8版本提供了PSYNC命令来带代替SYNC命令,为Redis主从复制提供了部分复制的能力。PSYNC命令格式是:

PSYNC <runid> <offset>
runid:主服务器ID
offset:从服务器最后接收命令的偏移量

PSYNC执行过程中比较重要的概念有3个:runid、offset(复制偏移量)以及复制积压缓冲区。

  • runid
    每个Redis服务器都会有一个表明自己身份的ID。在PSYNC中发送的这个ID是指之前连接的Master的ID,如果没保存这个ID,PSYNC的命令会使用”PSYNC ? -1” 这种形式发送给Master,表示需要全量复制。
  • offset(复制偏移量)
    在主从复制的Master和Slave双方都会各自维持一个offset。Master成功发送N个字节的命令后会将Master的offset加上N,Slave在接收到N个字节命令后同样会将Slave的offset增加N。Master和Slave如果状态是一致的那么它们的offset也应该是一致的。
  • 复制积压缓冲区
    复制积压缓冲区是由Master维护的一个固定长度的FIFO队列,它的作用是缓存已经传播出去的命令。当Master进行命令传播时,不仅将命令发送给所有Slave,还会将命令写入到复制积压缓冲区里面。
    PSYNC执行过程
    理解了上面三个基本概念,PSYNC的执行过程就好理解了。
    在这里插入图片描述
    Redis主从复制可以分为全量同步和增量同步。

2. 初次全量同步

当一个redis服务器初次向主服务器发送salveof命令时,redis从服务器会进行一次全量同步。
同步的步骤如下图所示:
在这里插入图片描述
步骤描述:

  1. slave服务器向master发送psync命令(此时发送的是psync ? -1),告诉master我需要同步数据了。
  2. master接收到psync命令后会进行BGSAVE命令生成RDB文件快照。生成完后,会将RDB文件发送给slave。
  3. slave接收到文件会载入RDB快照,并且将数据库状态变更为master在执行BGSAVE时的状态一致。
  4. master会发送保存在缓冲区里的所有写命令,告诉slave可以进行同步了
  5. slave执行这些写命令。

3. 增量同步:命令传播

slave已经同步过master了,那么如果后续master进行了写操作,比如说一个简单的set name redis,那么master执行过当前命令后,会将当前命令发送给slave执行一遍,达成数据一致性。

4. 重新同步

当slave与master断开后,重连后会进行重新同步,重新同步分为:完全同步和部分同步。步骤如下:

  1. 当slave断开重连后,会发送psync 命令给master。
  2. master首先会对服务器运行id进行判断,如果与自己相同就判断偏移量
  3. master会判断自己的偏移量与slave的偏移量是否一致。
  4. 如果不一致,master会去缓冲区中判断slave的偏移量之后的数据是否存在。
  5. 如果存在,就会返回+continue回复,表示slave可以执行部分同步了。
  6. master发送断线后的写命令(也就是复制积压缓冲区)给slave
  7. slave执行写命令。

5. 主从同步最终流程

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值