Redis是大型架构核心,下面我详解Redis主从复制@mikechen
Redis主从复制
主从复制(Replication), 是 Redis 实现高可用、和读写分离的核心机制。
它允许一个主节点(Master)将数据实时同步给一个或多个从节点(Slave),确保数据的一致性与冗余性。

通俗地说:
主节点负责“写”,从节点负责“读”,主节点的数据变化会自动同步给从节点。
Redis主从复制原理
Redis主从之间的复制分为两部分:全量复制和增量复制。
1.Redis全量复制过程
全量复制是主从复制的起点,用于首次建立主从关系或无法进行增量续传的情况。
流程如下:

1)从节点发起同步请求
从节点执行:
replicaof <master_ip> <master_port>
并向主节点发送 PSYNC ? -1 命令,请求全量复制。
2)主节点生成 RDB 快照
主节点执行 BGSAVE,在后台创建 RDB 快照文件,表示当前的完整数据状态。
在生成 RDB 的同时,主节点会将新写入命令暂存到 复制缓冲区。
3)传输 RDB 文件
RDB 文件生成后,主节点通过网络传给从节点;
从节点接收文件、清空旧数据,并加载新的 RDB 数据。
4)发送命令缓冲区数据
RDB 加载完成后,主节点将复制缓冲区中积累的写命令发送给从节点执行,以补齐 RDB 生成过程中的数据差异。
5)进入实时同步阶段
从节点完成全量复制后,主节点会持续将后续写命令实时发送给从节点,保持同步状态。
2.Redis增量复制过程
增量复制用于网络短暂中断后快速恢复同步,避免重新执行耗时的全量复制。
流程如下:

(1)断线重连
当从节点与主节点连接中断后重新连接,会发送:
PSYNC <runid> <offset>
其中:
runid:主节点的唯一运行 ID;
offset:从节点上次同步的复制偏移量。
(2)主节点判断是否可续传
主节点维护一个 replication backlog buffer(复制缓冲区),保存最近一段时间的写命令。
如果 backlog 中仍保留从节点上次的 offset 之后的数据:
主节点返回 +CONTINUE;
从该偏移量开始发送命令,实现增量同步。
否则(缓冲区已被覆盖或 runid 不匹配):
主节点返回 +FULLRESYNC;
回退执行全量复制。
(3)命令流追平
主节点将 backlog 中的命令发送给从节点,从节点执行后数据追平。
此后继续保持实时同步状态。
作者简介
陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》