# 31. Redis 的复制机制在高可用性中的作用是什么?

# 标准答案

Redis 通过 主从复制(Replication) 机制实现高可用性,它允许多个从节点(Slave)复制主节点(Master)的数据,以提高系统的 可用性、读扩展能力和数据安全性。当主节点故障时,Redis 还可以借助 哨兵(Sentinel)或集群模式(Cluster) 实现自动主从切换,确保 Redis 服务持续运行。

Redis 复制机制主要用于:

  1. 数据冗余:从节点复制主节点数据,防止单点故障丢失数据。
  2. 读负载均衡:客户端可以从从节点读取数据,减少主节点压力。
  3. 故障转移:主节点宕机后,哨兵或集群可自动选举新的主节点,维持服务可用性。

# 答案解析

# 1️⃣ Redis 复制机制的工作原理

Redis 采用 异步复制,即主节点负责处理写请求,并将数据同步给从节点,而从节点仅用于读取,避免影响主节点的性能。

复制过程主要包含:

  • 全量复制(Full Synchronization)
  • 增量复制(Partial Synchronization)
  • 断线重连后的数据补偿

# 🔹(1)全量复制(Full Resynchronization)

当从节点首次连接主节点时,Redis 进行全量复制:

  1. 从节点发送 PSYNC 请求,如果是第一次复制,则请求 PSYNC ? -1
  2. 主节点执行 BGSAVE,生成 RDB 快照文件并发送给从节点。
  3. 从节点加载 RDB 文件,将数据恢复到内存中。
  4. **主节点将 在 RDB 生成期间 的写操作缓存在 repl_backlog_buffer 中,并在 RDB 传输完成后 增量同步 到从节点。
  5. 复制完成,从节点进入同步状态,监听主节点的更新。

示意图

sequenceDiagram
    participant Slave as 从节点
    participant Master as 主节点
    Slave->>Master: PSYNC ? -1 (请求全量复制)
    Master-->>Slave: 生成 RDB 快照并传输
    Master-->>Slave: 发送缓冲区的增量数据
    Slave->>Master: 确认同步完成
1
2
3
4
5
6
7

🔹 缺点

  • RDB 快照生成过程会消耗 CPU 和内存(fork 进程拷贝)。
  • 主从数据量大时,传输 RDB 会占用网络带宽,影响业务。

# 🔹(2)增量复制(Partial Synchronization)

如果从节点因短暂网络波动断连,但 主节点仍保留了复制积压缓冲区(Replication Backlog),那么:

  1. 从节点重新连接后,发送 PSYNC <replid> <offset>,请求增量数据。
  2. 主节点根据 offset 计算增量数据,发送给从节点补偿丢失的操作日志。
  3. 如果 offset 超出 repl_backlog_buffer 保存范围,则进行全量复制

🔹 优势

  • 避免全量复制的开销,减少 CPU、网络消耗,提高高可用性。

# 🔹(3)主从复制的断线重连机制

Redis 通过 复制积压缓冲区(Replication Backlog Buffer) 解决短暂断连问题:

  • repl_backlog_size 设定缓冲区大小,默认 1MB,存储主节点最近的操作。
  • 从节点重连时,如果 offset 在缓冲区范围内,则进行增量复制,否则进行全量复制。
# 配置主节点保留 10MB 的复制积压缓冲区,减少全量复制
repl-backlog-size 10mb
1
2

# 2️⃣ Redis 复制在高可用性中的作用

# 🔹(1)数据冗余

  • 主从复制可实现数据备份,防止数据丢失。
  • 多个从节点可以分布在不同机房,提高容灾能力

# 🔹(2)读负载均衡

  • 主节点处理写请求,从节点分担读请求,提高性能。
  • 客户端可通过 readonly 连接从节点,降低主节点压力

示例:

# 让从节点只读,防止误写
slave-read-only yes
1
2

# 🔹(3)主从切换(故障转移)

如果主节点宕机,Redis 可通过以下方式切换主从:

  1. 手动切换:运维手动将某个从节点提升为主节点。
  2. 自动切换(哨兵模式)
    • Redis 哨兵(Sentinel) 监控主节点状态,主节点宕机后,选举新的主节点。
    • 剩余从节点重新复制新的主节点。
graph TD
    主节点(主节点 Master) -->|复制数据| 从节点1(Slave 1)
    主节点 -->|复制数据| 从节点2(Slave 2)
    哨兵(哨兵 Sentinel) -->|监控主节点| 主节点
    哨兵 -->|选举新主节点| 从节点1
1
2
3
4
5

# 🔹(4)Redis Cluster(集群模式)中的作用

  • Redis Cluster 模式下,每个分片都有多个从节点:
    • 主从复制保证数据冗余,防止单点故障。
    • 当某个主节点宕机时,从节点自动提升为主节点,集群继续运行。

示例:

# 启用集群复制
cluster-enabled yes
1
2

# 3️⃣ Redis 复制机制的缺点

尽管 Redis 复制机制提升了高可用性,但仍存在一些问题:

  1. 数据一致性问题(最终一致性):

    • 异步复制 可能导致从节点数据滞后,发生脑裂风险。
    • 故障切换时,部分数据可能丢失(如果主节点未同步到从节点)。
  2. 主从同步的网络消耗大

    • 全量复制时,会消耗带宽,影响业务
    • 多个从节点同时同步,主节点压力大
  3. 复制延迟

    • 从节点的更新速度受网络和 CPU 影响,可能滞后于主节点。

# 深入追问

🔹 Redis 复制机制如何解决数据丢失问题?
🔹 为什么 Redis 采用异步复制,而不是同步复制?
🔹 Redis 如何防止脑裂?(哨兵 + 选举机制)
🔹 Redis Cluster 下,如何保证数据的高可用性?

# 相关面试题

🔹 Redis 复制积压缓冲区(Replication Backlog)的作用是什么?
🔹 Redis 复制和 MySQL 复制有哪些区别?
🔹 主从复制和 Redis Cluster 有什么不同?

# 总结

  • Redis 复制机制 采用 主从架构,通过 全量复制 + 增量复制 保持数据同步,提高 数据冗余、读扩展能力和高可用性。
  • 主从复制能提高读性能,但不能自动故障恢复,需要配合 哨兵模式或 Redis Cluster 才能实现高可用。
  • 复制采用异步机制,存在一定延迟,需合理配置 复制缓冲区,减少数据丢失风险。