Redis主从复制模式!

Redis 的主从复制和 MySQL 差不多,主要起着 数据备份,读写分离等作用。

Redis 中,可以通过 SLAVEOF 命令,让一个服务器去复制另一个服务器,被复制的服务器称为主服务器

发起复制的服务器称为从服务器,由两种服务器组成的模式称为主从复制

主从复制原理

Redis 的复制分为同步命令传播 两个操作:

  • 同步操作用于将从服务器数据库的状态更新为主服务器所处的状态。
  • 命令传播则相反,它主要作用在主服务器的数据库状态更改时,导致主从服务器的数据库状态出现不一致时,让主从回到一致的的过程。

同步:

img

客户端向从服务器发送 SLAVEOF 命令,先是判断是否是第一次复制,第一次是复制一般是刚开始组建主从关系。

是第一次复制:

  • 从服务器会向主服务器发送 PSYNC ? -1 命令,请求主服务器执行完整重同步操作。

主服务器接到完整重同步请求之后,将在后台执行 BGSAVE 命令,在后台生成一个 RDB 文件。

  • 并使用一个复制积压缓冲区记录从现在开始执行的所有写命令。

BGSAVE 命令执行完毕之后,主服务器会将 RDB 文件以及 缓冲区中记录的写命令发送给从服务器。

  • 还会向从服务器返回 +FULLRESYNC [主服务器 ID] [复制偏移量](和图中的 偏移量 是一个)。

从服务器接收到后,会载入 RDB 文件,并执行 主服务器给的 写命令,以此来达到和主服务器一致的数据状态。

如果不是第一次复制,那么说明从服务器可能是断线,导致和主服务器数据状态不一致,需要同步主服务器的数据。

  • 那么从服务器会按照下面的步骤来请求部分同步。

向主服务器发送 PSYNC [主服务器 ID] [复制偏移量](这个是第一次复制时主服务器传过来的),主服务器 ID 时断线前的主服务器。

  • 用于定位去同步那个主服务器的,复制偏移量是上一次同步的位置,用于定位具体的同步位置的。

主服务器接收到从服务器的命令后,并找到相应同步的位置后,会给从服务器发送 +CONTINUE 命令。

表示将于从服务器执行部分同步操作,之后主服务器会将保存在复制积压缓冲区对应 复制偏移量之后的所有数据发送给从服务器。

  • 但是如果找不到偏移量之后的数据,就会进行完整同步,这样就可以让从服务器达到和主服务器一致的状态。

命令传播:

主从服务器同步成功后,并不会一致保持这个状态,主服务器可能会执行写命令,这也主从数据就不一致了。

为了处理这种问题:

  • 主服务器会把自己执行的写命令发送给从服务器,当从服务器执行完这些命令之后,主从服务器的数据就一致了。

img