mysql(六)读写分离

news/2024/4/27 22:37:34/文章来源:https://blog.csdn.net/2302_78534730/article/details/131994383

目录

前言

一、概述

二、配置JAVA环境及安装阿米巴

三、配置阿米巴

 四、测试

总结



前言

MySQL读写分离是一种常见的数据库架构设计模式,旨在提高系统的性能和可用性。它通过将读操作和写操作分离到不同的MySQL实例上来实现。

读写分离的原理是:

1. 主服务器(Master):负责处理所有的写操作(如INSERT、UPDATE、DELETE),保持数据的一致性。
2. 从服务器(Slaves):负责处理所有的读操作(如SELECT),提供数据的查询服务。

具体实施读写分离主要包括以下步骤:

1. 配置主服务器:将所有写操作指向主服务器,确保主服务器是可写的。
2. 配置从服务器:将所有读操作指向从服务器,确保从服务器是只读的。
3. 同步数据:将主服务器上的数据同步到所有从服务器上,以保持数据的一致性。
4. 负载均衡:使用负载均衡器或代理服务器来分发读请求到多个从服务器,以提高读的性能和可伸缩性。
5. 监控与自动切换:监控主服务器的状态,如主机故障或网络故障,自动切换到另一个主服务器。

读写分离的好处包括:

1. 提高读的性能:通过将读操作分发到多个从服务器上,可以减轻主服务器的读压力,提高整体的读取性能。
2. 提高可用性:当主服务器发生故障时,可以快速切换到其他从服务器,保证系统的正常运行。
3. 分担主服务器的负载:将读操作分担到从服务器上,可以让主服务器更集中地处理写操作,从而提高整体的系统性能。

需要注意的是,读写分离不是完美的解决方案,它也存在一些局限性和挑战,例如数据同步延迟、数据一致性问题、复杂的配置和维护等。因此,在设计和实施读写分离时,需要根据具体的应用场景和业务需求进行综合考量和权衡。


一、概述

在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是安全性,高可用还是并发等各个方面都不能完全满足实际需求的,因此一般来说都是通过主从复制的方式来同步数据,再通过读写分离来提供数据的高并发负载能力这样的方案来进行部署。

简单来说,读写分离就是只在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性查询,而从数据库处理select查询,数据库复制被用来把事务性查询导致的改变更新同步到集群中的从数据库。

目前最常见的MySQL读写分离方案有两种:

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

在代码中根据select,insert进行路由分类,这类方法也是目前大型生产环境应用最广泛的,优点是性能最好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手

  1. 基于中间代理层实现

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

(1)mysql-proxy为mysql开发早期开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境。

(2)Amoeba(变形虫)该程序由java语言及逆行开发,阿里巴巴将其应用于生产环境,它不支持事物和存储过程。

Amoeba(变形虫)项目开源框架于2008年发布一款Amoeba for mysql软件,这个软件致力于mysql的分布式数据库前端代理层,主要为应用层访问mysql的时候充当SQL路由功能,并具有负载均衡,高可用性,SQL过滤,读写分离,可路由到相关的目标数据库,可并发请求多台数据库,通过Amoeba能够完成多数据源的高可用,负载均衡,数据切片的功能,目前Amoeba已经在很多企业的生产线上使用。

二、配置JAVA环境及安装阿米巴

Java环境下载地址(仅供参考)Java Archive Downloads - Java SE 6

amoeba 下载地址(仅供参考)amoeba - Browse Files at SourceForge.net

1、在主机Amoeba上安装java环境。因为Amoeba是基于jdk1.5版本开发的,所以官方推荐使用1.5或者1.6版本,高版本不建议使用。

我这有个Java环境,我们查看下,发现不符合阿米巴的使用要求,我们给它删除

重新配置我们的Java环境,事先准备好的Java环境拖入终端,按照提示配置


 把Java环境放到/usr/local

2.把准备好的阿米巴拖入终端安装并解压到/usr/local/amoeba

赋予阿米巴权限chmod -R 755 /usr/local/amoeba/

 

 3.配置环境变量

chmod +x jdk-6u31-linux-x64.bin   

 ./jdk-6u31-linux-x64.bin

 改个名字方便我们后续操作

 修改配置文件vim /etc/profile配置Java和阿米巴的全局变量,在文末插入:

export JAVA_HOME=/usr/local/jdk1.6

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$PATH:$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$HOME/bin

export AMOEBA_HOME=/usr/local/amoeba

export PATH=$PATH:$AMOEBA_HOME/bin

 保存退出刷新配置使之生效source /etc/profile,随后验证我们的Java环境java -version

 好的Java版本符合amoeba的使用要求

三、配置阿米巴

要求:配置amoeba读写分离,两个slave读负载均衡(在这里我基于上篇博客中的mysql主从进行)

1.在master、slave1、slave2上分别配置amoeba的访问权限,例如:

 2.编辑amoeba的配置文件amoeba.xml

vim /usr/local/amoeba/conf/amoeba.xml需要修改的位置如下:

 3.编辑amoeba的配置文件dbSeryer.xml

vim /usr/local/amoeba/conf/dbServers.xml需要修改如下位置:

4. 配置无误后,启动Amoeba软件,默认端口是TCP协议8066

后台启动/usr/local/amoeba/bin/amoeba start &

  查看netstat -lnpt | grep 8066

 四、测试(读写分离、负载均衡)

1.在客户机机1上安装mysql mysql-server,通过代理访问mysql注意:此处的IP是阿米巴的IP,账户密码则是我们之前在配置文件中设置的

输入mysql -ameoba -p123456.Com -p 192.168.73.5 -P 8006

 验证的步骤就是在master上创建一个列表,master会把表同步到slave上,然后就是关闭slave的功能,通过插入内容来验证。

2.主服务器上创建一个hello的库,在库中建一个student的表

 

 分别在两台slave中查看是否有表student,随后关闭slave服务:

slave1中

 slave2中:

 3.分别在master、slave的student表中插入数据

master中:

 slave1中:

 slave2中:

 3.在客户机上进行查看

第四次查看,发现他是在slave1和slave2上轮流读取,这体现了负载均衡

 4.在客户机上插入一条语句,发现客户机是读不到刚插入的语句的

 我们回到master上查看表student,发现客户机是写到了master上了。最终只有在Master上才能看到这条语句内容,说明写操作在master服务器上(体现了读写分离

由此验证,已经实现了MySQL读写分离,目前所有的写操作都在Master主服务器上,用来避免数据的不同步,所有的读操作都平分给了Slave从服务器,用来分担数据库压力。

 5.好的现在我们分别开启两台从服务器上的slave功能

 现在我们回到客户端查看表的内容,这次我们可以看到了master的全部内容但是slave1、slave2的内容还是轮流出现。又一次体现出了负载均衡


总结

在本次实验中有几个需要注意的地方:

1.在配置阿米巴是要注意我们的Java环境是否符合,然后就是安装阿米巴,不论是哪个都需要注意路径,在两者操作结束后修改配置文件/etc/profile然后输入source /etc/profile使之生效。

2.然后我们注意要去每个主从服务器里为阿米巴授权

3.配置阿米巴的文件(要细心),确认无误后启动服务。

4.测试阶段可以通过slave功能的启停来理解什么事读写分离、负载均衡。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5.1.1 创建C++项目失败

因一直使用Unity开发环境,安装Unreal后,并未详细配置过其开发环境,默认创建蓝图工程无异常,但创建UE C项目时总共遇到两个错误: 错误一 Running /Epic/UE/UE_5.1/Engine/Build/BatchFiles/Build.bat -projectfiles -…

郑州主域名和多个子域名的泛域名https证书

随着网络的发展,一个站长往往会创建多个域名网站,为了与主站有联系,站长会选择主站域名的二级域名来创建网站,比如主站是www .***. com,那么新创建的网站的域名就是top .***. com、vip .***. com等。 1.在安装部署htt…

原生求生记:揭秘UniApp的原生能力限制

文章目录 1. 样式适配问题2. 性能问题3. 原生能力限制4. 插件兼容性问题5. 第三方组件库兼容性问题6. 全局变量污染7. 调试和定位问题8. 版本兼容性问题9. 前端生态限制10. 文档和支持附录:「简历必备」前后端实战项目(推荐:⭐️⭐️⭐️⭐️…

利用小波包对一维信号进行降噪或压缩(MATLAB)

function [ output_args ] example4_12( input_args ) %EXAMPLE4_12 Summary of this function goes here % Detailed explanation goes here clc; clear; % 设置信噪比和随机数的初始值 snr 3; init 2055615866; % 生成一个原始信号xref和含高斯白噪声的信号x [xref,x] …

网络安全/信息安全(黑客技术)自学笔记

一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识,可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题,可以帮助您更好地解决网络安全的原理和技术…

2023年的深度学习入门指南(22) - 百川大模型13B的运行及量化

2023年的深度学习入门指南(22) - 百川大模型13B的运行及量化 不知道上一讲的大段代码大家看晕了没有。但是如果你仔细看了会发现,其实代码还是不全的。比如分词器我们就没讲。 另外,13B比7B的改进点也没有讲。 再有,对于13B需要多少显存我们…

记录每日LeetCode 141.环形链表 Java实现

题目描述: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链…

【RTT驱动框架分析00】-应用层函数调用流程-串口为例

应用层函数调用流程分析以-串口为例 1. rt_device_find调用流程 RTT内部有一个全局变量数组rt_object_container数组的数量就是 rt_object_info_type 内核对象的种类,其中包含一个RT_USING_DEVICE (设备的数据类型),数组内部的每一个变量包含一个链表&…

基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

C\C++内存管理

目录 1.C/C内存分布2.C语言中动态内存管理方式3.C中动态内存管理3.1new/delete内置类型3.2new和delete操作自定义类型 4.operator new与operator delete函数4.2重载operator new与operator delete(了解) 5.new和delete的实现原理5.1内置类型5.2 自定义类…

【动态规划part12】| 309.买卖股票的最佳时机含冷冻期、714.买卖股票的最佳时机含手续费

目录 🎈LeetCode309.最佳买卖股票时机含冷冻期 🎈LeetCode714.买卖股票的最佳时机含手续费 🎈LeetCode309.最佳买卖股票时机含冷冻期 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计…

【计算机视觉中的 GAN 】如何稳定GAN训练(3)

一、说明 在上一篇文章中,我们达到了理解未配对图像到图像翻译的地步。尽管如此,在实现自己的超酷深度GAN模型之前,您必须了解一些非常重要的概念。如本文所提的GAN模型新成员的引入:Wasserstein distance,boundary eq…

element时间选择器的默认值

概览:vue使用element组件,需要给时间选择器设置默认值,场景一:默认时间选择器,场景二:时间范围选择器,开始时间和结束时间。 一、默认时间选择器 实现思路: element组件的v-model绑…

DevOps-Jenkins

Jenkins Jenkins是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。 官网 应用场景 场景一 研发人员上传开发好的代码到github代码仓库需要将代码下载nginx服务器部署手动下载再…

数值线性代数:奇异值分解SVD

本文记录计算矩阵奇异值分解SVD的原理与流程。 注1:限于研究水平,分析难免不当,欢迎批评指正。 零、预修 0.1 矩阵的奇异值 设列满秩矩阵,若的特征值为,则称为矩阵的奇异值。 0.2 SVD(分解)定理 设,则…

Open3D-ML自动驾驶点云目标检测与分割入门

当开始新的研究时,我的方法通常是测试不同的相关事物,直到有足够的经验让我开始将这些点联系起来。 在开始构建用于 3D 对象检测的自定义模型之前,我购买了一台 LiDAR 并处理了一些数据。 下一个明显的步骤是在我为自己的数据贴标签之前找出研…

SpringCloudAlibaba之Ribbon

Ribbon是nacos自带的负载均衡器,属于客户端的负载均衡 但是在Spring高级版本中让LoadBalancer替代了 本人用的是2.1.0的nacos,ribbon还没有被替换。 使用: 在配置类中:LoadBalanced BeanLoadBalancedpublic RestTemplate restT…

ChatGPT长文本对话输入方法

ChatGPT PROMPTs Splitter 是一个开源工具,旨在帮助你将大量上下文数据分成更小的块发送到 ChatGPT 的提示,并根据如何处理所有块接收到 ChatGPT(或其他具有字符限制的语言模型)的方法。 推荐:用 NSDT设计器 快速搭建可…

【FPGA IP系列】FIFO的通俗理解

FPGA厂商提供了丰富的IP核,基础性IP核都是可以直接免费调用的,比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识,帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out,即先进先出。 FIFO是一个数…

怎么选择合适的微信管理系统?

稳定好用的网页版微信CRM系统,随时随地可以登录,不用安排插件软件,不限制手机和电脑使用,电脑手机关机消息都是实时同步的 还有很多功能: 1、聚合聊天:支持多个微信号登录到系统上,一个页面就可…