Redis主从复制

成为从节点

通过SLAVEOF命令,可以让执行命令的Redis服务器成为一个目标服务器的从节点。

SLAVEOF 127.0.0.1 6379 //执行该命令的服务器将成为127.0.0.1:6379的从服务器

新旧版本对于主从数据的复制

Redis 2.8版本是新旧版本的分割线,在Redis 2.8及之后的版本,Redis采用了新版本的复制功能,主要是解决旧版本部分复制时存在的效率低下的问题。

2.8以前的复制

全量复制

在执行SLAVEOF命令成为某一个服务器的从节点之后,从节点要同步主节点的数据内容,此时要依靠SYNC命令,具体操作如下:

  1. 从服务器向主服务器发送SYNC命令。
  2. 主服务器收到SYNC命令之后,执行BGSAVE命令,生成RDB文件,并且将在此期间发送的更新操作记录到一个缓存区中。
  3. 主服务器完成BGSAVE之后,将RDB文件发送给从服务器,从服务器还原RDB文件。
  4. 主服务器将缓冲区中的操作发送给从服务器执行,从而达到主从数据一致。
    之后发生在Redis主服务器的操作,主服务器都会发送命令给从服务器进行状态同步。

不存在部分复制

假如从服务器掉线了一段时间之后,重新连接,在2.8版本之前的Redis在处理这种情况的时候仍然使用的是SYNC命令,即主服务器生成完整的RDB文件发送给从服务器。

旧版本的问题

旧版本Redis主从的问题存在问题:

  • 从服务器断线之后,重新连接之后做的仍然是全量的数据同步,然而实际上从服务器只是缺少在断线期间没有的数据而已,这样会降低Redis的性能。
  • 主服务器发送给从服务的命令因为网络原因丢失,旧版本的redis不会处理这种情况,也就是redis主从在命令丢失之后会出现数据不一致的情况。

新版本的复制

Redis 2.8开始,Redis进行复制是不再使用SYNC命令,而是采用PSYNC命令。

PSYNC命令实现

  1. 如果从服务器从未复制过任何主服务器,那么在从服务器开始复制时会向主服务器发送PSYNC ? -1命令,主动请求进行全量复制。
  2. 如果从服务器以前复制过主服务器,那么从服务器会发送PSYNC <runid> <offset>,其中runid是以前主服务的ID,根据这个现在的主服务可以判断这个从节点以前是不是从自己复制的数据,offset是数据的复制偏移量。
  • 主服务器返回FULLRESYNC <runid> <offset>,表示从服务器进行全量复制,runid为当前主服务的id,offset是主服务进行BGSAVE这个时间点,数据的复制偏移量。
  • 主服务器返回CONTINUE,表示从服务器进行部分复制。
  • 主服务器返回ERR,表示主服务器版本低于2.8,不认识PSYNC命令。

全量复制

与SYNC的全量复制一样。

部分复制

主服务会维持一个复制积压缓冲区,是一个先进先出的队列,大小为1MB,其中记录着主服务最近执行的命令以及命令的复制偏移量,假如现在队尾偏移量为10068,再执行了一个33字节的命令之后,偏移量变为10068 + 33 = 10119。同样的从服务器也会维护一个自己当前数据的复制偏移量,在断线重启之后,从服务会把自己想要的偏移量的offset发送给主服务器,主服务器进行以下判断:

  1. 假如想要的偏移量数据在复制积压缓冲区中,直接把往后的命令发送给从服务器,实现部分复制。
  2. 假如不存在,进行全量复制。
    注:复制积压缓冲区大小默认为1MB,可以根据需要进行设置,公式为SECOND * WRITE_SIZE_PER_SECOND,SECOND是从服务断线之后连上主服务需要的时间,WRITE_SIZE_PER_SECOND是这段时间每秒钟主服务器产生更新操作的数据量,为了安全起见还可以设置为2SECOND * WRITE_SIZE_PER_SECOND,这样可以保证大部分从服务器都是进行部分复制。*

心跳检测

每秒一次,从服务器会发送携带offset的心跳给主服务器。

REPLCONF ACK <offset>

主服务器根据offset,来调整发送给从服务器的数据,从而保证数据一致性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值