这里主要涉及到了主从复制的问题。
复制主要涉及到2个功能:同步和命令传播
同步
旧版本(sync)
步骤:
- 从服务器发送sync命令给主服务器
- 主服务器发送rdb文件给从服务器
- 并将缓冲区的所以写命令都发给从服务器
命令传播
需要主服务器发送命令给从服务器,他们的数据才会保存一致性。
旧复制功能的缺陷
在上表中,从服务器如果断开了连接,然后进行了重连,只好再次发送sync命令,然后再次载入rdb文件,这样对实现相对来说比较简单,但是,从服务器启动的时间会随着rdb文件的增大,而越慢。
复制(psync)
可以看到服务器增加了一个offset值,这个值说明着当前服务器上数据与主服务器是否同步。
如果是同步的,则主从的offset值是相同的。利用这个offset值,则可以在复制节点进行高效率同步
同时主服务器会在里面维护着一个复制积压缓冲区。
- 从服务器如果断开连接后,再次进行同步的话,
- 使用psync命令发送给主服务器,并且发送的时候会带上自己的offset值。
- 主服务器会判断从服务器的offset值之后的是否还在复制积压缓冲区当中,如果存在则返回continue
- 从复制积压缓冲区中发送从服务器offset之后的所有命令
- 如果不存在,则执行完整重同步。sync过程
复制的实现
- 设置主服务器的地址和端口
- 建立套接字连接
- 发送ping命令
- 如果需要身份验证,则进行身份验证
- 发送端口信息,让主服务器保存从服务器的信息
- 进行同步,如果是第一次连接,执行完整重同步,如果有offset值,则进行判断是否需要执行部分重同步。
- 命令传播