Redis 主从复制详解
1. 什么是 Redis 主从复制?
Redis 主从复制(Master-Slave Replication) 允许多个 Redis 服务器之间同步数据,使得 一个主节点(Master) 的数据能够复制到 多个从节点(Slave)。
主从复制的主要功能:
- 读写分离:主节点 负责写操作,从节点 负责读操作,提高 Redis 的性能和可扩展性。
- 高可用性:从节点可以作为主节点的备份,提高数据安全性。
- 故障转移:在主节点故障时,可以手动或自动将从节点提升为主节点,确保服务可用。
2. Redis 主从复制的工作原理
Redis 主从复制流程如下:
- 从节点启动后,发送
PSYNC
或SYNC
命令给主节点,请求同步数据。 - 主节点执行 RDB 快照,并将快照发送给从节点(全量同步)。
- 快照传输完成后,主节点将后续写操作的命令发送给从节点,保持数据同步(增量同步)。
- 从节点持续监听主节点的变化,不断接收新的数据更新。
3. Redis 主从复制的同步机制
(1)全量同步(Full Resynchronization)
适用场景:
- 从节点第一次连接到主节点,需要同步所有数据。
- 主节点重启或从节点数据丢失,导致复制断裂,必须进行全量同步。
过程:
- 从节点发送
PSYNC
或SYNC
命令请求全量同步。 - 主节点执行
bgsave
生成 RDB 快照,并将快照文件 发送给从节点。 - 传输完成后,从节点加载 RDB 文件,并清空现有数据,写入新数据。
- 期间主节点的写操作命令被存入 复制缓冲区(Replication Buffer),同步完成后,主节点继续发送这些命令,进行增量同步。
缺点:
- 传输的数据量大,影响主节点性能。
- 复制期间阻塞主节点,导致短时间内无法响应其他请求。
(2)增量同步(Partial Resynchronization)
适用场景:
- 从节点和主节点短暂断开连接后 重新连接(如网络抖动)。
- 主从连接恢复,能够基于 复制积压缓冲区(Replication Backlog) 继续同步 丢失的数据,避免全量同步。
过程:
- 主节点维护一个
replication backlog buffer
(复制积压缓冲区),记录最近的写操作(默认 1MB)。 - 从节点断开后,重新发送
PSYNC
命令,请求恢复同步。 - 如果复制缓冲区仍然包含丢失的数据,主节点只需发送 缺失的数据,减少传输量。
- 如果缓冲区已被覆盖(数据过期),仍然需要执行 全量同步。
优点:
- 减少数据传输,降低网络负担。
- 加快同步速度,避免全量同步带来的高开销。
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 以避免单点故障,提高可用性! 🚀