Redis - 主从复制
用户可以通过执行slaveof命令或者设置slaveof选项,让一个服务器去复制另一个服务器。
被复制的服务器为主服务器(master);对主服务器进行复制的服务器则被称为从服务器(slave)。
旧版主从同步过程 (只支持完整重同步)
- 从服务器向主服务器发送SYNC命令;
- 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令;
- 当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态;
- 主服务器将记录在缓冲区里边的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。
主从命令传播
主服务器会将自己执行的写命令,发送给从服务器执行。
新版主从同步 (从redis2.8版本开始支持)
- 使用PSYNC命令代替SYNC命令执行主从复制的同步操作。
- PSYNC命令具有完整重同步和部分重同步两种模式。
- 完整重同步和SYNC命令执行步骤基本一致。
- 部分重同步则用于处理断线后重复制情况:当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将那个数据库更新至主服务器当前所处状态。
- 部分重同步模式解决了旧版复制功能在处理断线后重复制时出现的低效情况。
部分重同步实现
- 执行复制的双方--主服务器和从服务器会分别维护一个复制偏移量。
- 通过对比主从服务器的复制偏移量,判断主从服务器是否处于一致状态。
- 主服务器维护一个固定大小的先进先出的队列(复制积压缓冲区),默认大小为1MB。
- 主服务器在进行命令传播的同时,还会将写命令入队到复制积压缓冲区,缓冲区队列中同样记录复制偏移量。
- 从服务器会通过PSYNC命令将自己的复制偏移量发送给主服务器,主服务器会根据这个复制偏移量判断执行哪种同步操作:偏移量之后的数据仍然存在复制积压缓冲区,则进行部分重同步操作,反之进行完整重同步操作。
- 复制积压缓冲区大小修改方法参考配置文件repl-backlog-size选项。
- 每个Redis服务器,不论主从服务器都会有自己的运行ID。
- 运行ID在服务器启动时自动生成,由40个随机的十六进制字符组成。
- 可以通过从服务器保存的主运行ID和当前连接主服务器的运行ID进行比较来判断是部分同步还是完整重同步。
心跳检测
- 主服务器通过向从服务器传播命令来更新从服务器状态,保持主从服务器一致,而从服务器则通过向主服务器发送命令(包含复制偏移量数据)来进行心跳检测,以及命令丢失检测。
- 主服务器向从服务器补发缺失数据是在主从服务器没有断线的情况下执行,部分重同步则是在主从服务器断线重连之后执行。
- REPLCONF ACK命令和复制积压缓冲区都是Redis2.8版本新增的,28版本之前,命令在传播过程中丢失,主从服务器都不会注意到,可能会存在主从数据不一致问题,建议升级到2.8以上版本。
网友评论