标签 Redis 下的文章

说说主从数据同步的方式?

Redis在2.8及以上版本使用psync命令完成主从数据同步,同步过程分为:全量复制和部分复制。

redis-7518f715-6dee-4e70-b972-8aed9879e451.png

全量复制通常用于初始复制的场景。在早期的Redis版本中,只支持全量复制,它会将主节点的所有数据一次性发送给从节点。然而,当数据量较大时,这会对主从节点和网络造成很大的开销。

全量复制的完整运行流程如下:

  1. 从节点发送psync命令进行数据同步。由于是第一次复制,从节点没有复制偏移量和主节点的运行ID,因此发送psync-1
  2. 主节点根据psync-1解析出当前为全量复制,并回复+FULLRESYNC响应。
  3. 从节点接收主节点的响应数据,并保存运行ID和偏移量offset。
  4. 主节点执行bgsave命令将数据保存到RDB文件中。
  5. 主节点将RDB文件发送给从节点,从节点接收并保存该文件作为自身的数据文件。
  6. 在从节点接收RDB快照期间,主节点仍然响应读写命令,并将这段时间内的写命令数据保存在复制客户端缓冲区中。当从节点加载完RDB文件后,主节点再将缓冲区内的数据发送给从节点,以确保主从数据的一致性。
  7. 从节点接收主节点传输的所有数据后,清空自身的旧数据。
  8. 从节点加载完RDB后,如果开启了AOF持久化功能,会立即执行bgrewriteaof操作,以确保全量复制后AOF持久化文件立即可用。

部分复制是Redis针对全量复制开销较高的情况进行的优化措施,使用psync {runId} {offset}命令实现。当从节点正在复制主节点时,若出现网络中断或命令丢失等异常情况,从节点会向主节点请求补发丢失的命令数据。如果主节点的复制积压缓冲区中存在这些数据,主节点会直接发送给从节点,从而保持主从数据的一致性。

具体的部分复制流程如下:

  1. 当主从节点之间的网络中断超过repl-timeout时间后,主节点会认为从节点发生故障并中断复制连接。
  2. 在主从连接中断期间,主节点仍然响应命令,但由于复制连接中断,命令无法发送给从节点。然而,主节点内部存在复制积压缓冲区,仍然可以保存最近一段时间的写命令数据,默认最大缓存大小为1MB。
  3. 当主从节点的网络恢复后,从节点会重新连接主节点。
  4. 主从连接恢复后,从节点会发送之前保存的复制偏移量和

主节点的运行ID作为psync命令的参数,请求进行部分复制操作。

  1. 主节点接收到psync命令后,首先核对参数中的运行ID是否与自身一致。如果一致,表示之前进行复制的是当前的主节点。然后,主节点根据偏移量在复制积压缓冲区中查找数据。如果偏移量之后的数据存在于缓冲区中,主节点会向从节点发送+CONTINUE响应,表示可以进行部分复制。
  2. 主节点根据偏移量将复制积压缓冲区中的数据发送给从节点,确保主从复制进入正常状态,保持数据的一致性。

主从复制了解吗?主从复制是指将一个 Redis 服务器的数据复制到其他 Redis 服务器,其中原始服务器被称为主节点(master),而复制它的服务器被称为从节点(slave)。数据的复制是单向的,只能由主节点向从节点进行复制。主从复制支持主从同步和从从同步两种模式,后者是 Redis 的后续版本中新增的功能,用于减轻主节点的同步负担。

- 阅读剩余部分 -