Redis 主从复制

Redis 主从复制(Master-Slave Replication)详解

1. 什么是 Redis 主从复制?

Redis 主从复制(Replication) 是一种数据同步机制,允许 从节点(Slave) 复制 主节点(Master) 的数据,以提高系统的可用性、负载均衡能力,并支持高可用架构(如 Sentinel、Cluster)。

1.1 主从复制的核心作用

  • 数据冗余:从节点保存主节点的数据,防止数据丢失。
  • 负载均衡:读请求可以分摊到多个从节点,提高并发能力。
  • 故障恢复:主节点故障时,可快速切换到从节点(结合 Redis Sentinel)。
  • 高可用架构:作为 Redis 集群(Redis Cluster)的基础组件。

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

Redis 的主从复制流程主要包括:

  1. 从节点发送同步请求PSYNC 命令)
  2. 主节点创建 RDB 快照 并发送给从节点(全量同步)
  3. 主节点发送命令流(增量同步)
  4. 从节点应用数据,最终达到一致性

2.1 全量同步(Full Synchronization)

当从节点连接到主节点时,会进行 全量同步

  • Step 1:从节点发送 PSYNC 请求主节点同步数据。
  • Step 2:如果是新加入的从节点,主节点创建 RDB 快照(BGSAVE)。
  • Step 3:主节点将 RDB 快照发送给从节点。
  • Step 4:从节点加载 RDB 文件,并接收主节点发送的写入命令。

2.2 增量同步(Incremental Synchronization)

当从节点与主节点同步后,主节点会继续将后续的写操作同步到从节点,以保持数据一致。

  • Step 1:主节点会维护一个 复制积压缓冲区(Replication Backlog Buffer),存储最近的写入操作。
  • Step 2:如果主从连接断开并重连,只要缓冲区中的数据还未丢失,从节点可以继续增量同步,避免重新全量同步。

2.3 断线重连

  • 如果断开时间短(缓冲区仍然保留),可以使用 增量同步(仅同步最近丢失的数据)。
  • 如果断开时间长(缓冲区数据丢失),则需要重新进行 全量同步

3. Redis 主从复制的配置

3.1 配置主节点

主节点默认无需特殊配置,直接启动即可:

1
redis-server /etc/redis/redis.conf

3.2 配置从节点

redis.conf 配置文件中,添加:

1
replicaof <master-ip> <master-port>

或在 Redis CLI 运行:

1
SLAVEOF <master-ip> <master-port>

例如:

1
SLAVEOF 192.168.1.100 6379

从节点会连接到 192.168.1.100:6379 并开始同步数据。


4. Redis 主从复制的数据流

4.1 查看主从信息

主节点 查看:

1
INFO replication

示例输出:

1
2
3
4
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.101,port=6379,state=online,offset=1000,lag=0

从节点 查看:

1
INFO replication

示例输出:

1
2
3
4
5
# Replication
role:slave
master_host:192.168.1.100
master_port:6379
master_link_status:up

4.2 主从同步过程

(1)写入数据

在主节点写入:

1
SET key1 "Hello, Redis!"

然后在从节点读取:

1
GET key1

返回:

1
"Hello, Redis!"

说明数据已同步到从节点。

(2)断开主从

1
SLAVEOF NO ONE

从节点会变为独立节点,不再同步主节点的数据。

(3)恢复主从关系

1
SLAVEOF 192.168.1.100 6379

从节点会重新同步主节点的数据。


5. Redis 复制模式

Redis 支持两种复制模式:

5.1 异步复制(默认)

  • 默认情况下,Redis 采用异步复制
  • 主节点会将写入操作发送给从节点,但不会等待从节点完成复制。
  • 优点:性能高,主节点可以继续处理其他请求。
  • 缺点:如果主节点故障,部分数据可能尚未同步到从节点,可能会丢失。

5.2 半同步复制

  • Redis 5.0 及以上,提供了 replica-serve-stale-datareplica-read-only 选项:
    • replica-serve-stale-data no:从节点在复制未完成时不提供服务。
    • replica-read-only yes:从节点仅允许读操作,不允许写操作。

6. Redis 主从复制的应用

6.1 读写分离

  • 主节点(Master)处理写请求
  • 从节点(Slave)处理读请求,减少主节点的负载。
  • 结合 负载均衡(Nginx、LVS)客户端路由(如 Redis 读写分离方案)提高性能。

6.2 备份与高可用

  • 使用 从节点进行数据备份,避免主节点数据丢失。
  • 配合 Redis Sentinel 实现自动故障转移(主节点宕机时,从节点自动提升为主节点)。

7. Redis 主从复制的缺点

7.1 数据一致性问题

由于 Redis 默认是异步复制,可能导致:

  • 主节点写入数据后崩溃,而数据尚未同步到从节点,导致数据丢失。
  • 解决方案:使用 WAIT 命令,确保数据至少写入一定数量的从节点:
    1
    WAIT 1 1000
    • 1:等待至少 1 个从节点确认。
    • 1000:等待 1000ms 超时。

7.2 复制延迟

  • 网络负载或主节点压力过大时,从节点可能会 滞后主节点数据
  • 解决方案:监控 replication offset 差值,确保复制延迟在可接受范围内。

7.3 主节点压力

  • 所有从节点都会向主节点请求数据,导致主节点负载高。
  • 解决方案:采用 链式复制Redis Cluster)减少主节点负载。

8. Redis 主从复制 vs. Redis Cluster

方案 主从复制 Redis Cluster
数据分片 ❌ 无数据分片 ✅ 支持数据分片
高可用 ✅ 结合 Sentinel 实现 ✅ 内置高可用
复制方式 Master-Slave 多主多从
扩展性 中等,不能水平扩展 良好,支持数据分片

总结

  • Redis 主从复制 用于 数据冗余、读写分离、提高可用性
  • 复制流程:从节点连接主节点 → 主节点快照(RDB) → 发送命令流(增量同步)。
  • 两种复制模式
    • 异步复制(默认):高性能,但可能丢数据。
    • 半同步复制:确保数据一致性,适用于高可靠场景。
  • 结合 Redis Sentinel 或 Redis Cluster 以提高高可用性和扩展性

Redis 主从复制是 分布式 Redis 架构的基础,常与 Sentinel(高可用)和 Cluster(分片) 结合使用!