Redis 主从复制和持久化
https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/
以下是关于 Redis 主从复制的详细实现原理、操作步骤及实践注意事项的完整说明:
一、Redis 主从复制核心原理
1. 复制流程架构
主节点(Master)
│
├── 全量复制(首次同步)
│ ├── BGSAVE生成RDB文件
│ └── 传输RDB+缓冲区命令
│
└── 增量复制(持续同步)
├── 复制偏移量(offset)
└── 环形缓冲区(repl_backlog)
2. 关键技术点
- 异步复制:主节点处理完命令后立即返回客户端,异步同步从节点
- 复制ID:每个主节点启动时生成唯一标识(
master_replid) - 偏移量机制:主从节点各自维护复制偏移量(
master_repl_offset) - PSYNC协议:Redis 2.8+ 引入的优化同步协议,支持断点续传
二、主从复制配置步骤
1. 快速配置(命令行方式)
# 在从节点执行(Redis 5.0+)
$ redis-cli --replicaof <master-ip> <master-port>
# 传统方式(所有版本)
127.0.0.1:6380> REPLICAOF 192.168.1.100 6379
OK
# 取消复制
127.0.0.1:6380> REPLICAOF NO ONE
2. 持久化配置(修改配置文件)
# 从节点 redis.conf 配置
replicaof 192.168.1.100 6379
masterauth yourpassword # 如果主节点有密码
replica-serve-stale-data yes # 主节点宕机时是否继续服务
replica-read-only yes # 从节点只读
3. 主节点验证配置
# 查看主节点复制信息
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.101,port=6380,state=online,offset=1156,lag=0
slave1:ip=192.168.1.102,port=6381,state=online,offset=1156,lag=1
三、复制过程详解
1. 全量复制(首次同步)
- 从节点发送
PSYNC ? -1请求 - 主节点执行
BGSAVE生成RDB快照 - 主节点将RDB文件传输给从节点
- 从节点清空旧数据,加载新RDB
- 主节点发送复制缓冲区的写命令
注意事项:
- 主节点内存使用会翻倍(RDB生成期间)
- 网络带宽占用大,建议在低峰期操作
- 可设置
repl-diskless-sync yes进行无盘复制(Redis 2.8.18+)
2. 增量复制(断线重连)
- 从节点携带
master_replid和offset发起PSYNC请求 - 主节点检查复制积压缓冲区(repl_backlog)
- 如果offset在缓冲区内,发送增量数据
- 如果offset已溢出,触发全量复制
缓冲区配置:
# 主节点配置(默认1MB)
repl-backlog-size 1mb
repl-backlog-ttl 3600 # 断开后保留时间(秒)
四、高级配置与优化
1. 安全认证
# 主节点设置密码
requirepass masterpass123
# 从节点配置
masterauth masterpass123
2. 网络优化
# 主节点配置
repl-disable-tcp-nodelay no # 开启减少小包数量
client-output-buffer-limit replica 256mb 64mb 60 # 调整复制缓冲区
# 从节点配置
repl-timeout 60 # 复制超时时间(秒)
3. 读写分离实现
// Java客户端示例(Jedis)
JedisPoolConfig poolConfig = new JedisPoolConfig();
JedisPool masterPool = new JedisPool(poolConfig, "master-host", 6379);
JedisPool replicaPool = new JedisPool(poolConfig, "replica-host", 6380);
// 写操作使用主节点
try (Jedis master = masterPool.getResource()) {
master.set("key", "value");
}
// 读操作使用从节点
try (Jedis replica = replicaPool.getResource()) {
String value = replica.get("key");
}
五、故障处理与监控
1. 常见问题排查
问题现象:从节点显示state=wait_bgsave
- 原因:主节点正在执行BGSAVE
- 解决:检查主节点磁盘空间和内存使用
问题现象:MASTER <-> REPLICA sync: Finished with success
- 原因:正常完成全量同步
- 验证:检查
master_repl_offset是否一致
2. 监控指标
# 关键监控项
redis-cli info replication | grep -E "connected_slaves|master_repl_offset|slave[0-9]_"
# Prometheus监控配置
- name: redis_replication
metrics_path: /metrics
static_configs:
- targets: ['redis-host:9121'] # 需部署redis_exporter
3. 主节点故障处理
- 手动提升从节点为主节点:
redis-cli -h replica-host -p 6380 REPLICAOF NO ONE - 修改其他从节点指向新主节点
- 恢复原主节点后设置为新主节点的从节点
六、主从复制限制与解决方案
| 限制项 | 解决方案 |
|---|---|
| 写性能单点瓶颈 | 使用Redis Cluster分片 |
| 主从延迟 | 监控slave_repl_offset差值 |
| 全量复制期间服务中断 | 使用无盘复制+千兆网络 |
| 脑裂问题 | 配合Sentinel实现自动故障转移 |
| 数据一致性风险 | 使用WAIT命令强制同步 |
一致性保障命令:
# 等待至少1个从节点确认(超时1秒)
127.0.0.1:6379> SET key value
127.0.0.1:6379> WAIT 1 1000
七、生产环境最佳实践
-
拓扑建议:
- 主节点:专用高配服务器,关闭持久化
- 从节点:多实例部署,开启AOF持久化
- 至少保留一个从节点与主节点跨机房部署
-
版本要求:
- 主从节点尽量保持相同大版本
- Redis 5.0+ 推荐使用
REPLICAOF命令
-
安全建议:
- 启用SSL加密传输(Redis 6.0+)
- 配置防火墙规则限制访问来源IP
- 定期执行
BGREWRITEAOF压缩日志
通过以上配置和优化,Redis主从复制可以实现:
- 数据可靠性:99.999%(年故障时间<5分钟)
- 同步延迟:百兆网络下<10ms,千兆网络<2ms
- 故障切换时间:人工干预约1分钟,配合Sentinel可达秒级切换

浙公网安备 33010602011771号