MySQL读写分离

article/2025/9/25 7:10:59

目录

一、读写分离

1. 工作原理

2.为什么要读写分离 

3.什么时候要读写分离 

4.主从复制与读写分离 

5.mysql支持的复制类型 

二、MySQL 读写分离方式 

1.基于程序代码内部实现 

2.基于中间代理层实现 

三、实验:读写分离(主从复制基础上)

1 安装 Java 环境

 2.配置 Amoeba读写分离,两个 Slave 读负载均衡

3.amoeba服务器配置amoeba服务 

修改数据库配置文件 

4.测试读写分离  

4.1主服务器上 

4.2 关闭两个从服务器同步

4.3在两个从服务器分别加数据

4.4在主服务器加数据

 4.5查看客户端服务器

四、数据库主从延迟的原因与解决方案 

1.主从延迟是怎样定义的呢?与主从数据同步相关的时间点有三个 

2.导致主从延迟的原因

3.同步失败解决方案


一、读写分离

1. 工作原理

基本的原理是让主数据库处理事务性增、删、改操作(INSERT、DELETE、UPDATE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

2.为什么要读写分离 

  • 面对越来越大的访问压力,单台的服务器性能成为瓶颈,需要分担负载。
  • 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。
  • 但是数据库的“读”(读10000条数据可能只要5秒钟)。
  • 所以读写分离,解决的是,数据库的写入,影响了查询的效率。

3.什么时候要读写分离 

数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。 

4.主从复制与读写分离 

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。

因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

5.mysql支持的复制类型 

  • STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。
  • ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
  • MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

二、MySQL 读写分离方式 

读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性操作,而从数据库处理 select 查询。数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。目前较为常见的 MySQL 读写分离分为以下两种 

1.基于程序代码内部实现 

在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

2.基于中间代理层实现 

代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。

  • MySQL-Proxy:MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。
  • Atlas:是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
  • Amoeba:由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。

三、实验:读写分离(主从复制基础上)

1 安装 Java 环境

amobea 服务器IP为192.168.169.202(在主从复制的基础上进行读写分离)

因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,
高版本不建议使用。将jdk-6u14-linux-x64.bin 和 amoeba-mysql-binary-2.2.0.tar.gz.0 
上传到/opt目录下。cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin 
./jdk-6u14-linux-x64.bin
按空格到最后一行,按yes,按回车。mv jdk1.6.0_14/ /usr/local/jdk1.6vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
#在末尾加入source /etc/profile
java -version##安装 Amoeba软件##
mkdir /usr/local/amoeba
tar zxvf /opt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
//如显示amoeba start|stop 说明安装成功

 2.配置 Amoeba读写分离,两个 Slave 读负载均衡

在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问 

grant all on *.* to test@'192.168.169.%' identified by '123456';

3.amoeba服务器配置amoeba服务 

cd /usr/local/amoeba/conf/cp amoeba.xml amoeba.xml.bakvim amoeba.xml                  
#修改amoeba配置文件30修改
<property name="user">amoeba</property>32修改
<property name="password">123456</property>115修改
<property name="defaultPool">master</property>117去掉注释–
<property name="writePool">master</property>
<property name="readPool">slaves</property>

 

修改数据库配置文件 

cp dbServers.xml dbServers.xml.bakvim dbServers.xml               
#修改数据库配置文件23注释掉
作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- mysql schema 
<property name="schema">test</property>
-->26修改
<!-- mysql user -->
<property name="user">test</property>28-30去掉注释
<property name="password">123456</property>45修改,设置主服务器的名Master
<dbServer name="master"  parent="abstractServer">48修改,设置主服务器的地址
<property name="ipAddress">192.168.223.10</property>52修改,设置从服务器的名slave1
<dbServer name="slave1"  parent="abstractServer">55修改,设置从服务器1的地址
<property name="ipAddress">192.168.223.9</property>58复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2"  parent="abstractServer">
<property name="ipAddress">192.168.223.11</property>65修改
<dbServer name="slaves" virtual="true">71修改
<property name="poolNames">slave1,slave2</property>/usr/local/amoeba/bin/amoeba start&         
#启动Amoeba软件,按ctrl+c 返回netstat -anpt | grep java             
#查看8066端口是否开启,默认端口为TCP 8066

 

4.测试读写分离  

在客户端(192.168.169.200)服务器上进行测试:

使用yum快速安装MySQL虚拟客户端

yum install -y mariadb mariadb-servermysql -u amoeba -p123456 -h 192.168.169.201 -P8066   

 通过amoeba服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从服务器

4.1主服务器上 

create database zzz;use zzz;
create table ceshi (id int(10),name varchar(10),address varchar(10));

4.2 关闭两个从服务器同步

stop slave;                     
#关闭同步use zzz;

4.3在两个从服务器分别加数据

4.4在主服务器加数据

 4.5查看客户端服务器

use zzz;
select * from test;   
客户端会分别向slave1和slave2读取数据,显示的只有在
两个从服务器上添加的数据,没有在主服务器上添加的数据insert into test values('4','zb','four');   
只有主服务器上有此数据

 

之后在两个从服务器上执行 start slave; 即可实现同步在主服务器和客户机上添加的数据

start slave;

四、数据库主从延迟的原因与解决方案 

1.主从延迟是怎样定义的呢?与主从数据同步相关的时间点有三个 

  • 主库执行完一个事务,写入binlog,我们把这个时刻记为 T1;
  • 主库同步数据给从库,从库接受完这个binlog的时刻,记录为 T2
  • 从库执行完这个事务,这个时刻记录为 T3

所谓主从延迟,其实就是指同一个事务,在从库执行完的时间和在主库执行完的时间差值,即 T3-T1

2.导致主从延迟的原因

  • 如果从库所在的机器比主库的机器性能差,会导致主从延迟,这种情况比较好解决,只需选择主从库一样规格的机器就好。
  • 如果从库的压力大,也会导致主从延迟。比如主库直接影响业务,大家可能使用会比较克制,因此一般查询都打到从库了,结果导致从库查询消耗大量CPU,影响同步速度,最后导致主从延迟。这种情况的话,可以搞一主多从架构,即多接几个从库分摊读的压力。另外,还可以把binlog接入到Hadoop这类系统,让它们提供查询的能力。
  • 大事务也会导致主从延迟。如果一个事务执行就要10分钟,那么主库执行完后,给到从库执行,最后这个事务可能就会导致从库延迟10分钟啦。日常开发中,我们为什么特别强调,不要一次性delete太多SQL,需要分批进行,其实也是为了避免大事务。另外,大表的DDL语句,也会导致大事务,大家日常开发关注一下哈。
  • 网络延迟也会导致主从延迟,这种情况你只能优化你的网络啦,比如带宽20M升级到100M类似意思等。
  • 如果从数据库过多也会导致主从延迟,因此要避免复制的从节点数量过多。从库数据一般以3-5个为宜。
  • 低版本的MySQL只支持单线程复制,如果主库并发高,来不及传送到从库,就会导致延迟。可以换用更高版本的Mysql,可以支持多线程复制。

3.同步失败解决方案

#忽略当前的错误执行下一步的同步

先 stop slave;

① slave数据库中:SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

START SLAVE;

问题:I/O线程 一直处于connecting

第一件事,看laster error,报错项内容是为支点找不到

先 stop slave;

② slave数据库中:

CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000001’,MASTER_LOG_POS=0;

首先遇到这个是因为binlog位置索引处的问题,生产环境下不要直接reset slave(删除change master 操作的);

reset slave会将主从同步的文件以及位置恢复到初始状态,一开始没有数据还好,有数据的话,相当于重新开始同步,可能会出现一些问题;

一般做主从同步,都是要求以后的数据实现主从同步,而对于旧的数据完全可以使用数据库同步工具先将数据库同步,完了再进行主从同步;

好了遇到上面的问题,正确做法是:

1.打开主(master)服务器,进入mysql

2.执行flush logs;//这时主服务器会重新创建一个binlog文件;

3.在主服务上执行show master status\G;显示如下:

4.来到从服务器的mysql;

5.stop slave;

6.change master to master_log_file='mysql-bin.000012',master_log_pos=154;//这里的file和pos都是上面主服务器master显示的。

7.start slave; //这时候就应可以了


http://chatgpt.dhexx.cn/article/9WCbeqpJ.shtml

相关文章

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

如何使用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、首先是从…