(1) 当启动一个 slave node 的时候,它会发送一个 PSYNC 命令给 master node。
(2) 若是这是 slave node 初次链接到 master node,那么会触发一次 full resynchronization 全量复制。
(3) 此时 master 会启动一个后台线程,开始生成一份 RDB 快照文件,同时还会将从客户端 client 新收到的全部写命令缓存在内存中。
(4) master 会将这个 RDB 发送给 slave,slave 会先写入本地磁盘,而后再从本地磁盘加载到内存中,
(5) 接着 master 会将内存中缓存的写命令发送到 slave,slave 也会同步这些数据。
(6) slave node 若是跟 master node 有网络故障,断开了链接,会自动重连,链接以后 master node 仅会复制给 slave 部分缺乏的数据。
node
若是主从复制过程当中,网络链接中断,那么能够接着上次复制的地方,继续复制下去,而不是从头开始复制一份程序员
master node 会在内存中维护一个 backlog,master 和 slave 都会保存一个 replica offset和一个 master run id,offset 就是保存在 backlog 中的。若是 master 和 slave 网络链接断掉了,slave 会让 master 从上次的offset 开始继续复制,若是没有找到对应的 offset,那么就会执行一次 resynchronization。redis
master在内存中直接建立rdb,而后发送给slave,不会在本身本地落地磁盘了缓存
适用状况:由于磁盘传输性能比较低,网络带宽容许的状况下能够考虑使用diskless模式。
配置以下:安全
repl-diskless-sync no repl-diskless-sync-delay 5
开启diskless模式,在主机开始同步以前须要等待全部slave的到来,并将传输任务缓存到传输队列。默认主机等待时间是5秒,若是设置为0时候,传输就不会等待全部从机的到来。网络
slave不会过时key,只会等待master过时key。架构
若是master过时了一个key,或者经过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。less
若是采用了主从架构,那么建议必须开启master node的持久化!不建议用slave node做为master node的数据热备。异步
master节点,必需要使用持久化机制,master的各类备份方案,还要考虑本地文件丢失的状况; 从备份中挑选一份rdb去恢复master; 这样才能确保master启动的时候,是有数据的
这里能够参考个人上一篇文章04.简单了解一下Redis企业级数据备份方案性能
hi~我是Mirror,一个为了自由安逸的将来而不断前进的的程序员。 若是你以为文章对你有一点点帮助,一个小小赞,即是对个人承认,若是有不足之处,也欢迎各位指正。