mysql复制与redis复制_详解redis的全量复制与部分复制

全量复制

全量复制的原理

redis全量复制的原理是,首先将master本身的RDB文件同步给slave,而在同步期间,master写入的命令也会记录下来(master内部有一个复制缓冲区,会记录同步时master新增的写入),当slave将RDB加载完后,会通过偏移量的对比将这期间master写入的值同步给slave。

来看一张完整的复制流程图:

2880800b0bd151f7993ee0a010cb7007.png

1. slave内部首先会发送一个psync的命令给master 这个命令第一个参数是runId,第二个参数是偏移量,而由于是第一次复制,slave不知道master的runId,也不知道自己偏移量,这时候会传一个问号和-1,告诉master节点是第一次同步。

2. 当master接受到psync ? -1 时,就知道slave是要全量复制,就会将自己的runID和offset告知slave

3.slave会将master信息保存

4.master这时会做一个RDB的生成(bgsave)

5.将RDB发送给slave

6.将复制缓冲区记录的操作也发送给slave

7.slave清空自己的所有老数据

8.slave这时就会加载RDB文件以及复制缓冲区数据,完成同步。

全量复制的开销

1.bgsave的开销,每次bgsave需要fork子进程,对内存和CPU的开销很大

2.RDB文件网络传输的时间(网络带宽)

3.从节点清空数据的时间

4.从节点加载RDB的时间

5.可能的AOF重写时间(如果我们的从节点开启了AOF,则加载完RDB后会对AOF进行一个重写,保证AOF是最新的)

部分复制

为什么要部分复制? 在redis2.8版本之前,如果master和slave之间的网络发生了抖动连接断开,就会导致slave完全不知道master的动作,同步就会出问题,而为了保证数据一致,等网络恢复后进行一次全量复制。而全量复制的开销是很大的,redis2.8版本就提个了一个部分复制的功能。

部分复制的实现原理:

当master和slave断开连接时,master会将期间所做的操作记录到复制缓存区当中(可以看成是一个队列,其大小默认1M)。待slave重连后,slave会向master发送psync命令并传入offset和runId,这时候,如果master发现slave传输的偏移量的值,在缓存区队列范围中,就会将从offset开始到队列结束的数据传给slave,从而达到同步,降低了使用全量复制的开销。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值