MySQL|MySQL 读写分离的基本概念和实现方式

简单的介绍了MySQL数据库读写分离的概念和实现方式。

文章目录
  • 1 读写分离的概念
  • 2 读写分离的实现
  • 3 读写分离的问题

1 读写分离的概念 读写分离是指将数据库的读和写操作分不到不同的数据库节点上。主服务器负责处理写操作和实时性要求较高的读操作,从服务器负责处理读操作。
【MySQL|MySQL 读写分离的基本概念和实现方式】读写分离减缓了数据库锁的争用,可以大幅提高读性能,小幅提高写的性能,非常适合读请求非常多的场景。读写分离会依赖到Mysql的主从复制的功能,因此也能够顺带着解决了数据库单点故障的问题,基于主从切换可以实现数据库的高可用性。
读写分离的方案中,一主一从、一主多从、多主多从都是可以的,比较灵活。
2 读写分离的实现 项目中读写分离常见的实现方式有两种,一种是直接在客户端的实现,另一种是第三方数据库中间件代理的实现。
基于客户端的实现,也就是在应用程序/代码层面的实现。我们可以自己写一个AOP拦截器,然后对配置多个读、写数据源,利用AOP拦截技术对到达的读/写请求进行解析(可以通过方法名之类的进行拦截),针对性地选择不同的数据源,将请求分发到不同的数据库中,从而实现读写分离,,不引入任何jar包,也不需要引入任何中间组件,节省了很多运维的成本,但是需要自己编程。
基于客户端的实现推荐引入的中间件jar的方式而不是手动编程的方式,也称为组件式,推荐使用sharding-jdbc的jar包,这些jar包中已经包含了读写分离的各种逻辑,只需要开发人员少量的配置即可非常方便的实现读写分离,相比于手动实现,节省了很多编程的成本,sharding-jdbc还提供了多种不同的从库负载均衡策略,以及强制路由策略。
第二种就是基于外部数据库中间件来帮助我们实现读写分离,比如MySQL Router(官方)、Atlas(基于 MySQL Proxy)、Maxscale、MyCat。这种方式类似于在应用层和数据库层之间添加了一个独立的代理层,应用程序所有的数据请求都交给代理层处理,代理层负责分离读写请求,将它们路由到对应的数据库中。这种方式不会侵入客户端代码,但是需要额外的部署第三方组件,会增加运维成本,让系统架构变得更加复杂。
推荐使用sharding-jdbc的jar包来实现读写分离。sharding-jdbc官网的介绍:Sharding-JDBC是ShardingSphere的第一个产品,也是ShardingSphere的前身。 它定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它虽然也是一个数据库中间件,但是使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
MySQL|MySQL 读写分离的基本概念和实现方式
文章图片

sharding-jdbc官网也提供了非常详细且简单的实现读写分离的方案:https://shardingsphere.apache.org/document/legacy/3.x/document/cn/manual/sharding-jdbc/usage/read-write-splitting/。
注意,读写分离依赖于Mysql的主从复制,而sharding-jdbc等数据库中间件是不提供主从复制的功能的,这是Mysql的原生实现。
3 读写分离的问题 因为读写分离依赖主从复制,因此读写分离的问题实际上就是主从复制的问题,那就是主备延迟的问题。
没有特别好的解决办法,主要思路有下面这些:
  1. 可以在数据同步一定时间之后再从备库读取。
  2. 将那些必须获取最新数据的读请求都交给主库处理。
  3. 一个主库分为多个主库,分担主库的写请求,减少单个库的binlog日志产生速度。
  4. 打开 MySQL 从库的并行复制,sql_thread从一个变成多个,这需要Mysql5.6及其以上的版本支持。
参考资料:
  1. 《MySQL实战45讲 | 极客时间 | 丁奇》
如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

    推荐阅读