mysql读写分离

news2024/12/22 22:38:10

MySQL读写分离

原理

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

读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库
在这里插入图片描述

为什么要进行读写分离

因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的;

但是数据库的“读”(读10000条数据可能只要5秒钟);

所以读写分离,解决的是,数据库的写入,影响了查询的效率

常见的MySQL读写分离

基于程序代码内部实现

在代码中根据select、 insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。

优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手

但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

基于中间代理层实现

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

(1)MySQL-Proxy。 MySQL-Proxy 为MySQL开源项目,通过其自带的lua脚本进行SQL判断。

(2) Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。

360内部使用Atlas运行的mysq1业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。

(3) Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支事务和存储过程。

由于使用MySQL Proxy 需要写大量的Lua脚木,这些Lua并不是现成的,而是需要自己去写。这对于并不熟悉MySQL Proxy内置变量和MySQLProtocol的人来说是非常困难的

Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层

搭建MySQL读写分离

环境准备

Master 服务器: 192.168.142.10 mysql5.7

Slave1 服务器: 192.168.142.20 mysql5.7

Slave2 服务器: 192.168.142.30 mysql5.7

Amoeba 服务器:192.168.142.40 JDK1.6、Amoeba

Amoeba服务器设置

安装Java 环境
因为Amoeba基于是jdk1.5 开发的,所以官方推荐使用jdk1.5 或1.6版本,高版本不建议使用。

cd /opt/
cp jdk-6u14-1inux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64
./jdk-6u14-linux-x64.bin
//按yes,按enter

mv jdk1.6.0_14/ /usr/local/jdk1.6

vim /etc/profile.d/java.sh
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.d/java.sh
java -version

按enter后会出现一个弹窗,点击是
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

安装Amoeba软件

mkdir /usr/local/amoeba
tar zxvf 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说明安装成功

在这里插入图片描述
在这里插入图片描述

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

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

grant all on *.* to 'test'@'192.168.142.%' identified by '123';

在这里插入图片描述

再回到amoeba服务器配置amoeba服务

cd /usr/local/amoeba/conf/

cp amoeba.xml amoeba.xml.bak
vim 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.bak
vim dbServers.xml  #修改数据库配置文件
--23--注释掉 作用:默认进入test库 以防mysq1中没有test库时, 会报错
<!-- <property name= "schema">test</property> -->
--26--修改
<property name="user">test</property>
--28-30--去掉注释,然后再把28行注释或删除
<property name="password"> 1234</property>
--45--修改, 设置主服务器的名Master
<dbServer name="master" parent="abstractServer">
--48--修改,设置主服务器的地址
<property name="ipAddress">192.168.142.10</property>
--52--修改, 设置从服务器的名slave1
<dbServer name="slave1" parent="abstractServer">
--55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.142.20</property>
--58--复制.上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.142.30</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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试读写分离

在amoeba下载安装
yum install -y mariadb-server mariadb
systemctl start mariadb.service

在客户端服务器上测试:
mysql -u amoeba -p123 -h 192.168.142.40 -P8066
//通过amoeba服务器代理访问mysql,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从--从服务器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从以上截图中可以明显的看到 master只能写不能读,因为它读不到slave插入的内容,只能在amoeba上查看到,所以测试是成功的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/67230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自学前端到什么程度,可以去找工作呢?

前言 可以看看现在市面上关于前端工程师职业招聘的相关要求&#xff0c;从以下两个的招聘可以看出&#xff0c;无论是普通的前端构造工程师还是高级前端开发工程师&#xff0c;对于h5、css3、es6以及相关框架如vue、react等都需要有深入的认知并能熟练运用 基于上面的相关要求…

刷爆力扣之第三大的数

刷爆力扣之第三大的数 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#xff0c;每…

(四)Spring Security Oauth2.0 源码分析--客户端端鉴权(token校验)

一 引言 在上篇文章我们分析了token的获取过程,那么拿到token后,将token放在请求头中进行资源的访问,客户端是如如何对token进行解析的呢,本文带你走进token校验的源码解析,基本流程如下所示 客户端向资源服务器发起请求时,在请求头Authorization携带申请的token请求被Filte…

网络编程——BIO与NIO介绍与底层原理

BIO BIO(Blocking IO) 又称同步阻塞IO&#xff0c;一个客户端由一个线程来进行处理 当客户端建立连接后&#xff0c;服务端会开辟线程用来与客户端进行连接。以下两种情况会造成IO阻塞&#xff1a; 服务端会一直阻塞&#xff0c;直到和客户端进行连接客户端也会一直阻塞&…

CPP 核心编程9-STL

STL初识 2.1 STL的诞生 长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西C的面向对象和泛型编程思想&#xff0c;目的就是复用性的提升大多情况下&#xff0c;数据结构和算法都未能有一套标准,导致被迫从事大量重复工作为了建立数据结构和算法的一套标准,诞生了S…

四、文件管理(二)目录

目录 2.0文件控制块和索引结点 2.1目录的结构 2.1.1单级目录结构 2.1.2两级目录结构 2.1.3树形目录结构 2.1.4有向无环图目录结构 2.2目录的操作 2.4文件共享 2.4.1基于索引结点&#xff08;硬链接&#xff09; 2.4.2基于符号链&#xff08;软链接&#xff09; 2.0文…

前端开发是做什么的?工作职责

想要了解前端从业者的工作职责&#xff0c;需要从一个完整网站应用产生流程入手&#xff0c;一个网站应用从无到有的过程大致如下 &#xff1a; 1&#xff09;产品经理与甲方反复沟通交流&#xff0c;逐步确定产品需求完成设计草图&#xff1b; 2&#xff09;产品经理根据需求…

如何在centos上安装nvidia docker

当基于nvidia gpu开发的docker镜像在实际部署时&#xff0c;需要先安装nvidia docker。那么如何安装nvidia docker呢。下面将详细介绍下。 安装原生docker yum -y install docker-io 下载nvidia docker安装包 我下载的是rpm文件&#xff0c;具体见截图 安装nvidia docker…

word如何给论文加引用文献

给论文加引用文献其实差不多就是加了个链接&#xff0c;通过点击链接跳转到文末最后展示引用文献额作者&#xff0c;论文名等等信息&#xff0c;给论文加引用文献只要有一下几步&#xff1a; 一、设置参考文献标号字体格式 对于论文中的文献&#xff0c;首先设置论文前序号的…

redis基础6——缓存穿透、缓存击穿、缓存雪崩

文章目录一、缓存穿透&#xff08;双库为空&#xff09;1.1 基础概念1.2 解决办法1.2.1 业务层校验1.2.2 设置key过期时间1.2.3 布隆过滤器1.2.3.1 原理1.2.3.1.1 哈希函数使用1.2.3.1.2 布隆过滤器数据结构1.2.3.1.2.1 映射函数执行过程1.2.3.1.2.2 布隆过滤器的误判率1.2.3.2…

华为机试 - 最大化控制资源成本

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 公司创新实验室正在研究如何最小化资源成本&#xff0c;最大化资源利用率&#xff0c;请你设计算法帮他们解决一个任务混部问题&#xff1a; 有taskNum项任务&#xff0c;每个任务有开始时间&#xf…

数字图像处理实验(一)|图像的基本操作和基本统计指标计算

文章目录一、实验目的二、实验主要仪器设备三、实验原理(1)将一幅图像视为一个二维矩阵。(2)利用MATLAB图像处理工具箱读、写和显示图像文件。(3)计算图像的有关统计参数。(4)改变图像尺寸、旋转图像、裁剪图像四、实验内容(1)用imwrite写入图像(2) 用imread读入一幅图像(自选)…

opencv c++ 图像形态学操作

1、图像的形态学操作 包括图像的腐蚀、膨胀、开、闭、形态学梯度、顶帽、黑帽、分支主题、结构元素等操作。 具体概念参考&#xff1a;(41条消息) 图像处理-形态学处理_Gooddz的博客-CSDN博客_图像处理 形态学 1.1、膨胀 用33的核去扫描二值图像&#xff0c;当核与图像中的前景…

[附源码]JAVA毕业设计仟侬堂茶具网站(系统+LW)

[附源码]JAVA毕业设计仟侬堂茶具网站&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&a…

LeetCode中等题之查找和替换模式

题目 你有一个单词列表 words 和一个模式 pattern&#xff0c;你想知道 words 中的哪些单词与模式匹配。 如果存在字母的排列 p &#xff0c;使得将模式中的每个字母 x 替换为 p(x) 之后&#xff0c;我们就得到了所需的单词&#xff0c;那么单词与模式是匹配的。 &#xff0…

Git(第二篇)——Git的常见操作

Git&#xff08;第二篇&#xff09;——Git的常见操作 目录Git&#xff08;第二篇&#xff09;——Git的常见操作一、Git版本控制介绍组成结构图命令速查常用命令二、下载并安装GIT设置字体查询git三、码云上的操作码云配置环境注册账号登录码云创建仓库创建远程仓库(在码云官网…

通讯录管理系统

目录 1.系统需求 2.创建项目 3.菜单功能 4.退出功能 5.添加联系人 5.1设计联系人结构体、设计通讯录结构体 5.2main函数中创建通讯录 5.3封装添加联系人函数 5.4测试添加联系人 6.显示联系人 7.删除联系人 7.1封装检测联系人是否存在 7.2删除联系人&#xff0c;测试删除联…

当我们的执行 java -jar xxx.jar 的时候底层到底做了什么?

大家都知道我们常用的 SpringBoot 项目最终在线上运行的时候都是通过启动 java -jar xxx.jar 命令来运行的。 那你有没有想过一个问题&#xff0c;那就是当我们执行 java -jar 命令后&#xff0c;到底底层做了什么就启动了我们的 SpringBoot 应用呢&#xff1f; 或者说一个 S…

Redux使用详解(一) Redux的核心思想与基本使用

Redux 理解javascript纯函数 函数式编程中有一个非常重要的概念叫纯函数&#xff0c;JavaScript符合函数式编程的范式&#xff0c;所以也有纯函数的概念&#xff1b; 在react开发中纯函数是被多次提及的&#xff1b; 比如react中组件就被要求像是一个纯函数&#xff08;为什么…

使用STM32F103C8T自制freejoy控制板

1. 软件准备 1.1 STM公司的官方工具&#xff1a; STM32 ST-LINK Utility 已经更名为 STM32CubeProgrammer STSW-LINK004 - STM32 ST-LINK utility (replaced by STM32CubeProgrammer) - STMicroelectronics 1.2 FreeJoyConfiguratorQt V1.7.1 这个是刷好固件后的配置、调…