MST

星途 面试题库

面试题:Redis新版复制功能相比旧版在数据同步机制上有哪些创新

请详细阐述Redis新版复制功能中,数据同步机制相较于旧版有哪些改进与创新,例如在初次同步和部分重同步方面的差异。
46.7万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

初次同步改进

  1. 旧版
    • 旧版Redis在初次同步时,主服务器会执行BGSAVE命令生成RDB文件,然后将这个RDB文件发送给从服务器。在此过程中,主服务器会缓存新的写命令。
    • 从服务器接收到RDB文件后,会先加载RDB文件到内存,然后再接收并执行主服务器缓存的写命令。这种方式如果主服务器数据量非常大,生成RDB文件以及传输RDB文件的过程可能会耗费较长时间,并且在生成RDB文件期间主服务器可能会因为BGSAVE占用较多资源而影响性能。
  2. 新版
    • 新版Redis采用了PSYNC2协议(Redis 4.0及以上)。在初次同步时,主服务器不需要像旧版那样生成RDB文件,而是直接使用内存中的数据以一种更高效的方式进行数据传输。这避免了生成RDB文件带来的I/O开销和性能影响。
    • 主服务器会将内存中的数据进行流化处理,以一种连续的数据流形式发送给从服务器,从服务器可以逐步接收并处理这些数据,加快了初次同步的速度,尤其对于大数据量场景优势明显。

部分重同步改进

  1. 旧版
    • 旧版Redis在部分重同步方面存在局限性。当主从服务器之间的网络连接短暂中断后,从服务器如果想进行部分重同步,需要主服务器在内存中缓存一定量的写命令(通过repl_backlog_size配置)。如果网络中断时间较长,主服务器缓存的写命令超出了repl_backlog_size,从服务器就无法进行部分重同步,只能重新进行全量同步。
    • 而且旧版在判断是否可以进行部分重同步时,机制相对简单,依赖于主服务器的复制偏移量和复制积压缓冲区,对于复杂网络环境下的处理能力较弱。
  2. 新版
    • 新版Redis在部分重同步方面有显著改进。除了传统的基于复制偏移量和复制积压缓冲区的部分重同步机制外,PSYNC2协议引入了runidoffset的概念。主服务器每次重启会生成新的runid,从服务器保存了主服务器的runid和自己的复制偏移量offset
    • 当网络中断恢复后,从服务器向主服务器发送PSYNC <runid> <offset>,主服务器可以根据runid判断是否可以进行部分重同步。如果runid匹配且偏移量在复制积压缓冲区范围内,就可以进行部分重同步,极大地提高了部分重同步的成功率,减少了不必要的全量同步,提高了主从复制的稳定性和效率。
    • 此外,新版在处理部分重同步时对于网络抖动等异常情况的容错能力更强,能够更好地适应复杂多变的网络环境。