作为一个一主多从这样的一个结构设计,那么他的数据同步是非常一个重要的点。而Redis的同步设计可以分成全量同步和增量同步
全量同步
全量同步发生在Slave初始化的时候,也就是如上图:1-1和1第一次建立连接,1-2和1-1第一次建立连接的时候就会发送PSYNC命令:
这个命令过程如下:
主服务器执行BGSAVE命令-->生成RDB快照文件-->向从服务器发送RDB文件并且记录写命令-->从服务器收到后把自己原先的数据全丢了载入快照文件的数据-->载入完成后在执行记录的写命令写入到缓存里面。
增量同步
增量同步时Salve初始化后正常运行过程中,只要主服务器执行了一个写的命令,那么主服务器就和向从服务器发送一个一模一样的写命令,将数据写入缓存。
部分增量同步:
在Redis 2.8之前时SYNC的命令,这个命令时没有增量同步的,不管是什么环节,也就是每次都是全量同步,比较消耗资源,而且效率不高,并且到了如果数据量大的话,突然有个Salve宕机后重新连接,就会和多个服务器进行连接同步数据,可能会导致IO剧增宕机。
在2.8后呢就优化成使用PSYNC命令了,只有服务器初始化的时候全量同步,之后正常运行过程中都是增量同步。并且在这个过程中会维护主从服务器的偏移量和ID,如果这时候有个Slave宕机重新连接,会判断这个重新连接的服务器和主服务器是否时同一个ID,如果相同,就会找到主服务器的和从服务器的偏移量的位置,也就是上次宕机断开的点继续复制后面的数据。