复制
- Redis中用户可通过SLAVEOF命令 或者 设置slaveof选项,使得一个服务器去复制另一个服务器;主服务器:被复制的服务器;从服务器:对主服务器进行复制的服务器;
- 数据库状态一致:执行过复制操作后主从服务器的数据库将保存相同的数据;
- 旧版本复制功能的实现:Redis的复制功能分为“同步” 和 “命令传播”;
- “同步”:将从服务器的数据库状态更新至主服务器当前所处的数据库状态;
- “命令传播”:用于主服务器的数据库状态被修改,导致主从服务器又出现数据库状态不一致的情况时,让主从服务器重新回到一致状态;
- 同步(旧版):
- 当客户端向从服务器发送SLAVEOF命令,要求从服务器赋值主服务器时,从服务器先需要执行同步操作(即将从服务器的数据库状态更新至主服务器当前所处的状态)。
- 从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令:
- 从服务器向主服务器发送SYNC命令;
- 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令;
- 主服务器的BGSAVE命令执行结束会生成一个RDB文件,主服务器将该RDB文件发送给从服务器;从服务器接收并载入该RDB文件,将自身数据库状态更新至主服务器执行BGSAVE命令时的状态;
- 从服务器载入RDB文件结束后,主服务器将记录在缓冲区中的所有写命令发送给从服务器,从服务器执行这些命令,最终主从服务器数据库状态达到一致;
- 命令传播:
- 当经过同步操作使得主从服务器数据库状态达到一致后,每当主服务器执行客户端发送的写命令时,主服务器的数据库状态就有可能会被修改,进而导致主从服务器状态不再一致;
- 为了让主从服务器再次达到数据库状态一致就需要进行命令传播,即将主服务器执行的那条改变主服务器数据库状态的写命令发送给从服务器,从服务器执行发送来的命令后使得主从服务器再次回到一致状态;
- 旧版复制功能的缺陷(Redis 2.8以前版本为旧版本):
- Redis 2.8 版本以前,从服务器对主服务器的复制可以分为:①初次复制、②断线后重复制;
- “初次复制”:从服务器没有复制过任何主服务器