在Redis中,用户可以通过执行slaveof命令或者设置saveof选项让一个服务器去复制另一个服务器,称被复制的服务器称为master,对master执行复制的服务器称为slave。如:
192.168.0.4:6379>slaveof 192.168.0.3 6379
那么服务器192.168.0.4:6379称为slave,192.168.0.3 6379称为master。
进行复制中的主从服务器双方的数据库将保存相同的数据,概念上将这种现象称为“数据库状态一致”,或者简称“一致”。
旧版复制功能的实现:
(1)同步:当客户端向服务器发送slaveof命令,要求从服务器复制主服务器时,从服务器首先执行同步操作
a、Slave向Master发送sync命令
b、master执行bgsave命令生成RDB文件,并将RDB文件发送给slave
c、master将buf缓冲区里的写命令发送给slave执行,使主从一致。
(2)命令传播
在同步操作执行完毕后,主从服务器两者的数据库将达到一致,但这种一致并不是一成不变的,每当主服务器执行客户端发送的写命令时,主服务器的数据库就有可能会被修改,并导致主从服务器状态不一致。
为了让主从服务器再次回到一致状态,主服务器需要对从服务器执行命令传播操作:主服务器会将自己执行的写命令,也即是造成主从服务器不一致的那条命令,发送给从服务器执行,当从服务器执行了相同的写命令之后,主从服务器将再次回到一致状态。
旧版复制功能的缺陷:
断线重连后,从服务器需要完整的执行SYNC同步命令,将断线前的数据库状态及断线期间主服务器执行的写命令生成的RDB文件完整的复制,效率低下。
新版复制功能的实现:
(1)完整重同步
完整重同步跟SYNC命令执行步骤基本一样,都是通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区中的写命令来进行同步。
(2)部分重同步
断线重连后,slave给master发送PSYNC命令,master向slave发送自断线后的所有写命令,使主从服务器状态一致。