Redis的同步机制是怎么样的?

1.同步机制

redis可以通过命令slaveof 120.0.0.2(主master)成为一个Redis的从服务

旧版本分为(2.8之前):

1 同步(sync)

过程如下

 

2 命令传播 (command propagate)

当主DB有修改时,主服务器会以命令传播的形式到从服务器,达到主从同步

缺点:

想象一下这种场景,如果从服务是未通不过的,走上面的整个流程是没有什么问题的。

但是如果是已经同步过的掉线的。再次连上后从服务器期望的是同步掉线时间这段时间的

修改,但是走上述流程这种情况下为了弥补一小部分缺失的数据,却要让主从服务器

重新执行一次SYNC命令,是非常低效的

 

2.8版本之后:

针对上述问题新版办用psync代替了sync命令来执行复制时的同步操作

PSYNC 分为

完整重同步(full resynchronization) 用在第一次和上述rsync类似

部分重同步(partial resynchronization)用在断线后重新连接的情况。

断线后重新连接的时候,主服务器将断开期间执行的写命令同步给从服务器

从服务器接受这些命令,更新至主服务所在的状态

 

2.部分重同步的实现

  • 主服务器的复制偏移量和从服务器的复制偏移量
  • 主服务器的复制积压缓存区 (一个固定长度的FIFO(先进先出)的队列,默认是1M)
  • 服务器的运行ID

 

简要来说;

主从服务器双方维护各自的偏移量。主向从发送N个字节的时候,将偏移量加上N

主从一致的情况下双方的偏移量是相同的,如果不一致说明未处于一致性状态。

主服务器发送命令的时候会同时写入缓存区并记录偏移量,

如果断线后恢复,从服务器发送psync命令以及发送偏移量

主服务器检查偏移量是否在缓存区中,如果在的话执行psync部分同步操作,发送偏移量后的数据给从服务器,达到一致状态

如果不在缓存区中则执行完全同步操作

服务器ID的作用是标识是否是通一主服务器

当从服务器连上主服务器的时候,主服务器向从服务器发送SERVERID并保存的ID

 

断线后重新连接会做验证如果连接的主服务器ID和从服务器保存的一样则认为是同一个 执行部分同步

否则执行完整同步

复制的实现包括

  1. 设置主服务器的地址和端口
  2. 建立套接字连接
  3. 发送ping命令
  4. 身份验证
  5. 发送端口信息
  6. 同步
  7. 命令传播

在命令传播阶段,从服务器默认1S的速率向主服务器发送命令:

replconf ack <offset>

主要 用于1.检测网络状态 2辅助实现min-slave选项 3检测命令丢失

 

参考资料《Redis设计与实现》

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值