1. 读写分离的本质与业务痛点
当数据库访问量突破单机性能上限时,最直接的感受就是系统响应变慢、超时增多。去年我们电商大促时就遇到过这种情况:凌晨秒杀活动开始后,订单库的CPU直接飙到100%,大量用户卡在支付页面转圈圈。事后分析发现,当时95%的请求都是查询订单状态的读操作,真正下单的写操作只占5%。这种典型的"读多写少"场景,正是读写分离技术要解决的核心问题。
读写分离的基本思想很直观——把读和写的操作分流到不同的数据库实例上。主库(Master)负责处理INSERT、UPDATE、DELETE等写操作,从库(Slave)专门处理SELECT查询。就像餐厅把下单和取餐的流程分开:顾客在前台点单(写操作),然后去专门的取餐窗口排队(读操作),这样既避免了收银台拥堵,又提高了整体吞吐量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术实现的三层架构
2.1 主从复制机制
MySQL的主从复制就像复印机工作流程:
- 主库的binlog记录所有数据变更(相当于原稿)
- 从库的IO线程实时拉取binlog(扫描原稿)
- 从库的SQL线程重放这些变更(打印复印件)
我们曾经踩过一个坑:某次大促前给商品表新增了索引,结果从库同步延迟突然飙升到10分钟。后来发现是因为主库用Online DDL加了索引,导致binlog量暴增。解决方法是用pt-online-schema-change工具分批处理。
2.2 流量分发策略
常见的路由方式有三种:
- 代码层封装:在DAO层通过注解或配置指定读写路由
java复制@ReadOnly
public List<Order> queryUserOrders(Long userId) {
// 自动路由到从库
}
- 中间件代理:比如用ShardingSphere的MasterSlaveRule配置
yaml复制masterSlaveRules:
ds_ms:
masterDataSourceName: master_ds
slaveDataSourceNames:
- slave_ds_0
- slave_ds_1
- 数据库驱动层:像MySQL Connector/J支持readFromMasterWhenNoSlaves参数
