1. 什么是主从复制?作用是什么?
参考答案:主从复制就是把主节点(master)的数据,同步到从节点(slave/replica)。
- master:负责接收写请求;
- slave:复制master数据,一般只提供读服务。
三大作用:
- 读写分离:写走主,读请求分摊到从节点,提升读吞吐量。
- 数据备份:从节点保存一份副本,防止单节点数据丢失。
- 高可用基础:主节点故障时,可以把从节点提升为主节点(故障转移)。
注意:主从本身不自动故障转移,自动切换需要哨兵Sentinel。
2. Redis主从复制完整流程是什么?
参考答案:Redis复制分为全量复制和增量复制。
① 全量复制(第一次建立复制、从库重启、replid不匹配时触发)
- 从节点向主节点发送
PSYNC ? -1请求同步数据。 - master执行bgsave,生成RDB快照。
- master把RDB文件发给从节点;
- 在生成RDB、传输RDB期间,master新收到的写命令,放到复制积压缓冲区(repl‑backlog)。
- 从节点收到RDB,清空本地旧数据,加载RDB。
- 加载完成后,master把积压缓冲区里面新增的写命令发给从节点,从节点回放执行,追平数据。
② 增量复制(网络短暂断开重连)
- 从节点断线重连,携带自己的
replid和offset偏移量。 - master检查:repl‑backlog缓冲区中是否还保存该offset之后的数据。
- 如果还在:直接把offset之后的命令发给从节点执行,不需要全量RDB。
- 如果缓冲区已经覆盖掉该offset:只能触发一次全量复制。
关键名词:
- replid:主节点唯一复制ID;
- offset:复制偏移量,主从各自维护,代表已经同步到哪个位置;
- repl‑backlog 复制积压缓冲区:环形缓冲区。
3. 什么是复制积压缓冲区 repl‑backlog?作用?参数?
参考答案:复制积压缓冲区是master上一个环形固定大小缓冲区。 master执行写命令时,除了发给从库,同时把命令写入这个环形buffer。
作用: 从节点网络短暂断连恢复后,不需要全量同步,只需要根据offset拉取缓冲区后续命令,做增量同步。
- 环形,写满会覆盖旧数据。
- 如果断线时间太长,offset对应数据已经被覆盖,只能走全量复制。
- 参数
repl‑backlog‑size;业务读多写少可以调小;写压力大要调大,避免频繁全量复制。
4. 主从同步两种模式:异步复制 / 半同步复制
参考答案:
1)异步复制(Redis默认)
master执行完写命令,立刻返回给客户端,不等从节点复制完成。 优点:性能很高; 风险:master刚写完,还没同步到slave就宕机,数据丢失。
2)半同步复制(Redis叫min‑replicas,MySQL叫semi‑sync)
master收到写请求,至少等待N个从节点收到这条命令,才返回成功给客户端。
Redis配置
min‑replicas‑to‑write/min‑replicas‑max‑lag。
优点:降低数据丢失概率; 缺点:延迟变大,如果从节点全部卡住,主节点写会被阻塞。
注意:半同步只是保证从节点收到命令,不一定已经完全执行完。不是强一致。
5. 主从复制会有什么问题?
问题1:数据不一致、延迟(主从延迟)
参考答案:主从延迟:主已经写完,从还没有回放完这条数据,读从库读到旧数据。 产生原因:
- 网络带宽、网络抖动;
- master写压力大,命令传输量大;
- slave本身CPU慢,回放命令跟不上master速度;
- 全量同步时RDB加载阶段,从节点无法处理同步命令。
解决思路:
- 对一致性要求高的读请求直接读主节点;
- 监控offset差值,延迟过大把读请求切回主;
- 调大repl‑backlog‑size减少频繁全量同步。
问题2:全量复制风暴
参考答案:当大量从节点同时触发全量复制:master多次执行bgsave生成RDB,大量网络带宽传输RDB文件。 会打满master磁盘IO、网卡带宽,拖垮主节点。
解决方案:
- 不要所有从直接连主,搭建从的从(级联复制),slave‑of another‑slave;
- 错开从节点重启时间,避免同时全量同步;
- 自研KV可以支持快照文件离线分发。
问题3:主节点宕机,数据丢失场景
参考答案:异步模式下,master执行完写返回客户端,数据还在内存,尚未发送给slave,此时master断电宕机。 这部分新数据完全丢失。半同步可以缓解,但不能100%杜绝。
6. 级联复制是什么?好处和问题?
参考答案:slave不仅可以复制master,slave下面还可以再接从节点,形成树状拓扑。
好处:减轻master压力,大量从节点的同步压力分摊给中间层从节点。
缺点:同步链路变长,主从延迟逐级放大;中间节点故障,下游全部受影响。
7. 主从复制 vs 哨兵Sentinel区别?
参考答案:
- 主从复制:只负责数据同步,没有故障检测、没有自动切换。主挂了需要人工操作提升从。
- Sentinel哨兵:监控主从节点;主故障自动选从提升为主;通知客户端新主地址。 哨兵本身依赖底层主从复制。
哨兵解决高可用,不解决数据一致性。
8. 主从复制和集群分片的区别
参考答案:
- 主从复制:全量数据复制。每个从都保存完整数据集,解决读写分离、备份、高可用。数据不拆分。
- 集群分片:把数据hash拆分到多个master节点,每个节点只存一部分数据,解决数据容量水平扩展;每个分片内部再做自己的主从。
简单一句话:分片解决存不下;主从解决读压力和高可用。
9. MySQL主从和Redis主从简单区别
参考答案:
- MySQL基于binlog二进制日志;Redis复制是传播执行命令。
- MySQL支持GTID;Redis使用replid+offset。
- MySQL有statement/mixed/row格式;Redis直接复制原始命令。
- MySQL半同步有after‑sync/after‑commit两种模式。
❌避雷错误
- ❌主从复制可以自动故障转移 ✅不能,需要哨兵。
- ❌半同步复制绝对不会丢数据 ✅只是降低概率,网络异常依然可能丢。
- ❌主从一定强一致 ✅默认异步是最终一致性,存在主从延迟。
- ❌复制积压缓冲区无限大 ✅环形缓冲区,会覆盖旧数据,断线太久触发全量。
📝速记小结
- 流程:全量(快照+backlog回放);增量(offset+repl‑backlog)
- 核心三要素:
replid复制ID、offset偏移量、repl‑backlog环形积压缓冲区 - 同步模式:异步(高性能可能丢数据);半同步(至少N个从收到才返回)
- 典型故障:主从延迟、全量复制风暴、脑裂、断线后全量同步
- 哨兵负责自动故障切换;主从只管数据同步;分片解决容量,主从解决读与高可用。
参考链接 :0voice · GitHub