复制
![](https://img.haomeiwen.com/i12744765/8cf28b589f5fba6e.png)
旧版复制功能(2.8版本以前)
- 同步
![](https://img.haomeiwen.com/i12744765/33a187f27a620f93.png)
- 命令传播
![](https://img.haomeiwen.com/i12744765/3e4897238e3cda3c.png)
旧版复制功能的缺陷
- 初次复制
从服务器从未进行过复制,或者当前要复制的主服务器和上一次复制的主服务器不同
- 断线后重复制
处于命令传播阶段的主从服务器因为网络中断了复制,从服务器自动重连成功继续复制
旧版复制在断线重连后会重新执行一次同步操作,主服务器会将完整的RDB文件发送给从服务器
新版复制功能的实现
![](https://img.haomeiwen.com/i12744765/67c75fde92d7c681.png)
部分重同步实现
- 复制偏移量(主从服务器都有)
![](https://img.haomeiwen.com/i12744765/8b67427bdcf36edb.png)
复制偏移量可以用来判断主从服务器状态是否一致
- 复制积压缓冲区(主服务器有)
由主服务器维护的一个固定长度的FIFO队列,默认大小为1MB
![](https://img.haomeiwen.com/i12744765/587fe09ec0e63be9.png)
从服务器重新连上主服务器后会通过PSYNC发送自己的offset,主服务器会进行判断:
- offset后的数据还在积压缓冲区,则执行部分重同步
- offset后的数据不在积压缓冲区,则执行完整同步
复制积压缓冲区的设置:repl-backlog-size
- 服务器运行ID(run ID)
- 每个服务器都有,服务启动自动生成,40位随机的16进制字符
- 初次复制,主服务发送本机run ID 给从服务器,从服务器保存
- 断线重连参考下图
![](https://img.haomeiwen.com/i12744765/b423762f7a5dac61.png)
PSYNC命令实现
![](https://img.haomeiwen.com/i12744765/5dd4a32b81569d69.png)
复制的实现
- 从服务器设置主服务器的地址和端口
- SLAVEOF是异步命令,设置完地址和端口后从服务器返回客户端OK,之后进行同步
- 从服务器与主服务器建立套接字连接
- 从服务器可以视为主服务器的一个客户端
- 从服务器发送PING命令
- 收到PONG,一切正常
- 读取恢复超时或者主服务器返回错误,断开重连主服务器
- 身份验证
-
根据masterauth配置决定是否进行身份验证
image
- 发送端口信息
- 同步
- 主从服务器互为客户端
- 命令传播
心跳检测
- 默认每个一秒发送心跳
- 检测网络连接状态
- 辅助实现min-slaves配置选项
- 检测命令丢失(心跳会携带复制偏移量)
网友评论