为什么需要主从复制功能呢?有两个作用

    1. 读写分离,单台服务器能支撑的QPS是有上限的,我们可以部署一台主服务 器、多台从服务器,主服务器只处理写请求,从服务器通过复制功能同步主服务器数据,只处理读请求,以此提升Redis服务能力;
    2. 数据容灾,任何服务器都有宕机的可能,我们同样可以通过主从复制功能提升Redis服务的可靠性;由于从服务器与主服务器数据保持同步,一旦主服务器宕机,可以立即将请求切换到从服务器,

    从而避免Redis服务中断。

    复制原理:

    1. 从节点向主节点发送 sync 命令, 请求同步数据
    2. 主节点收到sync命令,开始执行bgsave持久化数据到一个 rdb文件,并且在持久化期间会将所有新执行的写入命令都保存到一个缓冲区
    3. 当持久化数据执行完毕后,主节点将该RDB文件发送给从服务器,从服务器接收该文件,并加载到内存中。
    4. 主节点将缓冲区中的指令发送给从节点
    5. 每当主节点接收到写命令时,都会将该指令按照Redis协议发送给从节点,从节点接收并处理主节点发过来的命令。

    image.png

    上述流程以及可以完成主从复制的基本功能,但是由于bgsave是一个重量级的操作,如果复制过程中发现了网络问题,从节点重写连到主节点时,又执行了

    sync 请求,如果这个重连的时间很短的化,主节点数据没有发生很大的变化, 这时是没必要重新生成快照的,所以 Redis2.8 以后提出了新的主从复制解决方案,从服务器会记录已经从主节点接收到的数据量(复制偏移量),Redis主节 点会维护一个复制缓冲区,记录自己已执行且待发送给从服务器的命令请求,同时还需要记录缓冲区第一个字节的复制偏移量,从节点同步请求改为了 psync,

    当从节点连接到主节点是会 发送 psync 同时带上已经接收到的复制偏移量,如果该复制偏移量在主节点的复制缓冲区区间内,则不需要执行持久化操作,主节点直接发送复制缓冲区中的指令即可。这就是部分重同步。