1. 读写分离的本质与业务场景
当数据库访问量达到单机性能瓶颈时,最直接的解决方案就是"分而治之"。读写分离的核心思想是将数据库的读操作(SELECT)和写操作(INSERT/UPDATE/DELETE)分别路由到不同的服务器节点。主库(Master)负责处理所有写请求,从库(Slave)通过复制机制同步主库数据并承担读请求。
这种架构在电商大促时尤为典型。假设某平台秒杀活动期间:
- 写操作集中在订单创建、库存扣减(主库处理)
- 读操作包括商品详情展示、订单查询(从库分担)
注意:不是所有场景都适合读写分离。当业务写操作占比超过40%,或强一致性要求极高时(如金融交易),需谨慎评估。
2. 技术实现的三层架构
2.1 主从复制机制
MySQL通过binlog实现主从同步:
- 主库将变更写入二进制日志
- 从库I/O线程拉取binlog到本地relay log
- 从库SQL线程重放relay log中的事件
sql复制-- 主库配置示例
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
-- 从库配置示例
[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin
read_only = ON
2.2 路由分发层
常见代理方案对比:
| 方案 | 延迟控制 | 故障转移 | 语言支持 | 适用规模 |
|---|---|---|---|---|
| MySQL Router | 中等 | 自动 | 多语言 | 中小型集群 |
| ProxySQL | 低 | 半自动 | SQL | 大中型集群 |
| 应用层Sharding | 最低 | 手动 | 需编码 | 定制化需求 |
2.3 一致性保障
最终一致性通过以下策略保证:
- 读从库时检查主从延迟(Seconds_Behind_Master)
- 关键业务操作强制走主库(如支付完成页查询)
- 使用GTID防止数据错乱
3. 实战中的五个关键问题
3.1 主从延迟处理
我曾遇到从库延迟达15分钟的案例,解决方案:
- 优化大事务拆分(单事务不超过1万行)
- 调整sync_binlog=1和innodb_flush_log_at_trx_commit=1
- 使用多线程复制(slave_parallel_workers=8)
3.2 连接池配置
建议采用双连接池设计:
java复制// Spring Boot配置示例
@Bean
@Primary
public DataSource masterDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://master:3306/db")
.build();
}
@Bean
public DataSource slaveDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://slave:3306/db")
.build();
}
3.3 故障转移策略
推荐的三阶段切换流程:
- 监控发现主库宕机(心跳检测超时3次)
- 提升从库为新主库(先flush logs再reset master)
- 其他从库指向新主库(change master命令)
3.4 读写分离失效场景
以下情况会导致路由失效:
- 存储过程调用(建议拆分为单独SQL)
- 临时表操作(从库无法同步)
- 系统变量设置(如SET @var=1)
3.5 性能监控指标
必须监控的四项核心指标:
- 主库写入QPS(警戒线:单机5000+)
- 从库复制延迟(警戒值:>5秒)
- 连接池等待线程数(警戒值:>50)
- 网络往返时间(警戒值:>100ms)
4. 架构演进路线
初级方案:
mermaid复制graph TD
A[应用] -->|写| B(主库)
A -->|读| C(从库)
B --> D[binlog]
D --> C
高级方案:
mermaid复制graph TD
A[应用] --> B[ProxySQL]
B -->|写| C(主库)
B -->|读| D(从库组)
C --> E[binlog]
E --> D
D --> F[延迟监控]
F --> B
终极方案:
mermaid复制graph TD
A[应用] --> B[服务网格]
B --> C[主库集群]
B --> D[全球只读副本]
C --> E[DDL同步器]
E --> D
D --> F[区域DNS]
实际部署时,建议从单主单从开始,逐步演进到多级复制架构。某跨境电商平台的数据显示,经过读写分离优化后:
- 查询响应时间降低62%
- 主库CPU负载下降45%
- 高峰期故障率减少80%