数据库读压力远高于写时,读写分离能有效提升性能并提高系统可用性。
1. 核心思路
- 主库负责写操作。
- 从库复制主库数据,负责读请求。
- 应用层根据SQL类型自动路由到主库或从库。
2. 数据同步方式
- 主从复制(MySQL Replication) :通过binlog异步同步。
- 半同步复制:主库等待至少一个从库确认后返回成功。
- 全同步复制:所有从库都确认才提交,性能最低。
3. 读写分离实现方式
-
中间件层:
- ShardingSphere、MyCAT、Atlas可自动路由SQL。
- 优点:无代码入侵。
-
应用层:
- 通过注解或AOP区分读写操作。
- 灵活,但维护复杂。
4. 关键问题
-
数据延迟:从库延迟导致读到旧数据。
- 解决:重要读请求强制走主库。
-
事务一致性:读后写可能读取旧值。
- 解决:写后读临时强制主库路由。
-
负载均衡:多从库需轮询或加权分配请求。
5. 实践经验
- 从库数量不宜过多,复制延迟会扩大。
- 建立监控指标:主从延迟、同步状态。
- 定期检查主从一致性。
结论:读写分离能显著提升性能,但不能解决所有扩展问题。设计核心是延迟与一致性的取舍。