在讲底层原理之前,我们先看下面的这张图
?我们先看第一阶段:
在搭建主从集群的时候,首先要认主人:
执行replicaof命令或者执行slaveof(slaveof ip port?)建立连接,连接一旦建立,slave就可以向master发请求数据同步,此时,我发送replid offset,master判断replid是否和我的id一直,如果不一致,那说明是第一次连接,我返回我的id和offset.slave保存版本信息。
再来看第二阶段:
这一阶段master要将所有的数据都发给slave,在redis中是有一种持久化机制将所有的数据保存到一个文件当中。那就是rdb.因此master执行bgsave生成RDB,然后发送到RDB文件。
第三阶段:
在生成RDB文件,发送RDB文件期间,可能仍然会有数据写入,这一部分操作的命令全部写入repl_backlog.第三阶段就是发送repl_baklog中的命令。slave执行接收到的命令。
如果slave重启同步后,则执行增量同步,master会去repl_baklog中获取offset后的数据。但是这里会出现一个问题,那就是repl_baklog大小有上限,如果写满后会覆盖最早的数据,这时候如果执行增量复制会丢失数据,因此,这个时候就要进行全量复制。
主从同步的优化
在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。