完全复制
- 第一步是同步
1)从服务器向主服务器发送SYNC命令。
2)收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
3)BGSAVE命令执行完毕后,将生成的RDB文件传输给从服务器,从服务器接收到开始更新。
4)主服务器将记录在缓冲区的所有写命令发送给从服务器,从服务器状态更新。
如下图示例所示: - 命令传播
主服务器将更改服务器状态的命令发送给从服务器。
部分复制
完全复制在效率上比较低,应为每次都需要生成RDB文件,从服务器也需要从RDB恢复数据。因此考虑部分复制,在非第一次同步的情况下,只传播断线过程中执行的更改主服务器状态的命令。如下图所示:
部分同步的实现有三个部分
- 主服务器的复制偏移量和从服务器的复制偏移量。
- 主服务器的复制积压缓冲区。
- 服务器的运行ID。
- 复制偏移量
主服务器每次传输N个字节数据,就将复制偏移量+N,从服务器收到N个字节,就加N,通过复制偏移量就可以知道是否是同步状态。 - 积压缓冲区
复制积压缓冲区维护一个固定长度的队列,大小为1MB。固定长度就是说队列的长度是固定的,如果入队后队列长度超过固定值,就将多余的值弹出。队列会保存字节的复制偏移量和字节内容。
复制的实现
通过向从服务器发送SLAVEOF命令,可以让从服务器复制一个主服务器。
- 设置主服务器地址和端口
从服务器需要首先保存主服务器的地址和端口。 - 建立套接字连接
- 发送ping命令
有两个作用:
1)检查套接字读写是否正常。
2)检查主服务器是否能正产处理请求。
如果返回一个命令回复但从服务器无法在规定时间内读取命令回复的内容,那么表示网络连接异常。如果返回一个错误,那么主服务器无法处理。 - 身份验证
- 发送端口数据
- 同步
- 命令传播