本文对于redis主从复制相关知识进行详细的解释,主要从
主从复制的原理、配置方式、数据流转过程
、重要概念与机制、常见问题与解决方案
、典型使用场景、局限性与处理方案
等方面出发,帮助我们更好的理解Redis的主从复制知识。
主从复制是指一个 Redis 主节点(Master)将数据同步到一个或多个从节点(Slave/Replica),从节点一般以只读方式运行。
提高读性能(读写分离)
提供数据备份
构建高可用架构基础(Sentinel、Cluster)
# 指定主节点地址与端口
replicaof 127.0.0.1 6379
# 主从通信密码(如果主节点设置了密码)
masterauth your_master_password
# 在从节点运行
redis-cli> replicaof 127.0.0.1 6379
首次连接或主从断连后,需要执行全量复制:
1、从节点发起
PSYNC
请求;2、主节点执行
bgsave
创建 RDB 快照文件;3、同时记录执行过程中的写命令到 复制积压缓冲区(backlog buffer);
4、将 RDB 文件发送给从节点;
5、从节点加载快照到内存;
6、主节点将 backlog 中的增量命令发送给从节点,完成同步。
只要主从之间的连接保持,主节点会不断通过 replication buffer 向从节点推送新的写命令,保持数据一致。
PSYNC
是 Redis >=2.8 的核心同步协议:
PSYNC fullsync
:全量复制(初次或断点重连失败时)
PSYNC partial
:增量复制(断点续传)条件:从节点保留
run_id
+offset
,且主节点还保留该 offset 的 backlog。
主节点维护一个固定长度(默认1MB)的缓冲区
用于断线后支持从节点 部分同步
参数:
repl-backlog-size
可配置大小
问题 | 原因 | 解决方案 |
---|---|---|
❌频繁全量同步 | backlog 太小/断线时间过长 | 增大 repl-backlog-size ,优化网络稳定性 |
❌主从延迟高 | 从节点处理慢或网络延迟大 | 优化从节点性能;使用 min-slaves-* 配置保障主写 |
❌复制中断 | 从节点断开或主节点故障 | 搭配 Sentinel 自动故障转移 |
❌数据不一致 | 网络抖动/切换滞后/没有同步成功 | 启用 min-slaves-* 限制主写入条件 |
参数 | 说明 |
---|---|
replicaof |
设置当前节点为从节点,连接指定主节点 |
masterauth |
主从通信使用的密码 |
repl-backlog-size |
主节点积压缓冲区大小(默认1MB) |
repl-timeout |
主从通信超时时间 |
repl-disable-tcp-nodelay |
是否批量发送复制数据,优化网络 |
min-slaves-to-write + min-slaves-max-lag |
保障至少有几个从节点处于良好状态,才允许主节点写操作 |
触发机制:
主从连接断开,再次连接时,从节点会带上
runid
和offset
主节点判断是否还能满足这个
offset
✅ 若是:从 backlog 继续发送(部分同步)
❌ 否则:执行全量同步(
bgsave
+ 发送RDB
)✅ 如何保证成功续传?
关键:
repl-backlog-size
足够大只要断开时间不长,offset 落在 backlog 范围内即可
使用场景 | 描述 | 价值 |
---|---|---|
✅ 读写分离 | 主节点负责写操作,从节点负责读操作,提升读吞吐 | 扩展系统整体并发能力 |
✅ 数据高可用备份 | 主节点故障后仍有从节点可用,数据不会丢失 | 减少数据丢失风险 |
✅ 异地灾备 | 从节点部署在异地机房,用于灾备容灾 | 提高系统抗灾能力 |
✅ 慢查询保护 | 将耗时查询请求转发给从节点,减少主节点压力 | 主节点专注于关键写操作 |
✅ 与哨兵结合实现自动故障转移 | 主从配合 Sentinel 模式,可实现自动主从切换 | 提升系统可用性与稳定性 |
虽然主从复制有诸多优势,但也存在一些天然的局限和实际问题:
主写成功 → 从节点还没同步
如果立刻读从节点,可能数据还没到
解决方案:
强一致业务只读主节点
延迟敏感场景用 延时检测脚本 + read-after-write fallback 机制
配置
min-slaves-to-write
+min-slaves-max-lag
保证主写前至少 N 个从同步正常
从节点网络抖动 / IO 慢时,复制延迟明显
增量同步阻塞主节点复制缓冲区
解决方案:
读主/从做区分,重要操作用主节点
提高从节点性能(SSD、内存)
调整
repl-backlog-size
保证足够支持部分同步
主节点挂了,只靠主从复制,无法自动故障切换
客户端连接仍指向不可用主节点
解决方案:
使用
Redis Sentinel
,可自动发现新主节点并通知客户端使用
Redis Cluster
,自动重选主节点并分片
- 所有写操作都由一个主节点处理,写入性能瓶颈
解决方案:
使用
Redis Cluster
,实现分布式主节点写入能力分库分表 + 多套主从对集群处理请求(业务侧分流)
- 业务设计必须适配读写分离架构,否则写压力无法分担
解决方案:
对热点数据做前置缓存 + 异步落盘
多主结构(Cluster + 哨兵分区部署)
局限点 | 说明 | 推荐解决方案 |
---|---|---|
写操作压力集中 | 主节点压力大,单点瓶颈 | Redis Cluster / 分片分区 |
数据不一致 | 主写成功,但从还未同步 | 强一致走主 / 延时容忍策略 |
故障切换需手动 | 主节点挂了从不能自动变主 | 引入 Sentinel 实现自动故障转移 |
客户端连接主节点死链 | 主故障后客户端不知新主地址 | 使用哨兵客户端或代理层(Twemproxy、Codis) |
从节点滞后严重 | 复制延迟大,影响数据新鲜度 | 提升从节点性能 / 配置复制超时策略 |
同步丢失 / 回退全量 | backlog 不足,断点失效 | 增大 repl-backlog-size |
场景 | 建议 |
---|---|
应用写少读多,数据重要 | ✅ 主从复制 + 读写分离 |
需手动故障转移即可接受 | ✅ 简单部署主从即可 |
需自动高可用 & 容灾 | ✅ 主从复制 + Redis Sentinel |
超大规模高并发读写 | ❌ 建议 Redis Cluster 替代主从 |
需强一致性事务操作 | ❌ Redis 原生主从不适合,考虑 MQ / DB |
特性 | 全量复制 | 增量复制 |
---|---|---|
触发条件 | 初次连接 / backlog 不可用 | offset 能在 backlog 中 |
数据量 | 整个 RDB 文件 + backlog 命令 | 仅 backlog 命令 |
开销 | 高,易造成主负载大 | 低,适合频繁同步 |
关键参数 | repl-backlog-size |
offset 与 runid |