mysql-读写分离

article/2025/9/25 4:31:29

1.什么是读写分离

 在数据库集群架构中,让主库负责处理写入操作,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。当然,主数据库另外一个功能就是负责将数据变更同步到从库中,也就是写操作。

2. 读写分离的好处

1. 分摊服务器压力,提高机器的系统处理效率
2. 在写入不变,大大分摊了读取,提高了系统性能。另外,当读取被分摊后,又间接提高了写入的性能。所以,总体性能提高了。
3. 增加冗余,提高服务可用性,当一台数据库服务器宕机后可以调整另外一台从库以最快速度恢复服务

Mycat 数据库中间件

Mycat 是一个开源的数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的数据库系统。 那么 Mycat 是什么?Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服 务是实现对主从数据库的读写分离、读的负载均衡。

常见的数据库中间件:

 

MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。

 准备一台新的主机放到master的前面做代理
 192.168.246.133  mysql-mycat
 并将三台机器互做本地解析

架构

这里是在mysql主从复制实现的基础上,利用mycat做读写分离,架构图如下

 

部署环境:

安装jdk

 下载jdk账号:
账号:liwei@xiaostudy.com
密码:OracleTest1234
将jdk上传到服务器中,
[root@mycat ~]# tar xzf jdk-8u221-linux-x64.tar.gz -C /usr/local/
[root@mycat ~]# cd /usr/local/
[root@mycat local]# mv jdk1.8.0_221/ java 
设置环境变量
[root@mycat local]# vim /etc/profile  #添加如下内容,
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
[root@mycat local]# source /etc/profile
 java -version  启动
 java version "1.8.0_211" 启动成功显示
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

部署mycat

 

 下载
[root@mycat ~]# wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
解压
[root@mycat ~]# tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/

配置mycat

认识配置文件

MyCAT 目前主要通过配置文件的方式来定义逻辑库和相关配置:

/usr/local/mycat/conf/server.xml  #定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。
/usr/local/mycat/conf/schema.xml  #定义逻辑库,表、分片节点等内容。

配置server.xml

以下为代码片段

下面的用户和密码是应用程序连接到 MyCat 使用的,可以自定义配置

而其中的schemas 配置项所对应的值是逻辑数据库的名字,也可以自定义,但是这个名字需要和后面 schema.xml 文件中配置的一致。

[root@mycat ~]# cd /usr/local/mycat/conf/
[root@mycat conf]# vim server.xml
...
  <!--下面的用户和密码是应用程序连接到 MyCat 使用的.schemas 配置项所对应的值是逻辑数据库的名字,这个名字需要和后面 schema.xml 文件中配置的一致。-->      

        <user name="root">
                <property name="password">Qf@12345!</property>
                <property name="schemas">testdb</property>

                <!-- 表级 DML 权限设置 -->
                <!--            
                <privileges check="false">
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>           
                 -->
        </user>
        <!--
<!--下面是另一个用户,并且设置的访问 TESTED 逻辑数据库的权限是 只读。可以注释掉
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
        </user>
         -->
</mycat:server>

== 上面的配置中,假如配置了用户访问的逻辑库,那么必须在 schema.xml 文件中也配置这个逻辑库,否则报错,启动 mycat 失败 ==

飞哥特意更换的配置:

 

配置schema.xml

以下是配置文件中的每个部分的配置块儿

逻辑库和分表设置

<schema name="testdb"                  // 逻辑库名称,与server.xml的一致
        checkSQLschema="false"       // 不检查sql
        sqlMaxLimit="100"                  // 最大连接数
        dataNode="dn1">                  //  数据节点名称
<!--这里定义的是分表的信息-->        
</schema>

数据节点

<dataNode name="dn1"               // 此数据节点的名称
          dataHost="localhost1"       // 主机组虚拟的
          database="testdb" />        // 真实的数据库名称

主机组

<dataHost name="localhost1"                             // 主机组
          maxCon="1000" minCon="10"                  // 连接
          balance="0"                                              // 负载均衡 
          writeType="0"                                           // 写模式配置
          dbType="mysql" dbDriver="native"         // 数据库配置
          switchType="1"  slaveThreshold="100">
<!--这里可以配置关于这个主机组的成员信息,和针对这些主机的健康检查语句-->
</dataHost>

balance 属性
负载均衡类型,目前的取值有 3 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1", 全部的 readHost 与  writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
3. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
4. balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力, #注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType 属性
负载均衡类型
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切换到还生存的第二个writeHost,重新启动后已切换后的为准.
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,#版本1.5 以后废弃不推荐。

健康检查

<heartbeat>select user()</heartbeat>    #对后端数据进行检测,执行一个sql语句,user()内部函数

读写配置

<writeHost host="hostM1" url="192.168.246.135:3306" user="mycat" password="Qf@12345!">
                        <!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.246.136:3306" user="mycat" password="Qf@12345!" />
</writeHost>

 

以下是组合为完整的配置文件,适用于一主一从的架构

 在真实的 master 数据库上给用户授权

mysql> grant all on testdb.* to mycat@'%' identified by 'Qf@456789';
mysql> flush privileges;

在mycat的机器上面测试mycat用户登录:

安装mysql的客户端:
# yum install -y mysql

# mysql -umycat -p'Qf@456789' -h mysql-master

启动Mycat

启动之前需要调整JVM

在wrapper.conf中添加 
[root@mycat mycat]# cd conf/
[root@mycat conf]# vim wrapper.conf  #在设置JVM哪里添加如下内容
wrapper.startup.timeout=300 //超时时间300秒 
wrapper.ping.timeout=120
启动:
[root@mycat conf]# /usr/local/mycat/bin/mycat start     #需要稍微等待一会
Starting Mycat-server...
[root@mycat ~]# jps   #查看mycat是否启动
13377 WrapperSimpleApp
13431 Jps
[root@mycat ~]# netstat -lntp | grep java
#服务起不来 查看 vim /usr/local/mycat/conf/wrapper.conf 
#注释掉29行的 内容,以为29行的内容限制了大小所以无法启动

 测试mycat

将master当做mycat的客户端
[root@mysql-master ~]# mysql -uroot -h mysql-mycat -p'Qf@456789' -P 8066

 

 

 

如果在show table报错:

mysql> show tables;
ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0

解决方式:
登录master服务将mycat的登录修改为%
mysql> update user set Host = '%' where User = 'mycat' and Host = 'localhost';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
或者在授权用户mycat权限为*.*

 


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

相关文章

MySQL数据库:读写分离

一、读写分离的原理&#xff1a; 1、实现原理&#xff1a; 读写分离解决的是&#xff0c;数据库的写操作&#xff0c;影响了查询的效率&#xff0c;适用于读远大于写的场景。读写分离的实现基础是主从复制&#xff0c;主数据库利用主从复制将自身数据的改变同步到从数据库集群…

Mysql 读写分离

一、介绍 1.什么是读写分离 读写分离的基本原理是将数据库读和写操作分散到不同的节点上。Mysql 的读写分离需要建立在主从复制基础之上&#xff0c;Master 数据库处理事务性增、改、删操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;而 Slave 数据库处理SE…

MySQL读写分离

目录 一、读写分离 1. 工作原理 2.为什么要读写分离 3.什么时候要读写分离 4.主从复制与读写分离 5.mysql支持的复制类型 二、MySQL 读写分离方式 1.基于程序代码内部实现 2.基于中间代理层实现 三、实验&#xff1a;读写分离&#xff08;主从复制基础上&…

Mysql读写分离的四种方案

一、读写分离介绍 1、做读写分离的原因 数据库写入效率要低于读取效率&#xff0c;一般系统中数据读取频率高于写入频率&#xff0c;单个数据库实例在写入的时候会影响读取性能&#xff0c;这是做读写分离的原因。 2、MySQL读写分离的基础 实现方式主要基于mysql的主从复制&…

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、从文件…