暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql读写分离的方案

IT枫斗者 2023-03-26
397
你项目中读写分离是怎么实现的?你采用的是什么方案?
hello大家好,我是枫哥。今天跟大家聊一聊Mysql读写分离的四种方案。

 

一,读写分离
1,为什么要做读写分离。
数据库写入效率要低于读取效率,一般系统中数据读取频率高于写入频率,单个数据库实例在写入的时候会影响读取性能,这是做读写分离的原因。
2,mysql读写分离的基础。
实现方式主要基于mysql的主从复制,通过路由的方式使应用对数据库的写请求只在master上进行,读请求在slave上进行。
二,实现读写分离的原理和方案。

1、基于MySQL proxy代理的方式

在应用和数据库之间增加代理层,代理层接收应用对数据库的请求,根据不同请求类型转发到不同的实例,在实现读写分离的同时可以实现负载均衡。
(1)实现原理

(2)开源方案

MySQL的代理最常见的是mysql-proxy、cobar、mycat、Atlas等。这种方式对于应用来说,MySQL Proxy是完全透明的,应用则只需要连接到MySQL Proxy的监听端口即可。当然,这样proxy机器可能成为单点失效,但完全可以使用多个proxy机器作为冗余,在应用服务器的连接池配置中配置到多 个proxy的连接参数即可。
  • mysql-proxy是一个轻量的中间代理,是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,依靠内部一个lua脚本实现读写语句的判断。项目地址:https://github.com/mysql/mysql-proxy ,该项目已经六七年没有维护了,官方也不建议应用于生成环境。

  • cobar是阿里提供的一个中间件,已经停止更新。项目地址:https://github.com/alibaba/cobar

  • mycat的前身就是cobar,活跃度比较高,完全使用java语言开发。项目地址:https://github.com/MyCATApache/Mycat-Server ,该项目当前已经有8.3k的点赞量。

  • moeba(变形虫)是阿里工程师陈思儒基于java开发的一款数据库读写分离的项目(读写分离只是它的一个小功能),与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。更多详细介绍请参考:https://www.biaodianfu.com/amoeba.html , 下载地址:https://sourceforge.net/projects/amoeba/ 。

2、基于应用内路由的方式

基于应用内路由的方式即为在应用程序中实现,针对不同的请求类型去不同的实例执行sql。
(1)实现原理

(2)实现方案

基于spring的aop实现: 用aop来拦截spring项目的dao层方法,根据方法名称就可以判断要执行的sql类型(即是read还是write类型),进而动态切换主从数据源。

3 、基于mysql-connector-java的jdbc驱动方式

(1)实现原理
使用mysql驱动Connector/J的可以实现读写分离。即在jdbc的url中配置为如下的形式:
jdbc:mysql:replication://master,slave1,slave2,slave3/test
(2)实现方案
java程序通过在连接MySQL的jdbc中配置主库与从库等地址,jdbc会自动将读请求发送给从库,将写请求发送给主库,此外,mysql的jdbc驱动还能够实现多个从库的负载均衡。
关于mysql的jdbc说明官方文档地址:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-jdbc-url-format.html
关于mysql的读写分离文档地址:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-source-replica-replication-connection.html

4、基于sharding-jdbc的方式

sharding-sphere是强大的读写分离、分表分库中间件,sharding-jdbc是sharding-sphere的核心模块。

(1)实现原理

(2)实现方案

sharding-jdbc可以与springboot集成。官方网:https://shardingsphere.apache.org/

三、总结

以上四种方案各有优缺点,基于MySQL proxy代理的方式对于应用来说相对简单,但是在项目稳定性、事务支持性等方面还存在问题;而基于应用内路由的方式固然灵活度比较高,但是也增加了应用逻辑的复杂度;基于mysql-connector-java的jdbc驱动和sharding-jdbc的方式在使用上相对简单,但限制了需要使用java开发。
最近在更新过关斩将系列——java面试题,全力帮助小白突破面试大关,目前已经更新至第23篇感兴趣可以关注公众号IT枫斗者追更

往期回顾



福州offer捷报12.5k,自述转行经历,让人大吃一惊!

这个学徒,我必须要给大家说一下!

MYSQL 主从复制如何保证数据一致性

“你平时是如何优化MySQL的”

深入聊聊Mysql索引建立的场景

如何保证Redis与数据库的数据一致性

有关java面试题系列专题,已分享整理在公众号首页—面试宝典系列,还有真实企业面试,经典offer成功案例等。

👉 如果本文对你有帮助的话,欢迎 点赞&在看&分享 ,这对我继续分享&创作优质文章非常重要。非常感谢!

文章转载自IT枫斗者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论