目录 (Table of Contents)
[TOCM]
介绍
在Redis中,用户可以通过执行SLAVEOF命令或者设置salveof选线,让一个从服务器去复制主服务器。进行复制中的主从服务器双方的数据将保存相同的数据。
流程
旧版功能实现
Redis的复制功能分为同步和命令传播两个操作。
同步
同步就是从服务器根据获得的主服务其的RDB文件文件,将数据库状态跟新到和主服务器一致。
命令传播
在同步流程之后,主服务器讲自己执行的写命令发送给从服务器执行。
功能缺陷
旧版本能很好完成初次复制工作,但是对于短线后重复制来说,效率很低,因为每次都要重新导入RDB文件
新版本功能实现
新版本的PSYNC命令具有完整重同步和部分重同步两种模式。
完整重同步:用于初次处理复制情况,和SYNC命令执行步骤基本一致
部分重同步:在SYNC命令的基础上,当服务器断线重连之后,如果条件允许,主服务器可以将从服务器连接断开期间的执行的写命令发送给从服务器。
重同步的实现
复制偏移量
主从服务器维护一个偏移量,偏移量用来记录主服务器发送给从服务器的命令的字节数。这样通过判断偏移量就知道主从服务器是否一致。
复制积压缓冲区
由主服务器维护的一个固定长度,先进先出的队列(结构是list),默认大小1M(可配置)。保存了一部分最近传播的写命令,并为每个字节记录相应的复制偏移量。
当服务器重新连上时,从服务器会通过PSYNC命令将自己的偏移量发送给主服务,如果两者偏移量不一致,主服务器就会检查积压缓冲区中是否还保存的丢失的那些命令。如果有就向从服务器发送+CONTINUE回复,表示数据同步将以部分重同步模式来进行,然后把哪些命令发送给从服务器。
服务器运行ID
每个服务器有一个自己的运行ID,重连之后,从服务器会给主服务器发送之前保存的主服务器的运行ID,这样主服务就知道之前的ID是不是自己的,如果是的话就执行部分重同步。如果不是的话执行完整重同步。
心跳检测
主服务器通过发送和接收REPLCONF ACK命令来检查两者之间的网络是否正常:如果主服务器超过一秒钟没有收到从服务器发送的REPLCONF ACK命令,那么主服务器就知道出问题了。
当我们想了解连接状态时,可以向主服务器发送INFO replication命令,会显示出从服务器信息,lag字段表明了距离从服务器最后一次向主服务器发送REPLCONF ACK命令距离现在多少秒。超过1秒说明出现连接故障。