关于主从配置的过程,咱们这里就不作具体详细解释了,看这个文章,仍是不错的:html
http://www.javashuo.com/article/p-xqtimvdi-kb.html服务器
这才是咱们的主要问题,咱们来看一下htm
Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操做。blog
①、旧版同步get
当从节点发出 SLAVEOF 命令,要求从服务器复制主服务器时,从服务器经过向主服务器发送 SYNC 命令来完成。该命令执行步骤:同步
一、从服务器向主服务器发送 SYNC 命令ast
二、收到 SYNC 命令的主服务器执行 BGSAVE 命令,在后台生成一个 RDB 文件,并使用一个缓冲区记录从开始执行的全部写命令效率
三、当主服务器的 BGSAVE 命令执行完毕时,主服务器会将 BGSAVE 命令生成的 RDB 文件发送给从服务器,从服务器接收此 RDB 文件,并将服务器状态更新为RDB文件记录的状态。后台
四、主服务器将缓冲区的全部写命令也发送给从服务器,从服务器执行相应命令。原理
②、命令传播
当同步操做完成以后,主服务器会进行相应的修改命令,这时候从服务器和主服务器状态就会不一致。
为了让主服务器和从服务器保持状态一致,主服务器须要对从服务器执行命令传播操做,主服务器会将本身的写命令发送给从服务器执行。从服务器执行相应的命令以后,主从服务器状态继续保持一致。
总结:经过同步操做以及命令传播功能,可以很好的保证了主从一致的特性。
可是咱们考虑一个问题,若是从服务器在同步主服务器期间,忽然断开了链接,而这时候主服务器进行了一些写操做,这时候从服务器恢复链接,若是咱们在进行同步,那么就必须将主服务器重新生成一个RDB文件,而后给从服务器加载,这样虽然可以保证一致性,可是其实断开链接以前主从服务器状态是保持一致的,不一致的是从服务器断开链接,而主服务器执行了一些写命令,那么从服务器恢复链接后能不能只要断开链接的哪些写命令,而不是整个RDB快照呢?
同步操做实际上是一个很是耗时的操做,主服务器须要先经过 BGSAVE 命令来生成一个 RDB 文件,而后须要将该文件发送给从服务器,从服务器接收该文件以后,接着加载该文件,而且加载期间,从服务器是没法处理其余命令的。
为了解决这个问题,Redis从2.8版本以后,使用了新的同步命令 PSYNC 来代替 SYNC 命令。该命令的部分重同步功能用于处理断线后重复制的效率问题。也就是说当从服务器在断线后从新链接主服务器时,主服务器只将断开链接后执行的写命令发送给从服务器,从服务器只须要接收并执行这些写命令便可保持主从一致。
主从复制虽然解决了主节点的单点故障问题,可是因为全部的写操做都是在 Master 节点上操做,而后同步到 Slave 节点,那么同步就会有必定的延时,当系统很繁忙的时候,延时问题就会更加严重,并且会随着从节点slave的增多而越发严重。