redis——主从复制笔记

redis主从复制

在redis中,欧诺个话可以通过slaveof命令或者slaveof选项,让一个服务器去复制另一个服务器的数据,2.8版本前是旧版复制功能,即同步sync和命令传播command propagate两个操作

旧版复制

1.同步
从服务器向主服务器发送sync命令
主服务器执行BGSAVE命令(不阻塞),生成RDB文件,并在缓冲区中记录从现在开始执行的写命令
从服务器接受RDB文件,并将状态更新到和主服务器执行BGSAVE时的状态
主服务器将缓冲区内容发送给从服务器并执行
2.命令传播
之后的操作需要主服务器将客户端执行的命令发送给从服务器来保证一致性

旧版复制的效率在某些场景下有些低,可能相对与RDB更小的一些操作引起的变化,使得需要复制整个redis的RDB,很多数据没必要重新走一遍备份和恢复(大多是断线的情况)

新版复制

从2.8版本开始,使用PSAVE命令代替SAVE
PSAVE命令有完整重同步(full resynchronization)和部分重同步两种模式(partial resynchorization)
完整重同步用来处理初次同步,步骤和旧版复制相同
部分重同步用来处理断线后的部分同步,

部分重同步的实现:

有三部分构成

  • 主服务器的复制偏移量
  • 从服务器的复制积压缓冲区
  • 服务器的运行ID

复制偏移量是主从各一份的维护的数据,用来判断是否一致,和需要同步几条数据
积压缓冲区将命令放在了一个队列中,并且记录了offset(偏移量)
积压缓冲区的构造↓
redis——主从复制笔记_第1张图片
查找offset偏移量就能知道从服务器和主服务器不一致时从什么地方开始部分重同步。
多加思考一下就会发现,如果队列太小,保存的最小偏移量的标记比从服务器当前的偏移量还要小就无法进行部分重同步了,因为有有一部分的数据已经丢失,因此,正确估算和设置积压缓冲区的大小十分重要。
redis——主从复制笔记_第2张图片
随便举得例子,只是数值上是600,命令条数不足600


服务器ID
不管是从服务器还是主服务器,都有自己的服务器ID,断线重连之后,从服务器会将之前synv的服务器ID发送给主服务器,如果比对正确,就尝试进行部分重同步,否则进行完全重同步。

你可能感兴趣的:(redis)