Mysql读写分离的四种方案

article/2025/9/25 7:12:45

一、读写分离介绍

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/

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.1</version>
</dependency>

三、最后总结

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


http://chatgpt.dhexx.cn/article/MSV0mbsE.shtml

相关文章

JMETER接口测试_用户登录(MD5加密)

JMETER接口测试—— 用户登录&#xff08;密码MD5加密) 1)给整个线程组&#xff0c;添加全局变量 TestPlan–>线程组–>右键–>ADD Config Element -->User Defined Variables。 全局变量的意思&#xff1a;整个线程中&#xff0c;该变量设定的值&#xff0c;所有…

Jmeter接口测试之常用断言

在接口测试中&#xff0c;我们需要检查请求处理结果是否正确。当请求的响应状态码为200&#xff0c;是否表时接口功能正常呢&#xff1f;显然是不正确的。 响应状态为200&#xff0c;只能表明服务处理了你的请求&#xff0c;同时进行了结果返回&#xff1b;但并不能代表处理的…

jmeter接口测试传参问题汇总

1、 在Jmeter接口测试json传参时&#xff0c;number类型的参数不能为空&#xff0c;例如&#xff1a; {title: "测试标题"&#xff0c;languageTypeId: ,content: "测试内容"}当这样数字类型传参为空时&#xff0c;jmeter就会报错如下&#xff1a; {&quo…

Jmeter接口测试之响应断言

一、断言是什么 1. 断言的作用 断言用于对采样器执行结果的检查&#xff0c;并在同一范围内的每个采样器之后进行处理。如果要对某个采样器进行断言&#xff0c;直接将断言添加到采样器的子集即可。 2. 为什么要用断言&#xff1f; JMeter以及Postman等接口测试工具&#xff…

用户认证授权---Jmeter接口测试

用户根据用户名&#xff0c;密码&#xff0c;验证码登录系统。要测试系统登录接口及查看用户所受权限&#xff0c;首先测试获取验证码接口&#xff0c;获取验证码&#xff0c;再测试登录接口&#xff0c;最后进行权限接口测试。 一、获取验证码 将返回信息中img通过data:image…

jmeter 接口测试快速入门

jmeter是一款小巧&#xff0c;轻便、开源的性能测试工具&#xff0c;它也可以很方便的进行接口测试。 下面我就带大家学习下jmeter接口测试。 目录 1.准备工作&#xff1a; 2.第一个接口测试走起&#xff01; 3.再来一个稍微复杂一点的接口——获取短信验证码接口&#xf…

JMeter接口测试___参数化方法

一、JMeter添加参数的常用方法 1.Get请求 2.Post请求二、JMeter常用参数化的方式 1.用户参数&#xff08;User Parameter&#xff09; 2.用户自定的变量&#xff08;User Defined Variables&#xff09; 3.CSV数据文件设置&#xff08;CSV Data Set C…

Jmeter 接口测试中的签名处理

签名机制&#xff1a;服务端接口为了防止非法请求&#xff0c;要求接口的入参需要传入一个签名字段sign&#xff0c;签名字段是按照一定的规则对接口的业务参数进行加密后得到的。在测试此类接口时&#xff0c;必须传入业务数据&#xff0c;和对应的签名数据&#xff0c;才能正…

jmeter接口测试教程以及接口测试流程详解

一、Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试。 Jmeter具备高移植性&#xff0c;可以实现跨平台运行。 Jmeter可以实现分布式负载。 Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过独…

jmeter接口测试教程

在日常工作中&#xff0c;尤其是做接口测试时&#xff0c;我们最经常用到的两个工具&#xff0c;就是Jmeter和postman。今天&#xff0c;我们主要是讲一讲Jmeter在接口测试这一块的一些方式方法。内容比较多&#xff0c;大家可以收藏一下&#xff0c;以后慢慢学。 1&#xff0…

JMeter接口测试及接口登陆压力测试

脚本&#xff1a; https://mp.csdn.net/mp_download/manage/download/UpDetailed 1.JMeter接口测试 查看别的博主内容时发现了个开放的API&#xff0c;可以作为练习使用 https://wanandroid.com/blog/show/2 jmeter基本操作 操作步骤 1.启动jmeter 2.在"测试计划&…

Jmeter接口测试-获取token

相信大家都知道在开展接口测试或者是接口面试的过程中&#xff0c;我们会发现很多接口需要依赖前面的接口&#xff0c;需要我们动态从前面的接口返回中提取数据&#xff0c;也就是我们通常说的关联。关联通俗来讲就是把上一次请求的返回内容中的部分截取出来保存为参数&#xf…

8、jmeter接口测试教程(简单案例)

以登录、查询接口为案例 注意&#xff1a; 1、如果找不到接口&#xff0c;可以通过F12进行抓包&#xff0c; 具体步骤如下&#xff1a; &#xff08;1&#xff09;选择任意浏览器&#xff08;模式选择谷歌内核即可&#xff09;&#xff1b; &#xff08;2&#xff09;按F12键&a…

Jmeter接口测试流程详解

1、jmeter简介 Jmeter是由Apache公司开发的java开源项目&#xff0c;所以想要使用它必须基于java环境才可以&#xff1b; Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过独立的线程对不同的功能同时取样。 2、jmeter安装 首先需要安装jdk&#xff08;最好是最…

全网最细节的jmeter接口测试教程以及接口测试流程详解

文章目录 一、Jmeter简介 二、Jmeter安装 三、设置Jmeter语言为中文环境 四、Jmeter主要元件 五、Jmeter元件的作用域和执行顺序 六、Jmeter进行接口测试流程 七、Jmeter进行接口测试流程步骤详解 八、Jmeter接口测试必定用到的扩展阅读 一、Jmeter简介 Jmeter是由Apa…

Jmeter接口测试——使用教程(上)

目录 前言 一、Jmeter简介 二、Jmeter-http接口脚本 Jmeter-http接口脚本添加header&#xff1a; Jmeter-http接口脚本添加cookie&#xff1a; 三、Jmeter-webservice脚本 四、Jmeter-参数化 1、Jmeter参数化的方式有三种 2、用户定义的变量 3、函数生成器 4、从文件…

如何使用jmeter进行接口测试?jmeter接口测试流程是怎样的

前言 我们学习自动化测试都会用到不同的工具&#xff0c;那么今天笔者呢&#xff0c;想给大家聊聊Jmeter接口测试流程详解&#xff0c;废话不多说直接进入正题。 一、jmeter简介 Jmeter是由Apache公司开发的java开源项目&#xff0c;所以想要使用它必须基于java环境才可以&am…

JMeter接口测试___接口关联

前言一、什么是接口关联&#xff1f;二、JMeter关联方法&#xff1a; 1.正则表达式提取器2.Json Extractor提取器3.边界值提取器总结 前言 关联的概念&#xff1a; 关联也称为串行参数或数据依赖。 在开展接口测试的过程中&#xff0c;我们会发现很…

jmeter接口测试详细教程

jmeter接口测试详细教程 jmeter接口测试-总结 1、你们公司的接口测试流程是怎样的&#xff1f;&#xff08;有没有感觉熟悉&#xff0c;貌似在哪里听过&#xff09; 接口测试我们是在XX项目做的&#xff0c;主要有XX接口&#xff0c;XX接口&#xff0c;XX接口等。 1、首先是从…

jmeter接口测试流程

目录 一、添加线程组 二、添加HTTP请求默认值 三、添加HTTP Cookie管理器 四、添加http请求 五、添加HTTP信息头管理器 六、添加响应断言 七、添加察看结果树 八、jmeter快捷键 一、添加线程组 鼠标右键点击“测试计划-->添加-->线程组&#xff08;用户&#x…