面试题答案
一键面试初次同步改进
- 旧版:
- 旧版Redis在初次同步时,主服务器会执行
BGSAVE
命令生成RDB文件,然后将这个RDB文件发送给从服务器。在此过程中,主服务器会缓存新的写命令。 - 从服务器接收到RDB文件后,会先加载RDB文件到内存,然后再接收并执行主服务器缓存的写命令。这种方式如果主服务器数据量非常大,生成RDB文件以及传输RDB文件的过程可能会耗费较长时间,并且在生成RDB文件期间主服务器可能会因为
BGSAVE
占用较多资源而影响性能。
- 旧版Redis在初次同步时,主服务器会执行
- 新版:
- 新版Redis采用了PSYNC2协议(Redis 4.0及以上)。在初次同步时,主服务器不需要像旧版那样生成RDB文件,而是直接使用内存中的数据以一种更高效的方式进行数据传输。这避免了生成RDB文件带来的I/O开销和性能影响。
- 主服务器会将内存中的数据进行流化处理,以一种连续的数据流形式发送给从服务器,从服务器可以逐步接收并处理这些数据,加快了初次同步的速度,尤其对于大数据量场景优势明显。
部分重同步改进
- 旧版:
- 旧版Redis在部分重同步方面存在局限性。当主从服务器之间的网络连接短暂中断后,从服务器如果想进行部分重同步,需要主服务器在内存中缓存一定量的写命令(通过
repl_backlog_size
配置)。如果网络中断时间较长,主服务器缓存的写命令超出了repl_backlog_size
,从服务器就无法进行部分重同步,只能重新进行全量同步。 - 而且旧版在判断是否可以进行部分重同步时,机制相对简单,依赖于主服务器的复制偏移量和复制积压缓冲区,对于复杂网络环境下的处理能力较弱。
- 旧版Redis在部分重同步方面存在局限性。当主从服务器之间的网络连接短暂中断后,从服务器如果想进行部分重同步,需要主服务器在内存中缓存一定量的写命令(通过
- 新版:
- 新版Redis在部分重同步方面有显著改进。除了传统的基于复制偏移量和复制积压缓冲区的部分重同步机制外,PSYNC2协议引入了
runid
和offset
的概念。主服务器每次重启会生成新的runid
,从服务器保存了主服务器的runid
和自己的复制偏移量offset
。 - 当网络中断恢复后,从服务器向主服务器发送
PSYNC <runid> <offset>
,主服务器可以根据runid
判断是否可以进行部分重同步。如果runid
匹配且偏移量在复制积压缓冲区范围内,就可以进行部分重同步,极大地提高了部分重同步的成功率,减少了不必要的全量同步,提高了主从复制的稳定性和效率。 - 此外,新版在处理部分重同步时对于网络抖动等异常情况的容错能力更强,能够更好地适应复杂多变的网络环境。
- 新版Redis在部分重同步方面有显著改进。除了传统的基于复制偏移量和复制积压缓冲区的部分重同步机制外,PSYNC2协议引入了