Redis 复制

37 阅读2分钟

前言

在redis中,用户可以执行SLAVEOF命令,让一个服务器复制另一个服务器。

同步过程

当一个服务器首次连接到主服务器或者在重连后,它会发起一次全量复制。这包括获取主服务器上的所有数据集。

主服务器会执行bgsave创建一个RDB文件,并将此期间接收的所有写命令缓存的内存中。

一旦RDB文件生成完成,主服务器会将其发送给从服务器,从服务器接收到RDB文件后,清空现有的数据库并加载这个RDB文件到内存,同时主服务器开始向从服务器发送缓存中的写命令,当从服务器完成了RDB文件加载后,它开始应用哪些缓存中的写命令

部分复制

如果主从连接中断了,但又很快恢复了,那么就不需要再进行全量复制,从服务器会尝试进行部分复制,这时从服务器会告诉主服务器自己最后处理的复制偏移量。主服务器检测偏移量是否还在自己的复制积压缓冲区中,如果在的话,直接发送这部分丢失的数据给从服务器,否则进行全量复制。

命令传播

在全量复制完成后,主服务器每执行一个写命令,都会将该命令同步到从服务器上。

从服务器接收到这些命令后立即执行,保持与主服务器的数据一致性。

心跳检测

主从服务器之间会定期发送ping/pong消息用于检测对方的状态,以及网络状况。

如果从服务器长时间没有响应,则认为是下线状态;同样地,如果主服务器长时间没有响应,从服务器可能会旋转一个新的主服务器或等待当前主服务器恢复。