Redis主从复制深度解析:核心原理与代码实现全攻略

一、Redis主从复制概述

1.1 什么是主从复制?

Redis主从复制是指将一台Redis服务器(主节点)的数据复制到其他Redis服务器(从节点)的过程。这是Redis实现高可用性、读写分离和负载均衡的基础架构。

1.2 主从复制的核心价值

  • 数据冗余:实现数据的热备份,防止单点故障导致数据丢失
  • 故障恢复:当主节点出现问题时,可以快速切换到从节点
  • 读写分离:主节点负责写操作,从节点分担读操作,提高系统吞吐量
  • 负载均衡:多个从节点可以分担读请求压力

二、主从复制核心原理深度解析

2.1 复制流程三阶段

Redis主从复制过程可以分为三个阶段:

  1. 连接建立阶段:从节点与主节点建立网络连接
  2. 数据同步阶段:主节点将数据同步到从节点
  3. 命令传播阶段:主节点将写命令持续发送给从节点

2.2 全量复制与增量复制

全量复制(Full Resynchronization)

当从节点第一次连接主节点,或者复制偏移量不匹配时触发全量复制:

  1. 主节点执行BGSAVE生成RDB文件
  2. 将RDB文件传输给从节点
  3. 从节点清空旧数据并加载RDB
  4. 主节点将缓冲区中的写命令发送给从节点
增量复制(Partial Resynchronization)

当从节点短暂断开后重连时,只需复制断开期间缺失的数据:

  1. 主节点将写命令存入复制积压缓冲区(repl_backlog)
  2. 从节点重连后发送自己的复制偏移量
  3. 主节点判断偏移量是否在积压缓冲区中
  4. 如果在,则发送缺失部分;否则触发全量复制

2.3 复制ID与偏移量机制

  • 复制ID(Replication ID):标识主节点的数据版本,主节点重启或提升时会改变
  • 复制偏移量(Offset):记录主从节点当前复制的位置,用于判断数据一致性

2.4 心跳检测机制

主从节点间通过心跳包维持连接:

  • PING:主节点默认每10秒向从节点发送PING命令
  • REPLCONF ACK:从节点每秒向主节点发送REPLCONF ACK命令,报告当前复制偏移量

三、主从复制代码级实现

3.1 主节点关键数据结构

// redisServer结构中与复制相关的字段
struct redisServer {
   
    char *replid;               // 主节点当前复制ID
    char *replid2;              // 前一个复制ID(用于故障转移)
    long long master_repl_offset; // 主节点复制偏移量
    client *master;             // 如果是从节点,指向主节点的client
    int repl_backlog_size;      // 复制积压缓冲区大小
    char *repl_backlog;         // 复制积压缓冲区
    long long repl_backlog_histlen; // 积压缓冲区有效长度
    long long repl_backlog_idx;  // 积压缓冲区当前索引
    // ...其他字段
};

3.2 从节点复制状态机

Redis从节点的复制过程通过状态机实现:

// 复制状态定义
#define REPL_STATE_NONE 0           // 无复制
#define REPL_STATE_CONNECT 1        // 正在连接主节点
#define REPL_STATE_CONNECTING 2     // 正在与主节点握手
#define REPL_STATE_RECEIVE_PONG 3   // 等待PONG响应
#define REPL_STATE_SEND_AUTH 4      // 发送AUTH命令
#define REPL_STATE_RECEIVE_AUTH 5

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