Redis--复制

Redis--复制

复制功能的实现

  • 1.通过SLAVEOF命令可以让从服务器同步主服务器的数据。

旧版复制实现的机制

  • 1.复制主要是同步和命令传播。
  • 2.同步(1):从服务器向主服务器发送SYNC命令,主服务器执行BGSAVE,在后台生成一个RDB文件,并使用一个缓冲记录从现在开始执行的所有写命令。
  • 3.同步(2):主服务器把生成好的RDB文件传递给从服务器,从服务器利用RDB文件更新至主数据库执行命令BGSAVE.
  • 4.同步(3):主服务器将缓冲区命令发给从服务器,从服务器执行完毕则状态和主服务器状态一致。
  • 5.命令传播(1):同步完成之后,主服务器执行的命令会传播到从服务器,进而数据库状态就一致。

旧版复制实现的缺陷

  • 1.复制功能主要是两种情况:初次复制,断线后重复制。
  • 2.旧版本复制对于初次复制来说是没有缺陷的,但是断线后重复制却会导致重新全同步进而导致效率变低。

新版复制功能的实现

  • 1.对比旧版本复制,采用PSYNC替代SYNC
  • 2.PSYNC命令采用:完整重同步和部分重同步两种模式。
  • 3.完整重同步:步骤和SYNC一致。
  • 4.部分重同步:只需要将从服务器断线连接期间未接收到的命令重新发给从服务器。

部分重同步的实现

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

PSYNC命令的实现

  • 1.从服务器接收到客户端的SLAVEOF命令
  • 2.从服务器判断是否是第一次执行复制
  • 3.是的话就直接发送PSYNC?-1 直接全同步。
  • 4.如果不是的话向主服务器发送PSYNC runid offset
  • 5.主服务器返回contine就执行部分重同步,否则就是全同步。
  • 6.主服务接收到PSYNC runid offset:首先 主服务器判断runid是否以前同步过
    没有的话就直接执行全同步,有的话就查看offset在命令缓冲区是否存在,如果存在
    执行半同步,否则就执行全同步。

复制的实现

  • 1.在从服务器的配置问中配置主服务器的地址和端口
  • 2.建立socket
  • 3.发送PING命令
  • 4.身份验证
  • 5.从服务器将自己的监听端口号发送给从服务器。
  • 6.同步
  • 7.命令传播

心跳检测

  • 0.在命令传播阶段,从服务器默认每秒一次向主服务器发送命令,命令会传递从服务器复制的偏移量
  • 1.该命令可以检测主从服务器网络。
  • 2.命令会检测 从服务器的下面配置。通过min-slaves-to-write (从服务器的数量),min-slaves-max-lag(从服务器的延迟大于10秒)
  • 3.检测命令丢失,即偏移量是否丢失

你可能感兴趣的:(Redis--复制)