redis--主从复制

来源:互联网 发布:学生背包品牌知乎 编辑:程序博客网 时间:2024/06/07 15:30

1、旧版复制功能的实现
Redis的复制功能分为同步和命令传播两个操作:
同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态;
命令传播操作则用于在主服务器的数据库状态被修改,导致主从服务器的数据库状态出现不一致时,让主从服务器的数据库重新回到一直的状态;
<1>同步
当客户端给从服务器发送slaveof,从服务器向主服务器发送SYNC命令,主服务器执行BGSAVE生成RDB文件,在生成RDB文件的期间,使用缓冲区记录在这期间生成的命令,发送RDB文件给从服务器,然后将缓冲区中的数据发送给从服务器;
这里写图片描述
<2>命令传播
在同步执行完毕之后,当客户端向主服务器发送DEL k3命令,主服务器中的k3已经删除,但是从服务器中还保存着,所以需要进行命令传播,将DEL k3命令发送给从服务器,将k3从从服务器中删除;
这里写图片描述
2、旧版复制功能的缺陷
<1>初次复制
从服务器之前从来没有复制过任何服务器,从服务器在断线之后重连的时候,所连服务器与之前复制的服务器不是同一台服务器;
<2>断线后重复制
处于命令传播阶段的主从服务器因为网络的原因,断线,当从服务器通过重新上服务器时,继续给主服务器发送SYNC命令,主服务生成RDB文件,然后发给从服务器;
以上的断线后重复制的效率对于断线以后如果重新连接上还是同一个服务器,在断线前的数据都是相同的,只是断线中的数据没有保持一致,这样的情况下,还是要执行SYNC命令,其实,我们可以只复制断线期间的数据,这样更加高效。
3、新版复制功能的实现
使用PSYNC命令代替SYNC命令来执行复制时的同步操作;
PSYNC具有完整重同步和部分重同步两种模式;
完整重同步用于处理初次复制的情况,和SYNC的原理一样;
部分重同步用于处理断线后重复复制的情况,主服务器可以将从服务器在断线后重新连接主服务器期间的写命令发送给从服务器;
4、部分重同步的实现
<1>复制偏移量
主从服务器都维护一个复制偏移量,如果主从服务器的偏移量不一样时,说明主从不一致,如果偏移量相同时,说明一致;到底偏移量偏差多大进行部分重同步,多大进行完整重同步,接下来看复制积压缓冲区;
<2>复制积压缓冲区
复制积压缓冲区是由主服务器维护的一个固定长度,先进先出的队列,默认大小问1MB,如果主服务器需要执行大量的写命令,又或者主从服务器断线时间太久,那么根据复制积压缓冲区的大小计算公式,可以调大它的大小;当主服务器进行命令传播时候,不仅给从服务器发,同时把写命令放在积压缓冲区中,当某一从服务器断线以后,重新连接上,判断发送的复制偏移量是否在复制积压缓冲区中,如果在,就执行部分重同步,如果不在,就执行完整重同步;
<3>服务器运行ID
运行ID有服务器启动时,自动生成,由40个随机的十六进制字符组成,当从服务器完成初次复制时,主服务器将自己的运行ID发送给从服务器,当某一从服务器发生断线的情况,那么重新连接上以后,发送断线前的主服务器的运行ID,如果和当前连接的主服务器的运行ID相同,那么就执行可以去进一步判断复制偏移量和是否在复制积压缓冲区中,来执行部分重同步,如果运行ID,直接不相同,那么直接执行完整重同步。

引用《Redis设计与实现》

原创粉丝点击