了解Redis主从复制

Redis的主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者成为主节点(master);数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台 Redis服务器都是主节点;且一个主节点可以有多个从节点(或者没有从节点),但是一个从节点只能由一个主节点。

主从复制过程大致可以分为3个阶段:连接建立(准备阶段)、数据同步、命令传播。

建立连接阶段:

  • 保存主节点信息
  • 建立socket连接
  • 发送ping命令
  • 身份验证
  • 发送从节点端口信息

数据同步阶段

主从复制核心的阶段,根据主从节点的状态不同,可分为全量复制和部分复制。

具体如图所示:
了解Redis主从复制_第1张图片
复制偏移量是指执行复制的双方,主从节点分别会维护一个复制偏移量offset。

复制积压缓冲区是指主节点内部维护了一个固定长度的、先进先出(FIFO)队列作为复制积压缓冲区。当主从节点offset的差距过大超过缓冲区长度是,将无法执行部分复制,只能执行全量复制。

服务器运行ID(runid),每个节点都有其运行ID,由节点在启动时自动生成,主节点会将自己的运行ID发送给从节点,从节点会将主节点的 运行ID存起来,从节点Redis断开重连的时候就会根据运行ID来判断同步的进度。

  • 如果从节点保存的runid与主节点现在的runid相同,说明主从节点之前通不过,主节点会继续尝试使用部分复制(是否能部分复制),要看offset和复制积压缓冲区的情况。
  • 如果从节点保存的runid与主节点现在的runid不同,说明从节点在断线钱同步的Redis主节点并不是当前的主节点,只能进行全量复制。
全量复制的缺点
  1. 主节点通过bgsave命令fork子进程进行RDB持久化,该过程非常消耗CPU、内存(页表复制)、硬盘(IO)的。
  2. 主节点通过网络将RDB文件发送给从节点,对从节点的带宽都会带来很大的消耗。
  3. 从节点清空老数据,载入新的RDB文件的过程是阻塞的,无法响应客户端的命令,如果从节点执行bgrewriteaof,也会带来额外的消耗。

命令传播阶段

数据同步阶段完成后,主从节点进入命令传播阶段;在这个阶段主节点将自己执行的写命令发送给从节点,从节点接收命令并执行,从而保证主从节点数据的一致性。

在命令传播阶段,除了发送写命令,主从节点还维持着心跳机制:PING和REPLCONF ACK。由于心跳机制的原理涉及部分复制,因此将在介绍了部分复制的相关内容后单独介绍该心跳机制。

命令传播是异步的过程,即主节点发送写命令后并不会等待从节点的回复;因此实际上主从节点之间很难保持实时的一致性,延迟在所难免。数据不一致的程度,与主从节点之间的网络状况、主节点写命令的执行频率、以及主节点中的repl-disable-tcp-nodelay配置等有关。

你可能感兴趣的:(redis,数据库,java)