redis主从复制详细原理

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

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

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

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

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

①第一次连接后找主机索要数据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内的数据,而这些数据仍在缓冲区内保存,发送即可。

下图描绘了这个过程:

经验分享 程序员 微信小程序 职场和发展