主从复制原理深度解析
候选人小林参加字节 P7 面试,面试官问:
"你们的数据库是怎么做高可用的?"
小林说:"我们用了主从复制,一主两从。"
面试官追问:"主从复制的原理是什么?"
小林说:"主库写,从库读。"
面试官继续追问:"主库和从库之间是怎么同步的?"
小林答不上来了。
【面试官心理】 这道题我用来测试候选人对数据库高可用架构的理解深度。能说出一主多从的占 60%,能讲清 binlog 同步原理的占 20%,能说清同步延迟和应对策略的占 10%。主从复制是 MySQL 高可用的基础。
一、主从复制的原理 🔴
1.1 核心组件
1.2 复制流程
1.3 ❌ 错误理解
候选人原话:"主从复制就是主库写完以后,从库会自动复制数据。"
问题诊断:
- 不理解 binlog 是复制的中介
- 不理解主从之间是异步通信
- 不知道 Relay Log 的作用
二、复制方式 🔴
2.1 异步复制(默认)
特点:
- 主库不等从库确认就返回成功
- 性能最高,但可能丢数据
- 从库可能有一定延迟
2.2 半同步复制
特点:
- 主库等待至少一个从库确认
- 至少一个从库有数据,不会丢
- 性能比异步复制低
2.3 全同步复制
特点:
- 所有从库都确认后才返回
- 性能最低,但数据最安全
- 一般不用
三、复制格式 🔴
3.1 三种 binlog 格式
3.2 STATEMENT 格式的问题
3.3 ROW 格式的优势
💡
MySQL 5.7+ 推荐使用 ROW 格式。在线变更 binlog 格式: SET GLOBAL binlog_format = 'ROW'; ::: :::warning ⚠️ ROW 格式的 binlog 日志量可能是 STATEMENT 的 10 倍。需要评估磁盘空间。
四、主从延迟问题 🟡
4.1 延迟的原因
常见原因:
- 网络延迟
- 从库机器性能差
- 从库并发压力大
- 大事务执行时间长
4.2 监控延迟
4.3 减少延迟的方法
五、配置实战 🟡
5.1 主库配置
5.2 从库配置
5.3 读写分离配置
【面试官心理】 能说出"并行复制"和"逻辑时钟"的候选人,基本都研究过 MySQL 复制机制的源码。这是 P7 的水准。
六、面试追问链 🟡
第一层:主从复制的原理是什么?
- 候选人:主库写 binlog,从库拉取并重放
第二层:binlog 有哪几种格式?
- 候选人:STATEMENT、ROW、MIXED
第三层:主从延迟怎么监控?
- 候选人:Seconds_Behind_Master
第四层:主从延迟怎么解决?
- 候选人:并行复制、读写分离