redis主从同步 - 969251639/study GitHub Wiki

主要使用psync命令来实现,psync具有完整重同步和部分重同步两种模式:

  1. 完整重同步:用于处理初次复制情况,通过让主服务器创建并发送RDB文件,以及向从服务器发送保持在缓冲区里面的写命令来进行同步
  2. 部分重同步:用于处理断线后复制情况,当从服务器断线重连后,如果条件允许,主服务器可以将主从断开期间的写命令发送给从服务器

部分重同步的实现:

  1. 主服务器的复制偏移量和从服务器的复制偏移量
  2. 主服务器的复制积压缓冲区
  3. 服务器的运行ID

复制偏移量
主从期间,主从双方各自维护一个偏移量,其中主的偏移量总是大于等于从的偏移量,通过两者的比较很容易判断出从服务器缺失的部分

复制积压缓冲区
主服务器的复制积压缓冲区会保存一部分最近传播的写命令,且复制积压缓冲区会为队列中的每个字节记录相应的复制偏移量

当从服务器重新连上后,从服务器会通过psync命令将自己的复制偏移量offset发送给主服务器,主服务器会根据这个偏移量来决定对从服务器执行何种行为

  1. 如果offset之后的的数据仍存在缓冲区中(也就是offset+1开始的数据),那么主从做部分重同步操作
  2. 如果offset之后的数据不在缓冲区中,那么主服务器将对从服务器执行完整重同步操作
    其中,redis的复制积压缓冲区默认大小为1M,需要谨慎的设置该选项

服务器的运行ID
每个redis服务器在启动运行时都会有自己的运行ID,由启动时随机生成一个40位的十六进制字符组成

主从初步复制时,主服务器会将自己的ID传送给从服务器,从服务器会将这个主服务器的ID保存起来,断线重连后会将此ID发送给主服务器,作为是不是从该主服务器上负责数据的依据