面试题: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)命令传播阶段

  • 实时同步写操作
    主节点将每次写操作的命令(如 SETINCR)以 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 分享