slaveof 命令
如果是通过配置文件配置的主从,主会广播,但是通过slaveof 命令返回ok的主从,只有第一次复制数据(todo 为什么)
全量复制
- 主服务器调用bgsave,生成rdb文件
- 生成rdb文件的同时,将增量的命令写入缓冲区暂存
- rdb同步给从服务器
- 缓冲区命令发送给从服务器
- 达到一致的状态
缺点
bgsave的成本很高,如果仅仅是短时间断线,全量的数据同步有点不靠谱
增量复制
- 主服务器和从服务器同时维护一个偏移量,偏移量大小为同步的字节数
- 当主从一致的时候,偏移量大小是一致的
- 偏移量不一致的时候,主服务器会维护一个定长队列来存储最近一部分的命令,带有偏移量标识,用于同步
- 如果需要同步的值超过了队列的大小,那么就要启用全量同步了
之前有个问题一直没有想明白。由于所有的命令不一定都是幂等操作,命令+偏移量也不一定是一个原子操作,那么是先修改偏移量还是先执行命令,好像都有问题
现在想明白了,增量复制仅适用于网络波动,而不适用于机器挂了的情况。如果机器挂了,偏移量也没了,毕竟不落地,全量很安全。