Redis主从复制能够根据是不是全量分为全量同步和增量同步。如下对其相应的同步过程及原理作下简要说明。redis
Redis增量同步主要指Slave完成初始化后开始正常工做时,Master发生的写操做同步到Slave的过程。一般状况下,Master每执行一个写命令就会向Slave发送相同的写命令,而后Slave接收并执行。服务器
Redis的全量同步过程主要分三个阶段:并发
具体的全量同步步骤以下:spa
步骤 | 主服务器 | 从服务器 |
---|---|---|
1 | (等待命令进入) | 链接(重连)Master,发送SYNC命令 |
2 | 执行BGSAVE,并使用缓冲区记录此后的全部写命令 | 根据配置的设定,选择继续使用现有数据处理客户端请求,或者直接向客户端报错。 |
3 | BGSAVE执行完毕,向Slave发送快照文件,同时继续缓冲此期间的写命令。 | 丢弃全部旧数据,开始载入快照文件。 |
4 | 快照文件发送完毕、开始向Slave发送存储在缓冲区的写命令。 | 完成对快照文件的解释操做;开始正常接收命令请求。 |
5 | 缓冲区所存储的写命令发送完毕;此后每执行一个写命令,就向Slave发送相同的写命令。 | 执行Master发来的全部的存储在缓冲区里的写命令;此后,接收并执行Master传来的每一个写命令。 |
对应的流程图以下:进程
值得注意的是,当多个Slave尝试链接同一个Master进行全量同步的时候,Redis为尽量地减小复制所需的工做,设定了两种处理情形:图片
当有新的Slave链接Master时 | Master的处理策略 |
---|---|
步骤3还没有执行 | 全部Slave都会接收到相同的快照文件 |
步骤3正在执行或已执行 | 待当前的同步流程执行完毕后,对新的Slave从新执行一遍同步流程。 |
因为Redis在复制进行期间,还会尽量地处理接收的命令请求。为保障Master有足够的内存来建立子进程和建立用于存储写操做命令的缓冲区等操做,同时又不影响Redis处理命令请求的效率,在实际的操做过程当中,最好使得主服务器预留30%~45%的内存用于执行上述操做。内存
Redis的Master和Slave并无特别不一样的地方,Slave也能够拥有本身的Slave,并由此造成主从链。
Slave对Slave进行复制在操做上和Slave对Master进行复制的惟一区别在于,若是Slave-X拥有Slave-X1,那么当Slave-X在执行步骤4时(即:完成对快照文件的解释操做;开始正常接收命令请求)时,它将断开与Slave-X1的链接,致使Slave-X1须要从新链接并从新同步。get