Redis之复制

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器,而对主服务器进行复制的服务器则被称为从服务器。
旧版复制功能的实现
redis的复制功能分为同步和命令传播两个操作:
1、同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态
2、命令传播操作则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一致状态。
同步
当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先要执行同步操作,也即是,将从服务器的数据库状态更新至主服务器当前所处的数据库状态。
从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令来完成,以下是SYNC命令的执行步骤:
1、从服务器向主服务器发送SYNC命令
2、收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令
3、当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态
4、主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态
在这里插入图片描述
命令传播
在同步操作执行完毕之后,主从服务器两者的数据库将达到一致状态,但这种一致并不会是一成不变的,每当主服务器执行客户端发送的写命令时,主服务器的数据库就有可能被修改,并导致主从服务器状态不再一致
旧版复制功能的缺陷
在redis中,从服务器对主服务的复制可以分为以下两种情况:
1、初次复制:从服务器以前没有父之过任何主服务器,或者从服务器当前要复制的主服务器和上一次复制的主服务器不同
2、断线后重复值:处于命令传播阶段的主从服务器因为网络原因而中断了复制,但从服务器呕吐难过自动重新连上了主服务器,并继续复制主服务器
在旧版redis中,主服务断开的事件越短,主服务器在短线期间执行的写命令就越少,而执行少量的写命令所产生的数据量通常比整个数据库的数据量要少得多,在这种情况下,为了让从服务器补足以下部分缺失的数据,却要让主从服务器重新执行一次SYNC命令,这种做法无疑是非常低效的。
新版复制功能的实现
为了解决旧版复制功能在处理断线重复值情况时的低效问题,从2.8版本开始,使用PSYNC命令代替SYNC命令来执行复制时的同步操作。
PSYNC命令具有完整重同步和部分重同步两种模式:
1、其中完成重同步用于处理初次复制情况:完整重同步的执行步骤和SYNC命令的执行步骤基本一样,他们都是通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。
2、而部分重同步则用于处理断线后重复制情况:当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。
部分重同步的实现
部分重同步功能由以下三个部分构成:
1、主服务器的复制偏移量和从服务器的复制偏移量
2、主服务的复制积压缓冲区
3、服务器的运行ID
复制积压缓冲区
复制积压缓冲区是由主服务器维护的一个固定长度先进先出队列
当主服务器进行命令传播时,它不仅会将写命令发送给所有从服务器,还会将写命令入队到复制积压缓冲区里面
在这里插入图片描述
因此,主服务器的复制积压缓冲区里面会保存这一部分最近传播的写命令,并且复制积压缓冲区会为队列中的每个字节记录相应的复制偏移量
PSYNC执行流程
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值