主从分离
1. 为什么要主从分离
大多数系统是 读多写少。 例如电商系统里:
- 浏览商品:很多
- 下单写入:相对少
所以可以让:
text
主库:负责写
从库:负责读这样读请求压力就可以分散到多个从库上。文章中称“一主多从”是应对突发读流量的常见方法。
2. 主从复制怎么工作
以 MySQL 为例:
text
主库写入数据
↓
主库生成 binlog
↓
从库 IO 线程拉取 binlog
↓
写入 relay log
↓
从库 SQL 线程回放 relay log
↓
从库数据逐渐追上主库所以主从复制依赖 binlog,通常是异步复制。
3. 主从分离的问题
最大问题是:
text
主从延迟例如刚写入主库,马上去从库查,可能查不到。
解决思路有三种:
- 消息中冗余完整数据,避免消费者再查从库;
- 写数据库时同步写缓存,读时优先查缓存;
- 必要时查主库,但要谨慎,避免主库被读流量压垮。
4. 如何让应用访问数据库
读写分离后,应用要区分:
text
写请求 → 主库
读请求 → 从库通常通过数据库中间件屏蔽复杂性:
| 类型 | 特点 | 例子 |
|---|---|---|
| 嵌入应用内部 | 简单,无独立部署成本 | TDDL、Sharding-JDBC |
| 独立代理层 | 支持多语言,便于维护 | Mycat、Atlas、DBProxy |
5. 总结
text
查询量大 → 读写分离
写主库 → 读从库
主从靠 binlog 复制
从库可扩容,但不能无限加
核心风险是主从延迟
应用访问可用中间件屏蔽复杂性