一、读写分离介绍

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/ 。
  • Atlas奇虎360的一个开源中间代理,是在mysql官方mysql-proxy 0.8.2的基础上进行了优化,增加一些新的功能特性。 项目地址: https://github.com/Qihoo360/Atlas ,该项目当前已经有4.4k的点赞量。

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

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

(1)实现原理

(2)实现方案

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

多数据源切换:https://gitee.com/baomidou/dynamic-datasource-spring-boot-starter

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/

  1. <dependency>
  2. <groupId>org.apache.shardingsphere</groupId>
  3. <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  4. <version>4.0.1</version>
  5. </dependency>

三、最后总结

以上四种方案各有优缺点,基于MySQL proxy代理的方式对于应用来说相对简单,但是在项目稳定性、事务支持性等方面还存在问题;而基于应用内路由的方式固然灵活度比较高,但是也增加了应用逻辑的复杂度;基于mysql-connector-java的jdbc驱动和sharding-jdbc的方式在使用上相对简单,但限制了需要使用java开发。

Mysql读写分离的四种方案相关推荐

  1. mysql读写分离实现_脱离开发:Mysql读写分离方案之一

    案例:Mysql读写分离 技能目标: · 熟悉MySQL主从复制原理 · 熟悉MySQL读写分离原理 · 学会配置MySQL主从复制 · 学会配置MySQL读写分离 6.1 案例分析 6.1.1 案例 ...

  2. mysql读写分离中间件有哪些

    mysql中间件有哪些 mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开 ...

  3. 如何最大限度的使用数据库性能,全网最细节讲解缓存方案丨读写分离|连接池|缓存方案|mysql|缓存同步|分库分表

    如何最大限度的使用数据库性能,全网最细节讲解缓存方案 视频讲解如下,点击观看: 如何最大限度的使用数据库性能,全网最细节讲解缓存方案丨读写分离|连接池|缓存方案|mysql|缓存同步|分库分表|c/c ...

  4. mycat 分表子查询_还不懂MyCat?一文带你深入剖析,实现MySQL读写分离

    前言 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Myca ...

  5. 后端传输大量log数据_京东智联云MySQL读写分离最佳实践 ,轻松搞定数据库高性能扩展...

    数字化时代,数据库对任何企业而言都是其应用的核心资源.MySQL作为当前最流行的关系型数据库,虽然是开源软件,但是其简单易懂.易于部署管理,且具有ACID特性.强大的SQL查询等特点,被各种业务系统作 ...

  6. MySQL高可用的几种方案

    首先我们看看MySQL高可用的几种方案:   对于数据实时性要求不是特别严格的应用,只需要通过廉价的pc server 来扩展Slave 的数量,将读压力分散到多台Slave 的机器上面,即可通过分散 ...

  7. java读取mysql配置文件_Linux运维:MySQL读写分离解决方案

    一次性付费进群,长期免费索取教程,没有付费教程. 进微信群回复公众号:微信群:QQ群:460500587  教程列表 见微信公众号底部菜单 |  本文底部有推荐书籍  微信公众号:计算机与网络安全 I ...

  8. mysql读写分离的完整配置

    参考文章: 文章一[仅供参考]: 构建高性能web之路------mysql读写分离实战[按照里面配置主从mysql同步失败,并且按照他的my.cnf配置,给我的虚拟机搞坏了,重新弄了一个] http ...

  9. MyCat 之路 | 配置 Mysql 读写分离+强制走写节点+根据主从延时的读写分离

    数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能.对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力 ...

  10. MyCat实现MySQL读写分离(双主双从多库)

    在数据库集群架构中,主数据库负责处理事务性查询(写入操作),而从数据库只负责处理select查询(读操作),这样可以提高数据库整体读写性能.主数据库另外一个功能就是负责将数据变更同步到从数据库中. 读 ...

最新文章

  1. Rocksdb Ribbon Filter : 结合 XOR-filter 以及 高斯消元算法 实现的 高效filter
  2. fileinputstream java_Java FileInputStream close()方法
  3. Thymeleaf在循环时设置递增序号
  4. eclipse failed to load the jni jvm.dll
  5. ASP.NET Web API身份验证和授权
  6. 批量删除txt文档内容命令_Linux@实用操作命令
  7. Android自己定义组件系列【4】——自己定义ViewGroup实现双側滑动
  8. java怎么运行_不要再问我Java程序是怎么执行的了!
  9. pip换源及指令的使用
  10. mysql省市区三级联动数据库的源码(一)
  11. 高通平台如何抓RAMDUMP
  12. 哈雷haley教你如何用你的手机测试你的移动端项目
  13. python对淘宝运营有帮助吗_淘宝运营,有前途吗?
  14. python外部库是什么_Python 常用外部模块详解
  15. AdaBoost算法讲解、举例
  16. 【转】Robot Framework作者建议如何选择自动化测试框架
  17. linux 是否支持中文
  18. 校园导航问题(用图实现一个模拟地图)
  19. 简单实用远控小工具Todesk
  20. Linux内存从0到1学习笔记(6.7,物理内存初始化之CMA初始化)

热门文章

  1. 二、正确看待博弈论和经典理论的理论定位
  2. 【精彩文章】数学家论数学——数学的本质
  3. ZZULIOJ 1882: 蛤玮的魔法【数学】
  4. 《数据结构导论自考知识点(自己总结)》
  5. (原创)用红黄蓝RYB色相环(伊登色相环)代替RGB(RGI/RGV)色相环
  6. 最近游戏更新 未整理 无图片 续3
  7. 流程图绘制软件 Dia
  8. 终端使用sopcast例子
  9. linux不显示无线网卡驱动安装失败,无线网卡在Linux下安装
  10. 高通源代码 Ubuntu14.04下载编译Android(1)