网站首页 > 开源技术 正文
前言
最近我们的APP在线用户越来越多,接口的响应速度也是越来越慢,经过运维排查发现是由于并发查询太多导致的数据库压力比较大,架构师经过调研给出了数据库读写分离的解决方案,为了快速解决问题,我们最终采用AOP技术实现了数据库读写分离方案。
目录
- 什么是数据库读写分离以及为什么要读写分离?
- 数据库读写分离实现方式及优缺点分析
- 用AOP实现的数据库读写分离方案
- 总结
什么是数据库读写分离以及为什么要读写分离?
数据库读写分离,顾名思义就是将数据库的读操作和写操作分开。
传统项目架构中,所有的操作都在同一个数据库执行,在并发量很小的时候这并不会出现什么问题,但是在并发量很大时单个数据库就会出现性能问题。
假设单个数据库的QPS为1000,数据库的并发量为2000,狼多肉少的情况下接口响应速度变慢也就不足为怪了。
数据库读写分离方案的出现就是为了解决这个问题的。
项目采用数据库读写分离方案之后共有4个数据库,其中1个主数据库和3个从数据库,主从之间采用binlog文件的方式进行数据同步。主数据库负责处理所有的写操作,从数据库异步进行数据同步;所有的读操作会平均分散到3个从数据库上执行。
数据库读写分离之后,主数据库处理写操作,多个从数据库组成集群共同提供查询服务,原本大并发量的查询操作将被平均分到3个数据库上,从而降低了每个数据库的并发,提升额查询效率;同时还将数据做了冗余备份,增加了系统的抗风险能力。
数据库读写分离实现方式及优缺点分析
根据解决方式所在的层面不同,数据库读写分离主要有3种解决方案:
1、应用层面
实现方式主要是在应用层加一个数据源路由层,将查询操作路由到从库,将写入操作路由到主库。
优点:方案实现起来比较轻便、路由策略可自由控制,扩展性强。
缺点:功能有限,个人要实现完整的方案难度较大,且该方案与代码强耦合,跨语言不通用。
2、中间件层面
实现方式是在应用和数据库之间加一层代理,由代理来转发操作请求。像阿里的MyCat、360的Atlas、美团的DBProxy等都是此类实现方案。
优点:解决方案与应用层代码解耦,通用性较好。
缺点:应用和数据库之间增加了代理层,连接由直连改为代理会导致性能有所下降。
3.数据库驱动层面
实现方式是提供一个支持数据库读写分离的驱动。像Mysql自带的ReplicationDriver驱动、当当开源的Sharding-JDBC、淘宝开源的TDDL等解决方案都是基于数据库驱动层面实现的。
优点:功能丰富、集成方式较简单,应用层面改动较小。
缺点:需使用特定数据库驱动,扩展性较低。
用AOP实现的数据库读写分离方案
采用这个方案一是因为足够轻便,不需要额外增加什么东西;二是因为AOP技术门槛较低,实现起来比较快速。
先介绍一下我们项目的技术背景,项目采用SpringBoot框架开发,采用Mybatis作为ORM层,请求的调用链一般就是Controller调用Service,Service调用Mapper。
方案架构图:
本文暂时没有评论,来添加一个吧(●'◡'●)