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

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

1 读写分离的概念

读写分离是指将数据库的读和写操作分不到不同的数据库节点上。主服务器负责处理写操作和实时性要求较高的读操作,从服务器负责处理读操作。

读写分离减缓了数据库锁的争用,可以大幅提高读性能,小幅提高写的性能,非常适合读请求非常多的场景。读写分离会依赖到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框架。
在这里插入图片描述

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学习博客!

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值