合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
>[info] psync **psync命令运行需要以下组件支持** * 主从节点各自复制偏移量。 * 主节点复制积压缓冲区。 * 主节点运行id ***** >[info] 全量复制流程: 全量复制主节点会将RDB文件也就是当前状态去同步给slave,在此期间主新写入的命令会单独记录起来,然后当RDB文件加载完毕之后,会通过偏移量对比将这个期间产生的写入值同步给slave,这样就能达到数据完全同步的效果。 ![](https://img.kancloud.cn/e2/83/e2831fc467a0520a5e471e053d6875ba_665x370.png) ***** **全量复制过程:** 1. 在其内部有一条命令`psync`,是做同步的命令,它可以完成全量复制和部分复制的功能,当启动slave节点时,它会发送`psync`命令给主节点,需要传递两个参数,`runid`和`offset`(偏移量),也就是从向主传递主节点的runid以及自己的偏移量,对于第一次复制而言,就直接传递?和 -1,当然这个参数是由slave内部传的。 2. master接收到命令后知道从希望做全量复制,主就会将自己的runid和offset传递给从 3. slave节点保存master的基本信息 4. master执行`bgsave`生成RDB文件,并且在此期间新产生的写入命令会被记录到 5. 主向从传输RDB文件 6. 主向从发送复制缓冲区内容 7. 清空从节点旧的数据 8. 从节点加载RDB文件到内存中,同时加载缓冲区数据 ***** **全量复制的开销:** 实际上全量复制的开销是非常大的,主要体现在如下方面: 1. bgsave时间(对cpu、 内存、硬盘都会有一定的开销) 2. RDB文件网络传输时间(网络带宽) 3. 从节点清空数据时间(根据从节点的数据规模) 4. 从节点加载RDB的时间 5. 可能的AOF重写时间(在最后从加载完RDB之后如果开启了AOF,会做AOF重写) ***** **全量复制除了上述开销之外,还会有个问题:** 假如master和slave网络发生了抖动,那一段时间内这些数据就会丢失,对于slave来说这段时间master更新的数据是不知道的。最简单的方式就是再做一次全量复制,从而获取到最新的数据,在redis2.8之前是这么做的。 >[info] 部分复制 如果发生类似抖动时候,可以有一种机制将这种损失降低到最低,如何实现的? 1. 如果发生了抖动,相当于连接断开了 2. 主会将写命令记录到缓冲区,repl_back_buffer 3. 当slave再次去连接master时候,就是说网络抖动结束之后,会触发增量复制 4. 从会执行pysnc命令,将当前自己的offset和主的runid传递给master 5. 如果发现传输的offset偏移量是在buffer内的,不在期间内就证明你已经错过了很多数据,buffer也是有限的,默认是1M,会将offset开始到队列结束的数据同步给从。这样master和slave就达到了一致。 通过部分复制(增量复制)有效的降低了全量复制的开销。 ![](https://img.kancloud.cn/00/22/0022fef9af5febc10283d058b4becc0a_547x403.png) >[info] 1