一、复制的目的
二、复制的原理(分为同步和命令传播两个操作)
2.1、旧版redis复制的原理
-
旧版redis的复制功能
- 同步是指主服务器把缓存数据复制到从服务器上,具体是:
- 1、从服务器向主服务器发生SYNC命令;
- 2、主服务器接收到SYNC命令后,执行BGSAVE命令,生成RDB文件,同时还会用一个缓冲区记录从现在开始的所有写操作命令;
- 3、当主服务器的BGSAVE命令执行完毕,即生成万RDB文件后,会将RDB文件发送给从服务器,从服务器接收到之后,载入到内存;
- 4、主服务器会把缓冲区记录的写操作命令也发送给从服务器去执行。
- 同步操作使得主从服务器达到或者接近达到数据一致了;但是如果刚同步完,主服务器又有写操作进来,此时显然数据不一致了,为了让主从服务器再一次达到数据一致状态,主服务器就需要对从服务器进行命令传播操作,即将主服务器执行的写命令,发送给从服务,从服务器也执行这个写命令。操作完成之后数据又一致了。为了让主从服务器的数据状态再次一致,主服务器需要到从服务器执行命令传播操作,即把主服务器执行的命令发送给从服务器执行一遍。
- 同步是指主服务器把缓存数据复制到从服务器上,具体是:
- 新版redis的复制功能
- 同步操作。使用PSYNC命令来执行同步操作
- PSYNC命令具有完全重同步和部分重同步两种模式
- 完全重同步模式和旧版reids同步逻辑基本一样,不细说。
- 部分重同步模式,在主从服务器断线重连后,主服务器只需要将断开连接期间执行的写命令完整的发送给从服务器执行即可。不需要生成RDB文件,也不需要传输RDB文件到从服务器。
- 命令传播和旧版redis一致
三、复制的优缺点
- 旧版redis的复制功能的缺点
- 主从服务器短线重连,重复之后的数据同步。会生成包含已经被同步过的数据的RDB文件,而RDB又要发送给从服务器,资源浪费、而且效率低。
四、复制的重要细节点
-
对于主服务器挂掉、从服务器挂掉,从哪个服务器复制数据、从什么位置复制数据的问题?
- PSYNC命令提供了解决方案,PSYNC命令具有完全重同步和部分重同步两种模式
-
完全重同步
- 略
-
部分重同步,部分重同步由三部分操作来完成
- 主从服务器的位置偏移量,对比位置偏移量相等来确定主从服务器数据一致;
- 主服务器的复制基于缓冲区,保存着最近一段时间内发送给从服务器的写操作命令的一块内存区域;对比重新连接后的从服务器发送过来的位置偏移量是否在缓存区内,如果在,从指定偏移量补发,如果不在则走完全同步逻辑。
- 主服务器运行ID,主从服务器初次建立连接时,主服务器把自身的服务ID发送给从服务器,断线重连后,从服务器写的着记录的主服务器ID,对应的主服务器接收到从服务器发过来的ID,通过和自身的ID比较,如果相同,尝试走部分同步逻辑,如果不同走完全同步逻辑。