当前位置:   article > 正文

【单独介绍主从同步的原理】SYNC和PSYNC的对比、优缺点_Redis08

psync
前言:
  • 先介绍主从同步是什么?
  • 2.8版本前后的不同?(SYNC的特点和缺点?PSYNC是什么?PSYNC有什么特别之处?)
  • 分别概述SYNC和PSYNC的同步原理?
1、概念:
  • 通过执行slaveof命令设置slaveof选项,实现一个服务器去复制另一个服务器的数据
  • 主数据库可以进行读写操作,当写操作导致主数据库变化时会自动将数据同步给从数据库
  • 从数据库一般是只读的,并接受主数据库同步过来的数据。
  • 一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
  • 在Redis 2.8之后使用PSYNC命令代替SYNC命令,执行复制同步操作
2、SYNC-全量同步:

在这里插入图片描述

(1)SYNC主从复制原理
  • 旧版本里redis主从同步使用的是SYSNC全量主从复制,主从数据复制主要包含:全量复制(从数据库初始化,全量同步)、增量复制(复制初始化结束后的复制)。 SYNC命令主从复制的过程如下:
    • slave节点启动后或断开重连后,会向master数据库发送SYNC命令。
    • master节点收到SYNC命令后会开始在后台保存快照(即RDB持久化,在主从复制时,会无条件触发RDB),并将保存快照期间接收到的命令缓存起来。
    • master节点执行RDB持久化完后,向所有slave节点发送快照RDB文件,并在发送快照期间继续记录被执行的写命令。
    • slave节点收到快照文件后丢弃所有旧数据(会清空所有数据),载入收到的快照。
    • master节点快照发送完毕slave节点载入快照完毕后,master节点开始slave节点发送缓冲区中的写命令
    • slave节点完成对快照的载入开始接收读命令请求,并执行来自master节点缓冲区的写命令。(slave节点始化完成)
    • master节点每执行一个写命令就会向slave节点发送相同的写命令,slave节点接收并执行收到的写命令。(命令传播操作,slave节点初始化完成后的操作)
(2)注意事项
  • 1)从服务器在同步时,会清空所有数据,服务器在与主服务器进行初连接时数据库中的所有数据都将丢失替换成新主服务器发送的数据
  • 2)Redis不支持主主复制
  • 3)主从复制不会阻塞master(不会阻塞master处理客户端请求),因为RDB是异步进行的;相反slave在初次同步数据时会阻塞不能处理客户端读请求。如果从节点执行bgrewriteaof(aof的重写),也会带来额外的消耗。
  • 4)当多个从服务器尝试连接同一个主服务器的时候,就会出现以下两种情况:
    • 一是:如果master节点保存快照还未执行,所有从服务器都会接收到相同的快照文件相同缓冲区写命令
    • 二是:如果master节点保存快照已经执行完毕,当主服务器与较早的从服务器完成以上全部步骤之后,主服务器会跟新连接的从服务器重新执行RDB保存快照
  • 5)主节点通过bgsave命令fork子进程进行RDB持久化,如果从服务器连接的时机不凑巧的话会进行多次RDB保存快照,会大量消耗主服务器资源(CPU、内存和磁盘I/O资源)。
(3)SYNC的缺陷
  • 主要的缺陷是主从服务器断线后会导致重复制,即处于命令传播阶段的主从服务器由于网络断开从服务器再次连接主服务器连接成功后,会进行RDB全量复制主服务器数据。
3、PSYNC-增量同步:

为了解决旧版本中断线情况下SYNC进行全量复制(同步)的低效问题,在Redis 2.8之后使用PSYNC命令代替SYNC命令执行复制同步操作,PSYNC具备了数据全量重同步部分重同步模式。

  • 1.全量重同步:跟旧版复制基本是一致的,可以理解为“全量”复制。
  • 2.部分重同步:salve断开又重新连时,在命令传播阶段,只需要发送与master断开这段时间执行的写命给slave即可,可以理解为“增量”复制。
(1)三个概念:
  • PSYNC执行过程中比较重要的概念有3个:runidoffset(复制偏移量)以及复制积压缓冲区

      1. runid:每个Redis服务器都会有一个表明自己身份的ID。在PSYNC中发送的这个ID是指之前连接的Master的ID从节点Redis断开重连的时候,就是根据运行ID来判断同步的进度:

        • 如果从节点保存的runid与主节点现在的runid相同,说明主从节点之前同步过,主节点会继续尝试使用部分复制(到底能不能部分复制还要看offset和复制积压缓冲区的情况);
        • 如果从节点保存的runid与主节点现在的runid不同,说明从节点在断线前同步的Redis节点并不是当前的主节点,只能进行全量复制
        1. offset(复制偏移量)
        • 主从复制的Master和Slave双方都会各自维持一个offset。Master成功发送N个字节的命令后会将Master里的offset加上N,Slave在接收到N个字节命令后同样会将Slave里的offset增加N。
        • Master和Slave如果状态是一致的那么它的的offset也应该是一致的。
        1. 复制积压缓冲区
        • 复制积压缓冲区是由Master维护的一个固定长度环形积压队列(FIFO队列),它的作用是缓存已经传播出去的命令。当Master进行命令传播时,不仅将命令发送给所有Slave,还会将命令写入到复制积压缓冲区里面
4、PSYNC执行过程

在这里插入图片描述

  • 如上图,PSYNC执行过程和SYNC的区别在于:salve连接时判断是否需要全量同步(多了一个判断动作),全量同步的逻辑过程和SYNC一样。PSYNC执行步骤如下:
    • 1.客户端向服务器发送SLAVEOF命令,即salve向master发起连接请求时slave根据自己是否保存Master runid来判断是否是第一次连接
    • 2.如果是第一次同步则向Master发送 PSYNC ? -1 命令来进行完整同步;如果是重连接,会向Master发送PSYNC runid offset命令(runid是master的身份ID,offset是从节点同步命令的全局迁移量)。
    • 3.Master接收到PSYNC 命令后,首先判断runid是否和本机的id一致,如果一致则会再次判断offset偏移量和本机的偏移量相差有没有超过复制积压缓冲区大小,如果没有超过(在可控范围内)那么就给Slave发送CONTINUE,此时Slave只需要等待Master发送断开期间丢失的命令
    • 如果runid和本机id不一致或者offset差距超过了复制积压缓冲区大小,那么就会返回FULLRESYNC runid offsetSlave将runid保存起来,并进行全量同步
  • 主节点在命令传播时,主数据库将每一个写命令传递给从数据库的同时,都会将写命令存放到积压队列,并记录当前积压队列中存放命令的全局偏移量offset。当salve重连接时,master会根据从节点传的offset在环形积压队列中找到断开这段时间执行的命令,并同步给salve节点,达到增量同步结果。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/208958
推荐阅读
  

闽ICP备14008679号