Redis主从复制模式!
Redis主从复制模式!
月伴飞鱼
Redis
的主从复制和MySQL
差不多,主要起着 数据备份,读写分离等作用。在
Redis
中,可以通过SLAVEOF
命令,让一个服务器去复制另一个服务器,被复制的服务器称为主服务器。发起复制的服务器称为从服务器,由两种服务器组成的模式称为主从复制。
主从复制原理
Redis
的复制分为同步 和 命令传播 两个操作:
- 同步操作用于将从服务器数据库的状态更新为主服务器所处的状态。
- 命令传播则相反,它主要作用在主服务器的数据库状态更改时,导致主从服务器的数据库状态出现不一致时,让主从回到一致的的过程。
同步:
客户端向从服务器发送 SLAVEOF 命令,先是判断是否是第一次复制,第一次是复制一般是刚开始组建主从关系。
是第一次复制:
- 从服务器会向主服务器发送 PSYNC ? -1 命令,请求主服务器执行完整重同步操作。
主服务器接到完整重同步请求之后,将在后台执行 BGSAVE 命令,在后台生成一个 RDB 文件。
- 并使用一个复制积压缓冲区记录从现在开始执行的所有写命令。
BGSAVE
命令执行完毕之后,主服务器会将RDB
文件以及 缓冲区中记录的写命令发送给从服务器。
- 还会向从服务器返回
+FULLRESYNC [主服务器 ID] [复制偏移量]
(和图中的 偏移量 是一个)。从服务器接收到后,会载入
RDB
文件,并执行 主服务器给的 写命令,以此来达到和主服务器一致的数据状态。如果不是第一次复制,那么说明从服务器可能是断线,导致和主服务器数据状态不一致,需要同步主服务器的数据。
- 那么从服务器会按照下面的步骤来请求部分同步。
向主服务器发送 PSYNC [主服务器 ID] [复制偏移量](这个是第一次复制时主服务器传过来的),主服务器 ID 时断线前的主服务器。
- 用于定位去同步那个主服务器的,复制偏移量是上一次同步的位置,用于定位具体的同步位置的。
主服务器接收到从服务器的命令后,并找到相应同步的位置后,会给从服务器发送 +CONTINUE 命令。
表示将于从服务器执行部分同步操作,之后主服务器会将保存在复制积压缓冲区对应 复制偏移量之后的所有数据发送给从服务器。
- 但是如果找不到偏移量之后的数据,就会进行完整同步,这样就可以让从服务器达到和主服务器一致的状态。
命令传播:
主从服务器同步成功后,并不会一致保持这个状态,主服务器可能会执行写命令,这也主从数据就不一致了。
为了处理这种问题:
- 主服务器会把自己执行的写命令发送给从服务器,当从服务器执行完这些命令之后,主从服务器的数据就一致了。