MySQL的主从复制和读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了才能在此基础上进行数据的读写分离;
MySQL读写分离能提高系统性能
- 物理服务器增加,机器处理能力提升。拿硬件换性能;
- 主从只负责各自的读和写,极大程度缓解X锁和S锁争用;
- slave可以配置myiasm引擎,提升查询性能以及节约系统开销;
- master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步;
- slave可以单独设置一些参数来提升其读的性能;
- 增加冗余,提高可用性;
读写分离实现
方案一:代码层配置多个数据源
springboot配置多数据源,实现不同请求或者操作动态拦截,数据源切换;基于spring的aop实现: 用aop来拦截spring项目的dao层方法,根据方法名称就可以判断要执行的sql类型(即是read还是write类型),进而动态切换主从数据源;
方案二:基于中间代理层实现
- MyCat:需要DBA对每个表的分片策略进行配置和干涉;
- 优点: 1. 功能较丰富,对读写分离和分库分表都有支持; 2. 易用,且对原有的应用系统侵入比较小,系统改造比较易于实现; 3. 支持故障切换;
- 不足:1. 在整个系统中,MyCat作为一个单节点来路由其他数据库,在数据库比较多的情况下,MyCat本身的CPU性能压力会越来越大。因此,在生产系统中,MyCat不可避免的会需要一些高可用的手段;2. 同样,由于MyCat本身需要解析sql,也需要合并各个数据库返回的结果,本身CPU消耗会比较高,当达到一定临界点时,CPU可能会不堪重负;
- 基于mysql-connector-java的jdbc驱动方式
java程序通过在连接MySQL的jdbc中配置主库与从库等地址,jdbc会自动将读请求发送给从库,将写请求发送给主库;mysql的jdbc驱动还能够实现多个从库的负载均衡;
- 基于sharding-jdbc的方式
- MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua脚本进行SQL 判断;
- Atlas基于MySQL协议的数据中间层项目;它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性;每天承载的读写请求数达几十亿条;支持事物以及存储过程