Redis主从复制
通过Slaceof选项,让一个服务器去复制另外一个服务器,将被复制的服务器为主服务器,而对主服务器进行复制的服务器则被称为从服务器。
SLAVEOF <IP><PORT>
进行复制中的主从服务器双方的数据将会保存相同的数据,称之为数据一致。
数据一致性的实现
SYNC命令(旧版本)
从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令完成。
- 从服务器向主服务器发送SYNC命令
- 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
- 当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态。
- 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新值至主服务器数据库当前所处的状态。
实时保持数据一致
在主服务器被修改的时候,会对从服务器进行执行命令传播操作:主服务器会将自己执行的写命令,也就是造成主从服务器不一致的那条写命令,发送给从服务器执行,当从服务器执行相同的写命令之后,主从服务器将再次回到一致状态。
旧版复制功能的缺陷
当从服务器掉线重连的时候,主服务器会重新执行一次SYNC命令,会造成很多资源的浪费。
PSYNC命令(新版本)
Redis使用PSYNC命令来实现复制时的同步操作。
PSYN命令有完全同步和部分重同步。
- 完全重同步:用于处理初次复制的情况:完全重同步的执行步骤和SYNC命令的执行步骤基本一样,都是通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。
- 部分重同步:用于处理断线后复制的情况:当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。
时间 | 主服务器 | 从服务器 |
T0 | 主从服务器同步完成 | 主从服务器同步完成 |
T1 | 执行并传播命令SET K2 V2 | 执行主服务器传来的SET k2 v2 |
....... | ....... | ........ |
T1000 | 主从服务器断开 | 主从服务器断开 |
T1001 | 执行 SET K10086 V10086 | 断线尝试重连 |
T1002 | 执行 SET K10087 V10087 | 断线尝试重连 |
T1003 | 主从服务器重连 | 主从服务器重连 |
T1004 | 向主服务器发送PSYNC命令 | |
T1005 | 向从服务器返回+CONTINUE回复,表示执行部分重同步 | |
T1006 | 接收+CONTINUE回复,准备执行部分重同步 | |
T1007 | 向从服务器发送 K10086 V10086、 K10087 V10087命令 | |
T1008 | 接收并执行主服务器传来的两个SET命令 | |
T1009 | 主从服务器再次完成同步 | 主从服务器再次完成同步 |
可以明显看出PSYNC命令的部分重同步比SYNC快的多资源也少得多,因为PSYNC的部分重同步只需要将从服务器缺少的写命令发送给从服务器执行就可以了。