一.全量同步
主从第一次建立连接时,会执行全量同步,将master节点所有数据同步给slave节点
有几个概念
Replication Id:简称replid,是数据集的标识,id一致说明是同一个数据集。每个master都有唯一的replid,slave会继承master节点的replid。
offset:偏移量,slave完成同步后会记录当前同步的offset,如果slave的offset小于master的offset,说明slave的数据落后master,此时就需要进行同步
repl_baklog:一个文件记录Redis处理过的命令日志及offset,包括master当前的offset,和slave已经拷贝到的offset,slave与master的offset之间的差异,就是salve需要增量拷贝的数据了。
流程:
1.slave请求同步,发送replid和offset到master
2.master判断replid与自己是否一致,不一致,拒绝增量同步
3.master生成RDB文件,发送给slave
4.slave清空本地数据,加载RDB
5.master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
补充:master判断一个节点是否是第一次同步的依据,就是看replid是否一致。
二.增量同步
全量同步需要先做RDB,然后将RDB文件通过网络传输个slave,成本太高了。因此除了第一次做全量同步,其它大多数时候slave与master都是做增量同步。
流程:
1.slave请求同步,发送replid和offset到master
2.master判断replid和自己的一致,执行增量同步
3.master去repl_baklog中获取offset之后的数据,发送给slave
4.slave执行同步
三 .结论
全量同步和增量同步区别?
-
全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。
-
增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave
什么时候执行全量同步?
-
slave节点第一次连接master节点时
什么时候执行增量同步?
-
slave节点断开又恢复