1:从库刚刚加入,这是需要执行一次全量复制,首先需要与主库进行协商,向主库发送psync ? -1 命令,主库收到命令后回复 FULLPSYNC {自己的id} {自己的偏移量}
然后开始执行BGSAVE命令 保存当前数据库状态 生成RDB文件 并传输给从库
从库收到文件后 首先清空自身的数据库 然后加载RDB文件
由于在此过程中 主库还是可以接收到用户的写请求 主库会暂时将这些命令记录到replaciton buufer 最后发送到从库 从库再重新执行这些命令 保持与主库数据一致性
2:全量复制完毕之后 就进入到了命令传播阶段 这阶段主从库保持长连接 主库每次收到写请求 都会发送从库 从库跟着执行
3:增量复制,当主从库之间断开连接 这是后主库收到的写命令还会被写入到积压队列(repl_backlog _buffer 这是一个环形的缓冲区 缓冲区满时会从头开始覆盖写入) 当网络恢复后 从库向主库发送 psync命令 并带上最后从主库接受命令的偏移量 主库根据将repl_backlog _buffer偏移量之后的内容发给从库 从库执行恢复断开期间主库接收到的命令 如果断开期间过久 或者主库此时写入频繁 积压队列发生了覆盖 此时只能执行全量复制了
为什么主从库同步采用RDB文件而不使用AOF文件?
因为RDB文件是二进制文件 且进行了压缩
传输和后续的加载效率都要高于AOF文件
从库过多时,主库给每一个从库全量复制都要调用BGSAVE命令 并发送RDB文件 影响主库性能 如何处理?
采用 主 从 从模式 一批从库选择从已经同步完成数据的从库进行同步