5. 主从复制

55 阅读2分钟

配置

使用slaveof命令或者配置slaveof命令

旧版基本流程

  1. 从服务器向主服务器发送sync
  2. 主服务器开始生成rdb文件.并把在此过程中的接受的其他命令缓存起来.
  3. 主服务器发送rdb文件到从服务器,并发送缓存的命令
  4. 从服务器执行rdb文件,并执行缓存的命令

旧版问题

旧版主要问题是在断线重连后,会重新上述流程.但是可能主从只断线了很短的时间.再次执行全流程会导致效率低下.

新版实现

新版复制分为全部重同步(旧版流程,只在从服务器首次复制时使用)部分重同步(断线重连).命令为psync .

实现细节

新增三个概念.

  1. 复制偏移量:用于确定从服务器从合适断开.主服务器的偏移量时发送的字节数,从服务器时接受的字节数.

  2. 积压缓冲区: 新进先出的命令命令信息队列.固定大小,默认为1m

  3. 服务id:

    当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,而从服务器则会将这个运行ID保存起来

    当从服务器断线并重新连上一个主服务器时,从服务器将向当前连接的主服务器发送之前保存的运行ID

部分重同步流程

  1. 从服务器重启后,发送psync命令到主服务器,并带上自己的复制偏移量N,上次连接的服务id.
  2. 如果从服务器发现偏移量N以后的数据都在积压缓冲区.那么就通知从客户端执行部分重同步,否则执行全同步
  3. 主服务器发送偏移量以后的命令. 从服务器执行命令

问题

问: 如何协调在发送同步积压指令和写入新命令之间的过程,比如在发送期间,又有新的命令写入? 如何处理.

答: 单线程,从机回复加载rdb完成后,主机直接发送缓冲区内的同步积压命令。

问: 首次复制的时候,主服务器返回+FULLRESYNC <runid> <offset>其中的offset由啥用?

答: offset则是主服务器当前的复制偏移量,从服务器会将这个值作为自己的初始化偏移量。(因为加载RDB文件后,从服务器无法知晓自己的offset)