Redis通过主从异步复制实现数据冗余与读写分离,支持级联及PSYNC增量同步,优化配置保障高可用性。
一、Redis 复制的基本概念
复制(Replication) 是 Redis 实现高可用和负载均衡的核心机制,通过将主节点(Master)的数据同步到从节点(Replica),实现数据冗余和读写分离。
核心特性
- 异步复制:主节点异步推送数据变更到从节点。
- 级联复制:从节点可再作为其他节点的主节点(Redis 4.0+)。
- 只读模式:从节点默认禁止写入(通过
replica-read-only yes配置)。
二、复制的使用方式
1. 建立复制
-
命令方式:
# 在从节点执行(Redis 5.0 前使用 SLAVEOF) REPLICAOF <master-ip> <master-port> -
配置文件方式:
# 从节点的 redis.conf replicaof 192.168.1.100 6379
2. 断开复制
-
临时断开:
REPLICAOF NO ONE # 从节点断开复制,并升级为主节点 -
永久断开:删除配置文件中的
replicaof项并重启。
3. 安全性
-
主节点认证:
# 主节点配置密码 requirepass master_password # 从节点配置密码认证 masterauth master_password
4. 只读模式
-
从节点默认禁止写操作(
replica-read-only yes),可通过以下方式修改:CONFIG SET replica-read-only no # 允许写入(不推荐,可能引发数据不一致)
三、复制的拓扑结构
| 拓扑类型 | 结构说明 | 适用场景 |
|---|---|---|
| 单层结构 | 一主多从,所有从节点直接连接主节点 | 简单读写分离、数据备份 |
| 树状结构 | 主 → 从1 → 从2(级联复制) | 减少主节点压力,跨机房同步 |
| 双主结构 | 两个节点互为主从(需特殊配置) | 双活数据中心(需谨慎处理数据冲突) |
| 环形复制 | 多个节点形成环形复制链(Redis 不推荐) | 实验性场景(易导致数据不一致) |
四、复制的核心原理
1. 复制建立流程
-
连接建立:
- 从节点向主节点发送
REPLCONF listening-port <port>告知监听端口。 - 主节点验证权限(若配置了
requirepass)。
- 从节点向主节点发送
-
数据同步:
- 主节点执行
BGSAVE生成 RDB 快照,发送给从节点(全量复制)。 - 从节点清空旧数据,加载 RDB 文件。
- 主节点执行
-
增量同步:
- 主节点将后续写命令存入 复制缓冲区(Repl Backlog Buffer) 。
- 从节点持续接收并执行缓冲区中的命令(部分复制)。
2. 全量复制
-
触发条件:
- 从节点首次连接主节点。
- 主从复制积压缓冲区(Repl Backlog Buffer)不足(从节点偏移量超出缓冲区范围)。
-
流程:
- 主节点 fork 子进程生成 RDB 文件。
- RDB 文件通过网络传输到从节点。
- 从节点加载 RDB 后,主节点发送缓冲区中的增量命令。
3. 部分复制(PSYNC)
-
触发条件:从节点断线重连,且主节点的复制积压缓冲区包含断线期间的写命令。
-
核心机制:
- 主节点维护 复制积压缓冲区(固定大小,环形结构)。
- 从节点通过
PSYNC <runid> <offset>告知主节点上次同步的偏移量。 - 主节点根据偏移量返回增量数据。
4. 心跳检测
- 主 → 从:每 10 秒发送
PING检测从节点存活状态。 - 从 → 主:每秒发送
REPLCONF ACK <offset>,汇报当前复制偏移量(用于检测延迟和超时)。
五、复制中的常见问题与解决方案
1. 读写分离问题
-
问题:从节点数据延迟导致读取旧数据。
-
解决:
- 监控
master_repl_offset和slave_repl_offset的差值。 - 业务层根据一致性要求选择读取主节点(强一致性)或从节点(最终一致性)。
- 监控
2. 数据不一致
-
原因:
- 主从网络延迟或故障。
- 从节点未开启只读模式,误写入数据。
-
解决:
- 确保从节点配置
replica-read-only yes。 - 使用
WAIT命令阻塞客户端直到数据同步到 N 个从节点(强一致性,但性能下降)。
- 确保从节点配置
3. 全量复制风险
-
风险点:
- 主节点生成 RDB 时内存翻倍(fork 操作)。
- 大 Key 导致 RDB 传输时间过长。
-
规避方法:
- 增大
repl-backlog-size(默认 1MB,建议提升至 100MB 以上)。 - 避免使用超大 Key,或拆分 Key。
- 增大
4. 主节点重启导致复制中断
- 问题:主节点重启后,
runid变化,触发从节点全量复制。 - 解决:通过 持久化
runid(需第三方工具)或使用故障转移机制(如 Redis Sentinel)。
六、配置优化与监控
1. 关键配置
# 主节点配置
repl-backlog-size 100mb # 增大复制积压缓冲区
repl-backlog-ttl 3600 # 缓冲区保留时间(秒)
client-output-buffer-limit replica 256mb 64mb 60 # 从节点输出缓冲区限制
# 从节点配置
repl-ping-replica-period 10 # 从节点 ping 主节点频率(秒)
repl-timeout 60 # 复制超时时间(秒)
2. 监控命令
# 查看主节点复制状态
INFO replication
# 查看从节点延迟
redis-cli -h <slave-ip> info replication | grep lag
七、生产环境最佳实践
-
拓扑选择:
- 单数据中心:一主多从 + Sentinel 哨兵。
- 多数据中心:树状级联复制(主 → 跨机房从 → 下级从)。
-
规避全量复制:
- 定期检查主从
offset差值。 - 监控
master_link_down_since_seconds判断主从连接状态。
- 定期检查主从
-
容灾演练:
- 模拟主节点故障,验证从节点升级流程。
通过合理配置复制拓扑、优化复制缓冲区大小,并监控主从同步状态,可显著提升 Redis 集群的可用性和数据可靠性。