Redis的主从同步是如何实现的

Redis的主从复制可以根据是否是全量,分为全量同步和增量同步(也叫全量复制和部分复制)。

  • 全量复制一般用于初次复制的场景
  • 部分复制则用于处理因网络中断等原因造成数据丢失的场景

从2.8版本开始,Redis使用psync命令完成主从数据同步。

psync命令需要以下参数的支持:

  1. 复制偏移量:主节点处理写命令后,会把命令长度做累加记录,从节点在接收到写命令后,也会做累加记录;从节点会每秒钟上报一次自身的复制偏移量给主节点,而主节点则会保存从节点的复制偏移量。
  2. 积压缓冲区:保存在主节点上的一个固定长度的队列,默认大小为1M,当主节点有连接的从节点时被创建;主节点处理写命令时,不但会把命令发送给从节点,还会写入积压缓冲区;缓冲区是先进先出的队列,可以保存最近已复制的数据,用于部分复制和命令丢失的数据补救。
  3. 主节点运行ID:每个Redis节点启动后,都会动态分配一个40位的十六进制字符串作为运行ID;如果使用IP和端口的方式标识主节点,那么主节点重启变更了数据集(RDB/AOF),从节点再基于复制偏移量复制数据将是不安全的,因此当主节点的运行ID变化后,从节点将做全量复制。

全量同步

全量同步发生在slave初始化的阶段,这个阶段slave需要将master上所有的数据都复制到本节点上,全量同步的步骤:

  1. 从节点连接与主节点连接后发送PSYNC命令;
  2. 主节点在接收到PSYNC命令后,执行BGSAVE命令开始生成RDB文件,并通过缓冲区记录在执行了BGSAVE后执行的所有写命令;
  3. 主节点在执行完BGSAVE命令后,向所有的从服务器发送快照文件,并在发送期间持续的记录写命令;
  4. Slave节点在收到快照文件后丢弃所有的旧数据,并载入新收到的快照;
  5. master在发送完快照后,开始向从服务器发送缓冲区中记录的这段时间内的写命令;
  6. 从服务器在载入快照数据完成后,开始接收缓冲区中的命令,并在Slave节点上执行;
  7. 在完成了数据同步后,Slave节点的数据初始化就算完成了,这时候Slave节点就可以开始接收客户端的读请求了

增量同步

增量同步是在Slave节点在初始化数据完成后正常工作期间,Master节点在接收到写请求后同步到从服务器的过程。

增量同步的过程就是Master节点在收到一个写请求后就会向Slave节点同步相同的命令,Slave节点接收并执行写命令。