redis主从复制详细原理

资料整理来自112节Redis入门到精通【黑马程序员】,添加了一些补充笔记,方便巩固。
源视频地址

redis主从复制分为三个阶段
1.建立连接阶段
2.数据同步阶段
3.命令传播阶段(实时进行数据同步)

①中的目的是让当前主机成为某台服务器的从机,ip,port为主机的ip及端口。

redis主从复制详细原理

①是为了找主机索要数据
数据缓存区在连接时就建立,来自主机客户端的每个指令都会经过数据缓存区
②为主机执行RDB快照,此时数据缓存区数据仍会有变化
⑦数据缓存区存的为指令

redis主从复制详细原理

命令传播阶段其实是实时保持数据同步的作用,因此会涉及到全量复制和部分复制

redis主从复制详细原理

redis主从复制详细原理
redis主从复制详细原理

redis主从复制详细原理
redis主从复制详细原理

①第一次连接后找主机索要数据psync2指令,由于此时还不知道主机的id和偏移量
②主机执行快照并记录当前偏移量,即已发送给从机的数据的位置(数量),假设为10.
③同时回复从机,在消息中附带上自己的runid和offset(10),在此期间,依然从主机的客户端接收新的指令,这个时候offset会发生变化(增加)。
④从机保存主机的runid和offset(10)
⑤从机回复主机rdb恢复已完成,再次索要数据,此时发送的为自己的runid(蓝色)runid和当前已经接收到的数据的位置(10),在第③步中已知。
⑥判断是否同一台从机以及offset(10)是否还在缓冲区内。
如果有一个不满足,都进行全量复制
关于offset是否还在缓冲区内的意思是:
假设缓冲区大小为20
1.而在执行rbd这个过程中时间过长,offset增长的速度过大,超过了缓冲区的大小,假设已从10增加到50.
即当前缓冲区的数据为30~50,而此时从机发来的offset还为10,即中间丢失数据过多,无法直接从缓冲区恢复,因为缓冲区为队列结构,FIFO,后来的指令将前面的指令挤出了缓冲区,丢失。
则只能重新执行全量复制。
2.若执行rbd这个过程中,主机没有接收到新的指令,offset仍为10,即此时从机经过全量复制已和主机同步,不需要再次发送数据。
3.在执行rbd这个过程中offset增长,但是仍在缓冲区的大小,假设已从10增加到20,
即当前缓冲区的数据为0~20,从机发来的offset还为10,即主机此时只需要发送10 ~20内的数据,而这些数据仍在缓冲区内保存,发送即可。

下图描绘了这个过程:

redis主从复制详细原理
redis主从复制详细原理
redis主从复制详细原理
redis主从复制详细原理
redis主从复制详细原理
redis主从复制详细原理
redis主从复制详细原理
redis主从复制详细原理
redis主从复制详细原理