- 成为从服务器的命令:
SLAVEOF
复制功能分为 同步
+ 命令传播
同步
:将从服务器的状态更新到主服务器的状态(只在建立连接的时候)
命令传播
:同步完成之后,主服务器接收到命令,导致的主从双方不一致的情况,通过命令的传播来维持主从的一致性
同步功能的实现
-
SYNC命令
(旧版本的复制功能)=完整的重同步 -
PSYNC命令
(新版本的复制功能)=完整重同步+部分重同步
旧版的SYNC操作
- 从服务器发送SYNC命令
- 主服务器收到SYNC命令后,执行BGSAVE命令,生成RDB文件(这个RDB文件仅记录到执行BGSAVE命令时的数据库状态),
并且创建一个缓存区将从现在开始的写命令写进来
- 从服务器加载RDB文件,恢复到主服务器开始BGSAVE时的状态
- 主服务器将缓冲区的命令发送给从服务器,保证生成RDB文件时的写命令也能被完整执行
旧版SYNC的缺点
:只有单纯的完整重同步导致断开连接后重连上来的从服务器也必须要让主服务器重新生成RDB文件。
1.生成RDB文件影响性能
2. 传输RDB文件增加网络负担
所以在新版本的PSYNC命令
中增加了部分重同步
的操作
新版的PSYNC
从服务器断开连接后重新连接的主服务器如果还是原来的那台,并且中间两者相差的命令查的不多,可以仅对中间相差的命令做部分的重同步
- 主从服务器各自维护一个偏移量offset
- 主服务器每次向从服务器复制N个字节的数据时,就将自己的offset增加N
- 从服务器接收到N个字节的数据时,就将自己的offset增加N
- 通过这两个offset就可以知道主从服务器之间相差的偏差了
PSYNC的复制积压缓存区
:主服务器维护一个先进先出(FIFO)的固定长度的队列(默认1MB),主服务器在复制给从服务器的时候,也会往这个队列里面存放数据。其中每一个字节都有对应的偏移量offset(和主从服务器维护的offset一个概念)
- 当PSYNC命令时,发现主从服务器有偏差,并且从服务器当前的offset还在这个
复制积压缓存区
的话,就可以使用部分重同步
了
PSYNC命令 PYSNC <runid> <offset>
runid:本从服务器上次同步的主服务id,用来比较是不是断开前连接的是本主服务器,如果不是,直接完整重同步
offset:从服务器当前的offset,用来判断是否使用部分重同步
复制的实现步骤
- 设置需要同步的主服务器
SLAVEOFip
port
- 建立socket
- 发送PING命令确认连接是否正常
- 身份验证
- 发送端口命令 --告诉主服务器自己的监听端口(不知道啥作用)
- 同步 PSYNC
- 命令传播
- 心跳检测
- 检查网络连接状态
- 检测命令丢失(传递offset)
- 辅助实现 min-slaves (还不知道怎么实现)