Redis主从复制原理?


取消

1个回答

匿名

在Redis集群中,让若干个Redis服务器去复制另一个Redis服务器,我们定义被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),这种叫做主从复制,其中包括有全量复制和部分复制两种模式。


全量复制场景

用于初次复制或其它无法进行部分复制的情况,将主节点中的所有数据都发送给从节点,是一个非常重型的操作,当数据量较大时,会对主从节点和网络造成很大的开销。



全量复制过程
1. Redis内部会发出一个同步命令,刚开始是Psync命令,表示要求master主机同步数据。
2. 主机会向从机发送run_id和offset,因为slave并没有对应的 offset,所以是全量复制。
3. 从机slave会保存主机master的基本信息。
4. 主节点收到全量复制的命令后,执行bgsave,在后台生成RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
5. 主机发送RDB文件给从机。
6. 发送缓冲区数据。
7. 刷新旧的数据,从节点在载入主节点的数据之前要先将老数据清除。
8. 加载RDB文件将数据库状态更新至主节点执行bgsave时的数据库状态和缓冲区数据的加载。



部分复制场景
部分复制是Redis 2.8以后出现的,用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。
因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销,需要注意的是,如果网络中断时间过长,造成主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制。



部分复制过程
1. 出现网络抖动场景(连接断开 connection lost)。
2. 主机master 还是会写 repl_back_buffer(复制缓冲区)。
3. 从机slave 会继续尝试连接主机。
4. 从机slave 会把自己当前 run_id 和偏移量传输给主机 master,并且执行 pysnc 命令同步。
5. 如果master发现你的偏移量是在缓冲区的范围内,就会返回 continue命令。
6. 同步了offset的部分数据,所以部分复制的基础就是偏移量 offset。

  • 1 关注
  • 0 收藏,12346 浏览
  • 提出于 2020-06-29 15:37:46

相似问题