面试题:Redis 主从复制的实现原理是什么?

Redis 主从复制的实现原理主要围绕 数据同步机制 和 主从通信流程 展开,其核心目标是实现主节点与从节点之间的数据一致性。以下是详细的实现原理分析:


1. 主从复制的核心流程

主从复制分为三个阶段:建立连接、数据同步、命令传播。

(1)建立连接阶段

  • 保存主节点信息:
    从节点通过 replicaof(旧版 slaveof)命令指定主节点的 IP 和端口,保存主节点信息(masterhost 和 masterport)。
  • 建立 Socket 连接:
    从节点主动与主节点建立 TCP 连接,并发送 PING 命令测试连接是否正常。
  • 身份验证:
    如果主节点设置了密码(requirepass),从节点需通过 AUTH 命令进行身份验证。

(2)数据同步阶段

主从节点首次建立连接后,会进行 全量同步 或 增量同步,具体取决于从节点的状态和主节点的运行 ID(runid)和偏移量(offset)。

① 全量同步(Full Sync)
  • 触发条件:
    • 从节点首次连接主节点。
    • 从节点请求的 offset 超出主节点的复制缓冲区范围。
    • 主节点重启导致 runid 变化。
  • 同步过程:
    1. 从节点发送 PSYNC ? -1:
      表示请求全量同步(? 表示未知主节点 runid,-1 表示未知偏移量)。
    2. 主节点生成 RDB 文件:
      主节点调用 BGSAVE 命令异步生成当前数据的 RDB 快照文件(不阻塞主线程)。
    3. 传输 RDB 文件:
      主节点将 RDB 文件发送给从节点,从节点清空本地数据并加载 RDB 文件。
    4. 同步缓冲区数据:
      在 RDB 文件生成期间,主节点会将所有写操作记录到 复制缓冲区(repl_backlog)。RDB 传输完成后,主节点将缓冲区中的写命令发送给从节点,确保数据一致性。
    5. 从节点确认同步完成:
      从节点发送 REPLCONF ACK 消息确认同步完成。
② 增量同步(Partial Resync)
  • 触发条件:
    从节点断线后重新连接,且断线期间的数据变更在主节点的复制缓冲区内。
  • 同步过程:
    1. 从节点发送 PSYNC <runid> <offset>:
      使用主节点的 runid 和当前偏移量请求增量同步。
    2. 主节点检查缓冲区:
      如果从节点的 offset 在复制缓冲区范围内,主节点将缓冲区中缺失的写命令发送给从节点。
    3. 从节点执行增量命令:
      从节点直接执行接收到的写命令,无需重新加载 RDB 文件。

(3)命令传播阶段

  • 实时同步写操作:
    主节点将每次写操作的命令(如 SET、INCR)以 Redis 协议格式 发送给所有从节点。
  • 异步复制:
    主从节点之间的数据同步是异步的,主节点不会等待从节点确认,因此可能存在短暂的数据延迟。

2. 关键技术细节

(1)PSYNC 命令

  • 作用:
    Redis 2.8 引入的 PSYNC 命令替代了旧版的 SYNC,支持 全量同步 和 增量同步。
  • 语法:
    PSYNC <runid> <offset>
    • runid:主节点的唯一标识(每次重启会变化)。
    • offset:从节点的复制偏移量(表示已接收的字节数)。

(2)复制缓冲区(Repl Backlog)

  • 作用:
    主节点维护一个固定大小的环形缓冲区(默认 1MB),用于存储最近的写命令。
  • 作用场景:
    当从节点断线后重新连接时,主节点通过缓冲区提供增量数据,避免全量同步。

(3)偏移量(Offset)

  • 主节点偏移量:
    记录主节点已发送的字节数(每发送一条命令,偏移量递增)。
  • 从节点偏移量:
    记录从节点已接收的字节数,用于判断是否需要增量同步。

(4)运行 ID(RunID)

  • 作用:
    每个 Redis 实例启动时生成唯一的 runid,用于标识主节点身份。
  • 场景:
    如果从节点请求的 runid 与主节点当前 runid 不匹配,则触发全量同步。

3. 主从复制的拓扑结构

  • 一主多从:
    一个主节点可以有多个从节点,适用于读写分离场景。
  • 链式复制(级联复制):
    从节点可以作为其他从节点的主节点,减轻主节点压力(如 A → B → C)。
  • 反客为主(Promote to Master):
    当主节点宕机后,从节点可通过 SLAVEOF NO ONE 升级为主节点(需配合哨兵或集群模式使用)。

4. 主从复制的优势与局限性

优势

  1. 读写分离:
    主节点负责写操作,从节点负责读操作,提升系统吞吐量。
  2. 高可用性:
    主节点宕机后,从节点可接管服务(需配合哨兵或集群模式)。
  3. 数据备份:
    从节点可作为主节点的热备份,防止数据丢失。

局限性

  1. 异步复制:
    主从节点间存在数据延迟,可能导致短暂不一致。
  2. 全量同步开销:
    首次同步或断线后全量同步时,主节点生成 RDB 文件会占用内存和网络带宽。
  3. 单点故障:
    主节点宕机后,需手动切换或依赖哨兵自动处理。

5. 示例代码

配置从节点

# 修改配置文件(持久化)
replicaof 192.168.1.100 6379

# 动态配置(无需重启)
redis-cli -h 192.168.1.101 -p 6380 replicaof 192.168.1.100 6379

验证主从状态

# 在从节点执行
redis-cli -h 192.168.1.101 -p 6380 info replication

总结

Redis 主从复制的核心是通过 全量同步 + 增量同步 保证数据一致性,结合 PSYNC 命令 和 复制缓冲区 实现高效的数据传播。其设计兼顾性能与可靠性,是 Redis 高可用架构(如哨兵、集群)的基础。理解其原理有助于优化主从部署和排查同步问题。

THE END
喜欢就支持一下吧
点赞12 分享