在面试 Redis 相关岗位时,主从复制(Master-Slave Replication)是几乎必考的核心考点。它不仅是实现高可用(Sentinel)和分片集群(Cluster)的基石,更体现了对分布式数据一致性与系统健壮性的理解。
以下是一篇为你准备的深度技术文章:
面试必问:Redis 主从复制核心机制与优缺点全解析
一、 什么是 Redis 主从复制?
Redis 主从复制是指将一台 Redis 服务器(Master,主节点)的数据,复制到其他的 Redis 服务器(Slave,从节点)。
* 数据的复制是单向的:只能由主节点到从节点。
* 角色分工:主节点负责写操作(Write),从节点负责读操作(Read),实现读写分离,极大提高系统吞吐量。
二、 核心机制详解
Redis 主从复制经历了多次演进(从 2.8 以前的全量同步,到 2.8 引入的 PSYNC,再到 4.0 的优化),其核心流程主要分为三个阶段:
1. 建立连接阶段
- 从节点执行
replicaof(旧版slaveof)命令,保存主节点的 IP 和端口。 - 从节点与主节点建立 TCP 连接。
- 从节点发送
PING命令,检查网络连通性。 - 身份验证(如果主节点设置了
requirepass)。
2. 数据同步阶段:全量与增量
这是面试中最常被问到的核心:如何保证数据一致?
A. 全量同步(Full Resynchronization)
当从节点第一次连接主节点,或者无法进行增量同步时发生:
1. 主节点执行 BGSAVE 生成 RDB 快照文件。
2. 主节点将 RDB 文件发送给从节点。
3. 从节点处理:清空自身旧数据,载入 RDB 文件。
4. 缓冲区补发:在主节点生成 RDB 期间产生的写命令会被记录在 replication buffer 中,待 RDB 载入完成后,主节点再将缓冲区命令发给从节点执行。
B. 增量同步(Partial Resynchronization)
用于解决网络短暂闪断后的恢复。依赖以下三个核心要素:
* Replication ID (RunID):主节点的唯一标识。断线重连后,从节点会对比 RunID。
* Offset (偏移量):主从双方都会维护一个偏移量,代表当前数据处理到的位置。
* Replication Backlog Buffer (复制积压缓冲区):主节点内部维护的一个固定长度的循环队列(Ring Buffer)。它记录了最近的写指令。
流程:断线重连后,从节点发送 PSYNC <runid> <offset>。如果偏移量对应的数据仍在主节点的“复制积压缓冲区”内,则仅同步缺失的部分,无需生成 RDB。
3. 命令传播阶段
同步完成后,主节点每执行一个写命令,就会异步地发送给从节点,确保主从数据实时接近。
三、 主从复制的优缺点
优点(Pros)
- 读写分离(高吞吐):主写从读,显著降低主节点压力。
- 数据冗余(备份):实现了多台机器的数据备份,提高安全性。
- 高可用的基石:它是 Sentinel(哨兵)和 Cluster(集群)模式实现故障自动转移的前提。
缺点(Cons)
- 不具备自动故障转移:一旦主节点宕机,需要手动切换从节点为主节点(除非配合哨兵)。
- 写压力受限:由于是异步复制,且所有写操作都在主节点,写性能受单机限制。
- 数据一致性延迟:在高并发下,主从同步存在微秒级的延迟,可能导致读到旧数据。
- 资源消耗:第一次全量同步(BGSAVE)会消耗主节点的 CPU、内存和磁盘 IO。
四、 面试避坑指南:高频 Q&A
Q:主从复制是同步还是异步的?
A:是异步的。主节点在执行完写操作后,立即返回给客户端成功,随后再将命令分发给从节点。
Q:如果从节点过多,对主节点有什么影响?
A:主节点需要为每个从节点维护发送缓冲区,且发送 RDB 文件会占用大量网络带宽。建议使用图状结构(主-从-从)来减轻主节点的压力。
Q:什么是脑裂(Split-brain)?
A:在网络分区情况下,从节点认为主节点挂了并选举了新主,但原主节点仍在运行且接收写请求,导致数据乱序。Redis 通过 min-replicas-to-write 配置项来缓解此问题。
Q:RDB 同步一定需要落盘吗?
A:不一定。Redis 支持 Diskless Replication(无盘复制),即直接通过 Socket 将 RDB 数据流发送给从节点,不经过主节点磁盘,适合磁盘慢而带宽充足的场景。
五、 总结
主从复制是 Redis 分布式的灵魂。面试时,重点要突出对 PSYNC 机制(RunID+Offset+Backlog) 的理解,以及全量同步时 Replication Buffer 的作用。掌握了这些,Redis 主从复制这一关就能稳稳通过。