Redis(二十二):复制(二)——Psync命令的实现与主从同步复制的实现(1)

Psync的调用方式有两种

  • 从服务器没有复制过主服务器,或者从服务器执行了slaveof no one命令,取消了从主关系,那么当从服务器执行slaveof命令时,会发送Psync ? -1命令,主动请求主服务器进行完整重同步(第一次同步肯定要执行完整重同步)

  • 从服务器已经复制过主服务器,但是中途断开连接了,进行重新连接时,也是发送Psync命令,命令格式为如下:Psync ,runid就是前面提到过的从服务器保留主服务器的运行ID,offset就是复制偏移量,这样主服务器就可以对进行比对,看是否需要执行完整重同步,再去看复制积压缓冲池里面是否还存有该复制偏移量往后的数据,如果有,就进行部分重同步。

根据情况的不同,接收到Psync命令的主服务器会向从服务器返回以下三种回复之一

  • 如果主服务器返回+FULLRESYNC 回复给从服务器,则代表主服务器将要进行完整重同步,runid是主服务器的运行ID,从服务器接受到这个运行ID之后就会保存起来,在下一次需要发送Psync命令时试用,而offset就是主服务器当前的复制偏移量,从服务器此时会将这个值作为自己的复制偏移量初值,然后进行维护起来(前面提到过,主从服务器都会维护自己的一个复制偏移量),此时从服务器需要等待主服务器发送RDB文件,载入后,再等待主服务器发送缓冲池在空白期执行的写命令,然后执行这些写命令,至此完成同步。

  • 如果主服务器返回的是+CONTINUE回复,那么表示主服务器将与从服务器执行部分重同步操作,从服务器只要等着主服务器将自己缺少的那部分数据发送过来就可以了(主服务器从复制积压缓冲池中取出)

  • 如果主服务器返回-ERR回复,表示版本不匹配,主服务器的版本太低(低于2.8),无法识别从服务器发送的Psync命令,但并不会停止同步,而是从服务器会向主服务器发送Sync命令,完成同步操作

过程如下图所示

在这里插入图片描述

复制/同步的实现


上面介绍了Psync命令的过程,但没有具体到其如何进行同步和复制的实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值