Redis 主从复制详解

Redis 主从复制详解

1. 什么是 Redis 主从复制?

Redis 主从复制(Master-Slave Replication) 允许多个 Redis 服务器之间同步数据,使得 一个主节点(Master) 的数据能够复制到 多个从节点(Slave)

主从复制的主要功能:

  • 读写分离:主节点 负责写操作,从节点 负责读操作,提高 Redis 的性能和可扩展性。
  • 高可用性:从节点可以作为主节点的备份,提高数据安全性。
  • 故障转移:在主节点故障时,可以手动或自动将从节点提升为主节点,确保服务可用。

2. Redis 主从复制的工作原理

Redis 主从复制流程如下:

  1. 从节点启动后,发送 PSYNCSYNC 命令给主节点,请求同步数据。
  2. 主节点执行 RDB 快照,并将快照发送给从节点(全量同步)。
  3. 快照传输完成后,主节点将后续写操作的命令发送给从节点,保持数据同步(增量同步)。
  4. 从节点持续监听主节点的变化,不断接收新的数据更新。

3. Redis 主从复制的同步机制

(1)全量同步(Full Resynchronization)

适用场景

  • 从节点第一次连接到主节点,需要同步所有数据。
  • 主节点重启或从节点数据丢失,导致复制断裂,必须进行全量同步。

过程

  1. 从节点发送 PSYNCSYNC 命令请求全量同步。
  2. 主节点执行 bgsave 生成 RDB 快照,并将快照文件 发送给从节点
  3. 传输完成后,从节点加载 RDB 文件,并清空现有数据,写入新数据。
  4. 期间主节点的写操作命令被存入 复制缓冲区(Replication Buffer),同步完成后,主节点继续发送这些命令,进行增量同步。

缺点

  • 传输的数据量大,影响主节点性能。
  • 复制期间阻塞主节点,导致短时间内无法响应其他请求。

(2)增量同步(Partial Resynchronization)

适用场景

  • 从节点和主节点短暂断开连接后 重新连接(如网络抖动)。
  • 主从连接恢复,能够基于 复制积压缓冲区(Replication Backlog) 继续同步 丢失的数据,避免全量同步。

过程

  1. 主节点维护一个 replication backlog buffer(复制积压缓冲区),记录最近的写操作(默认 1MB)。
  2. 从节点断开后,重新发送 PSYNC 命令,请求恢复同步。
  3. 如果复制缓冲区仍然包含丢失的数据,主节点只需发送 缺失的数据,减少传输量。
  4. 如果缓冲区已被覆盖(数据过期),仍然需要执行 全量同步

优点

  • 减少数据传输,降低网络负担。
  • 加快同步速度,避免全量同步带来的高开销。

4. Redis 复制的触发机制

(1)手动配置

可以手动配置从节点连接到主节点:

# 在从节点执行
redis-cli
> SLAVEOF 192.168.1.100 6379
  • 让当前 Redis 服务器成为 192.168.1.100:6379 的从节点。

如果想要让从节点重新变为主节点:

> SLAVEOF NO ONE

(2)配置文件方式

redis.conf 中配置:

# 指定主节点 IP 和端口
replicaof 192.168.1.100 6379
  • 该配置使 Redis 在启动时自动成为 192.168.1.100:6379 的从节点。

5. Redis 复制的数据一致性问题

由于 Redis 主从复制是异步的,所以可能会出现数据一致性问题。

(1)延迟复制

  • 从节点会有 一定的复制延迟,主节点写入的数据可能未及时同步到从节点。
  • 解决方案:
    • 强制等待从节点确认WAIT 命令,等待多个从节点同步完成后再返回。
    • 使用 Redis Sentinel:通过 min-slaves-to-write 限制最少可用的从节点。

(2)脑裂问题

  • 主节点和从节点之间 网络分区 时,原主节点可能误以为自己仍是主节点,而新主节点已被选举出来,导致 两个主节点同时写入数据,发生数据冲突。
  • 解决方案:
    • Redis Sentinel 自动切换,当旧主节点恢复时,自动将其降级为从节点。
    • 使用 min-slaves-to-write 限制主节点写入,确保至少 N 个从节点在线才能执行写操作。

6. Redis 主从复制的高级优化

(1)读写分离

  • 主节点 只负责 写入 操作,从节点只负责 读取,提高性能。
  • 应用程序可以采用负载均衡(如 Nginx、LVS) 将读请求分发到多个从节点,减轻主节点压力。

(2)异步复制 vs 半同步复制

  • 默认异步复制:主节点不会等待从节点确认,写入后立即返回,性能高但存在数据丢失风险
  • WAIT 命令(半同步):可强制主节点等待一定数量的从节点复制完成,提高数据可靠性:
    WAIT 2 1000  # 等待至少 2 个从节点同步数据,最多等待 1000ms
    

(3)批量复制

  • Redis 6.0 之后,从节点 支持并行加载 RDB 文件,加速全量同步过程,避免阻塞。

7. Redis 主从复制架构

Redis 主从复制可扩展为多种架构:

(1)一主多从

         Master (写)
           |
    -----------------
    |       |       |
Slave1   Slave2   Slave3  (读)
  • 优点:支持读写分离,提高读性能。
  • 缺点:主节点单点故障会影响所有从节点。

(2)链式复制

Master → Slave1 → Slave2 → Slave3
  • 优点:减少主节点的负担,降低主节点的复制压力。
  • 缺点:同步延迟增加,从节点之间依赖性更强。

(3)哨兵模式(Sentinel)

Redis Sentinel 提供 自动主从切换,防止主节点故障影响系统:

      Sentinel
        / | \
       /  |  \
 Master   Slave1  Slave2
  • 优势:支持自动故障恢复,提高高可用性。

8. 总结

特性说明
同步方式默认异步,可使用 WAIT 命令进行半同步
全量同步主节点 bgsave 生成 RDB,发送给从节点
增量同步通过复制积压缓冲区 replication backlog 记录数据变更
读写分离主节点写入,从节点读取,提高性能
高可用结合 Redis Sentinel 实现自动故障转移
数据一致性问题复制延迟、脑裂等,需通过 WAIT 及 Sentinel 解决

Redis 主从复制 是构建高可用、高性能 Redis 集群的基础,但需要结合 Sentinel 或 Redis Cluster 以避免单点故障,提高可用性! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值