2、数据库高可用基础:主从复制原理(MySQL Binlog)、读写分离架构、常见复制拓扑
数据库高可用是分布式系统稳定性的基石。MySQL 主从复制通过二进制日志(Binlog)实现数据同步,是构建读写分离、故障转移、灾备恢复等架构的核心技术。本节从 Binlog 原理出发,逐步拆解复制流程、读写分离架构及常见拓扑。
2.1 MySQL Binlog 与主从复制原理
MySQL 主从复制基于 二进制日志(Binary Log,简称 Binlog) 实现。Binlog 记录了所有修改数据库数据的 DDL 和 DML 语句(除 SELECT 外),以事件形式顺序写入磁盘。主库将 Binlog 推送给从库,从库重放日志以保持数据一致。
2.1.1 复制核心流程(三步握手)
- 主库(Master):事务提交时,将数据变更写入 Binlog 文件,并记录当前日志位置(Position)。
- 从库(Slave):启动两个关键线程——I/O 线程 和 SQL 线程。I/O 线程连接主库,请求指定 Binlog 文件名和偏移量,主库的 Dump 线程 负责推送日志内容。
- 从库重放:I/O 线程将接收到的 Binlog 事件写入本地的 中继日志(Relay Log);SQL 线程顺序读取 Relay Log 并执行其中的 SQL 语句,完成数据同步。
关键指标: 主从延迟通常由
Seconds_Behind_Master 监控,受网络带宽、从库写入性能、大事务等因素影响。建议将 Binlog 格式设置为 ROW 模式,保证数据一致性。
2.1.2 Binlog 三种格式对比
| 格式 | 记录方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| STATEMENT | 记录原始 SQL 语句 | 日志量小,易于理解 | 依赖上下文,可能产生数据不一致(如 UUID()、NOW()) | 简单查询、低并发环境 |
| ROW | 记录每一行数据变更前后值 | 数据一致性最强,支持所有函数 | 日志量大,占用磁盘和网络带宽 | 生产环境、数据一致性要求高的场景 |
| MIXED | 自动判断:安全时用 STATEMENT,否则用 ROW | 兼顾日志量与一致性 | 判断逻辑复杂,偶发不可控 | 混合负载、开发测试环境 |
2.2 读写分离架构
读写分离将数据库的读请求和写请求分发到不同的节点:主库(Master) 负责写入(INSERT/UPDATE/DELETE),从库(Slave) 负责读取(SELECT)。这种架构能有效分摊主库压力,提升系统吞吐量。
2.2.1 架构组件与数据流
- 负载均衡层:通常由代理中间件(如 ProxySQL、MyCat、MaxScale)或应用层路由实现,根据 SQL 类型自动分发请求。
- 主库:处理写请求,同时将 Binlog 推送给所有从库。
- 从库:处理读请求,可水平扩展以提升读能力。
- 延迟监控:从库可能因主从延迟读到旧数据,需配合 强制读主 或 延迟阈值 策略。
实践建议: 对于实时性要求极高的业务(如支付、库存扣减),建议强制走主库读取;对于报表、历史查询等非实时场景,可放心使用从库。
2.2.2 读写分离架构图
2.3 常见复制拓扑
根据业务规模、可用性要求和成本,MySQL 主从复制有多种拓扑结构。以下为三种最常用的模式。
2.3.1 一主一从
最简单的拓扑:一个主库对应一个从库。从库作为主库的备份,同时承担读流量。适用于小型应用、开发测试环境或对可用性要求不高的场景。
- 优点:部署简单,维护成本低。
- 缺点:主库故障时,从库提升为主库期间存在写不可用窗口;读能力扩展有限。
2.3.2 一主多从
一个主库对应多个从库。从库可水平扩展,大幅提升读能力。适用于读多写少、报表查询、数据分析等场景。
- 优点:读能力线性扩展;多个从库可分担不同业务查询(如一个从库做实时查询,另一个做离线分析)。
- 缺点:主库写入压力不变;主库故障时,需从多个从库中选举新主库,流程复杂。
2.3.3 双主(Master-Master)与级联复制
双主架构:两个节点互为主从,均可读写。需解决冲突问题(如自增 ID 偏移、应用层拆分写入)。级联复制:从库再挂载从库,形成树状结构,用于跨机房、跨地域的数据同步。
| 拓扑类型 | 节点关系 | 适用场景 | 注意事项 |
|---|---|---|---|
| 一主一从 | 1 Master → 1 Slave | 小型应用、备份、开发测试 | 主库单点故障风险 |
| 一主多从 | 1 Master → N Slave | 读密集型业务、报表、读写分离 | 主库写入瓶颈、主从延迟 |
| 双主 | Master ↔ Master | 高可用、跨机房双活 | 冲突解决、自增 ID 配置 |
| 级联复制 | Master → Slave1 → Slave2 | 跨地域、多数据中心 | 延迟逐级放大 |
2.4 常见复制拓扑图
避坑提醒: 一主多从架构中,如果从库数量超过 5~7 个,主库的 Dump 线程和网络 I/O 会成为瓶颈。建议使用级联复制或引入中间件层进行分发,避免主库负载过高。