Redis的复制功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012050154/article/details/78662619

        Redis中,通过slaveof命令或者设置slaveof选项,让一个服务器去复制另一个服务器,从而形成主从服务器关系,具有主从关系的服务器数据库状态一致。Redis的复制功能分两个步骤实现:同步(sync)和命令传播(command propagate)。

  • 同步操作是将从服务器数据库状态更新至主服务器数据库当前所处状态;
  • 命令传播则用于主服务器的数据库状态被修改导致主从服务器的数据库状态出现不一致时让主从服务器重新回到一致状态。

一、同步

        客户端发送slaveof命令复制主服务器时,从服务器首先要执行同步操作,同步操作就是将从服务器的数据库状态更新至主服务器数据库当前所处状态。从服务器对主服务器的同步操作是通过向主服务器发送sync命令实现的:

(1)从服务器向主服务器发送sync命令。收到sync命令的主服务器执行bgsave命令后台生成RDB文件,同时使用缓冲区记录从现在开始执行的所有写命令。

(2)主服务器的bgsave命令执行完毕后,将生成的RDB文件发送给从服务器。从服务器 接收并载入RDB文件,将数据库状态更新至主服务器执行bgsave命令时的数据库状态。

(3)主服务器将缓冲区中的所有写命令发送给从服务器,从服务器执行这些命令将数据库状态更新至主服务器当前所处状态。

        

二、命令传播

扫描二维码关注公众号,回复: 3872985 查看本文章

        在同步操作执行完毕后,主从服务器数据库暂时达到一致状态,此后如果主服务器又执行了客户端发送的写命令,会导致主从服务器数据库状态不再一致,命令传播则是让主从服务器的数据库再次回到一致状态。主服务器对从服务器执行命令传播操作:

        主服务器将自己执行的写命令发送给从服务器,从服务器也执行相同命令后,主从服务器再次回到一致状态。

        

        

三、旧版复制功能存在的问题及解决办法

        从服务器对主服务器的复制可以分为初次复制和断线后重新复制:

(1)初次复制:从服务器第一次复制主服务器,执行同步、命令传播操作;

(2)断线后重新复制:从服务器之前就复制的当前主服务器,因为网络等状况断线后重新连接,继续复制当前主服务器。如果再重新执行同步、命令传播操作,效率低下!

效率低下?

(a)主服务器需要执行BGSAVE命令生成RDB文件,耗费主服务器大量CPU、内存、磁盘I/O等资源。
(b)主服务器将RDB文件发送给从服务器耗费大量网络资源(带宽、流量),并对主服务器响应命令请求产生影响。
(c)接收到RDB文件的从服务器载入RDB文件时处理阻塞状态,无法处理命令请求。

        为解决旧版复制功能的局限性,Redis从2.8版本之后使用psync命令代替sync命令,psync命令有完整重同步和部分重同步两种模式:完整重同步就是处理初次复制的情况执行同步、命令传播操作;部分重同步则针对从服务器断线后重连接到主服务器时,发送主从服务器断线后,主服务器又执行的写命令。部分重同步维护以下三个元素:

(1)复制偏移量。主服务器维护一个复制偏移量,每次向从服务器发送N个字节的数据时,就在自己的复制偏移量上加上N;从服务器也维护自己的一个复制偏移量,每次接收N个字节的数据时,就将自己的复制偏移量加上N。

(2)复制积压缓冲区(定长的、先进先出的队列)。主服务器每次进行命令传播时,将写命令发送给所有从服务器的同时,还会将写命令写入复制积压缓冲区中(这就意味着复制积压缓冲区中会保存主服务器最近一部分传播的写命令),复制积压缓冲区同时保存了队列中每个字节相应的复制偏移量。

(3)服务器的运行ID。每个Redis服务器都有自己的运行ID,当从服务器对主服务器进行复制时,会保存主服务器发送过来的运行ID。从服务器断线重连后,发送之前保存的运行ID,如果和当前主服务器的运行ID相同,并且偏移量之后的数据仍在复制积压缓冲区中,则执行部分重同步操作,将复制积压缓冲区复制偏移量之后的所有数据发送给从服务器,再次回到一致状态。否则执行完整重同步操作。

        


参考资料:

1、https://redis.io/topics/replication

2、http://www.redis.net.cn/tutorial/3506.html
3、《Redis设计与实现》第二版---黄健宏
4、https://github.com/xingzhexiaozhu/redis-3.0-annotated
5、http://www.yiibai.com/redis/redis_strings.html

猜你喜欢

转载自blog.csdn.net/u012050154/article/details/78662619
今日推荐