当前位置: 首页 > news >正文

【MySQL数据库】MySQL读写分离

文章目录

  • 读写分离
    • 概念
      • 读写分离的动机
      • 读写分离的适用场景
      • 主从复制与读写分离
        • MySQL 读写分离原理
        • MySQL读写分离的实现方式
          • 代表性程序
  • MySQL读写分离实验
    • 搭建 MySQL 读写分离
      • Amoeba 服务器配置
      • 测试读写分离
  • 问答

读写分离

概念

读写分离是为了优化数据库性能,通过将写操作(INSERT、UPDATE、DELETE)和读操作(SELECT)分别分配到不同的数据库实例上,以达到降低单一数据库负载、提高整体响应速度的目的。这通常通过数据库的主从复制技术来实现,主数据库负责处理写操作,从数据库负责处理读操作,并保持与主数据库的数据同步。

读写分离的动机

  1. 性能优化:写操作通常比读操作更耗时,因此将两者分开可以显著提高数据库系统的整体性能。
  2. 负载均衡:通过读写分离,可以将查询请求分散到多个从数据库上,减轻主数据库的负担。
  3. 高可用性:在读写分离架构中,如果主数据库出现故障,从数据库可以迅速接管读操作,确保系统的持续运行。

读写分离的适用场景

读写分离通常适用于以下场景:

  1. 读多写少:如果系统的查询操作远多于更新操作,那么读写分离可以显著提高性能。
  2. 高并发:在高并发场景下,读写分离可以有效分散数据库请求,提高系统的处理能力。
  3. 数据一致性要求不高的读操作:对于某些读操作,即使数据略有延迟也是可以接受的,这样可以使用读写分离来提高性能。

主从复制与读写分离

  • 必要性:在生产环境中,单一数据库服务器无法满足高并发、高可用性和安全性需求。
  • 实现方式:通过主从复制同步数据,再通过读写分离提升数据库的并发处理能力。类似于rsync,但rsync是对磁盘文件备份,而MySQL主从复制是对数据和语句的备份。
MySQL 读写分离原理
  • 核心思想:只在主服务器上执行写操作,在从服务器上执行读操作。
  • 实现方式:主数据库处理事务性操作,从数据库处理SELECT查询。通过数据库复制技术,将主数据库上的变更同步到从数据库。
MySQL读写分离的实现方式
  1. 基于程序代码内部实现
    • 优点:性能较好,不需要额外的硬件设备。
    • 缺点:需要开发人员实现,运维人员难以介入;对于大型复杂应用,代码改动可能较大。
  2. 基于中间代理层实现
    • 优点:易于运维和管理,可以实现更复杂的路由规则和负载均衡策略。
    • 缺点:可能增加系统的复杂性和延迟;需要额外的硬件设备或软件资源。
      常见的中间代理层实现方式包括MySQL-Proxy、Atlas、Amoeba和Mycat等。这些工具各有优缺点,选择时应根据具体的应用场景和需求进行权衡。
代表性程序
  1. MySQL-Proxy
    • 开源项目,通过自带Lua脚本进行SQL判断。
    • 需要编写大量Lua脚本,对不熟悉MySQL Proxy内置变量和MySQL Protocol的人来说较困难。
  2. Atlas
    • 由奇虎360开发维护,基于MySQL协议的数据中间层项目。
    • 在mysql-proxy 0.8.2基础上优化,支持事务和存储过程。
    • 每天承载数十亿条读写请求。
  3. Amoeba
    • 由陈思儒开发,曾就职于阿里巴巴。
    • 使用Java开发,易于使用且可移植性强。
    • 不支持事务和存储过程。
  4. Mycat
    • 基于Java编写的数据库中间件,实现MySQL协议。
    • 核心功能是分库分表,配合主从模式可实现读写分离。

MySQL读写分离实验

搭建 MySQL 读写分离

Amoeba 服务器配置

1. 安装 Java 环境
因为 Amoeba 是基于 JDK 1.5 开发的,所以推荐使用 JDK 1.5 或 1.6 版本。

# 进入 /opt/ 目录
cd /opt/# 将 JDK 安装包复制到 /usr/local/ 目录
cp jdk-6u14-linux-x64.bin /usr/local/# 进入 /usr/local/ 目录
cd /usr/local/# 给 JDK 安装包执行权限
chmod +x jdk-6u14-linux-x64.bin# 执行 JDK 安装包
./jdk-6u14-linux-x64.bin
# 按 yes 确认,按 enter 继续# 将解压后的 JDK 目录重命名为 jdk1.6
mv jdk1.6.0_14/ /usr/local/jdk1.6# 编辑 /etc/profile 文件,配置 JAVA_HOME 环境变量
vim /etc/profile
# 在文件末尾添加以下内容
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin# 使配置生效
source /etc/profile# 检查 Java 版本
java -version

2. 安装 Amoeba 软件

# 创建 Amoeba 安装目录
mkdir /usr/local/amoeba# 将 Amoeba 安装包解压到 /usr/local/amoeba/ 目录
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/# 设置 Amoeba 目录权限
chmod -R 755 /usr/local/amoeba/# 检查 Amoeba 是否安装成功
/usr/local/amoeba/bin/amoeba
# 如显示 amoeba start|stop 说明安装成功

3. 配置 Amoeba 读写分离
首先,在 Master、Slave1、Slave2 的 MySQL 上开放权限给 Amoeba 访问。

GRANT ALL ON *.* TO 'test'@'192.168.80.%' IDENTIFIED BY '123.com';

然后,回到 Amoeba 服务器配置 Amoeba 服务。

# 进入 Amoeba 配置文件目录
cd /usr/local/amoeba/conf/# 备份 Amoeba 配置文件
cp amoeba.xml amoeba.xml.bak# 编辑 Amoeba 配置文件
vim amoeba.xml
# 修改以下内容:
# 第30行:设置 Amoeba 用户名为 amoeba
<property name="user">amoeba</property>
# 第32行:设置 Amoeba 用户密码为 123456
<property name="password">123456</property>
# 第115行:设置默认连接池为 master
<property name="defaultPool">master</property>
# 第117行:去掉注释,设置写连接池为 master
<property name="writePool">master</property>
# 第118行:去掉注释,设置读连接池为 slaves
<property name="readPool">slaves</property># 备份数据库配置文件
cp dbServers.xml dbServers.xml.bak# 编辑数据库配置文件
vim dbServers.xml
# 修改以下内容:
# 第23行:注释掉默认库配置,以防 MySQL 中没有 test 库时报错
<!-- <property name="schema">test</property> -->
# 第26行:设置连接 MySQL 的用户名为 test
<property name="user">test</property>
# 第28-30行:去掉注释,设置连接 MySQL 的用户密码为 123.com
<property name="password">123.com</property>
# 第45行:设置主服务器名为 master
<dbServer name="master" parent="abstractServer">
# 第48行:设置主服务器 IP 地址为 192.168.80.10
<property name="ipAddress">192.168.80.10</property>
# 第52行:设置从服务器名为 slave1
<dbServer name="slave1" parent="abstractServer">
# 第55行:设置从服务器1的 IP 地址为 192.168.80.11
<property name="ipAddress">192.168.80.11</property>
# 第58行:复制上面6行,设置从服务器2的名称为 slave2 和 IP 地址为 192.168.80.12
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.80.12</property>
# 第65行:设置虚拟从服务器名为 slaves
<dbServer name="slaves" virtual="true">
# 第71行:设置虚拟从服务器的连接池为 slave1 和 slave2
<property name="poolNames">slave1,slave2</property># 启动 Amoeba 服务
/usr/local/amoeba/bin/amoeba start&
# 检查 8066 端口是否开启,默认端口为 TCP 8066
netstat -anpt | grep java

测试读写分离

1. 安装 MariaDB

# 安装 MariaDB
yum install -y mariadb-server mariadb# 启动 MariaDB 服务
systemctl start mariadb.service

2. 测试读写分离
在客户端服务器上测试连接 Amoeba 服务器代理的 MySQL。

# 通过 Amoeba 服务器代理访问 MySQL
mysql -u amoeba -p123456 -h 192.168.80.20 -P8066# 在主服务器上创建数据库和表
USE db_test;
CREATE TABLE test (id INT(10), name VARCHAR(10), address VARCHAR(20));# 在两台从服务器上关闭同步并插入数据
STOP SLAVE;
USE db_test;
-- 在 slave1 上插入数据
INSERT INTO test VALUES('1', 'zhangsan', 'this_is_slave1');
-- 在 slave2 上插入数据
INSERT INTO test VALUES('2', 'lisi', 'this_is_slave2');# 在主服务器上插入数据
INSERT INTO test VALUES('3', 'wangwu', 'this_is_master');# 在客户端服务器上查询数据
USE db_test;
SELECT * FROM test;
# 客户端会分别向 slave1 和 slave2 读取数据,显示只有在两个从服务器上添加的数据,没有在主服务器上添加的数据# 在客户端服务器上插入数据
INSERT INTO test VALUES('4', 'qianqi', 'this_is_client');
# 只有主服务器上有此数据# 在两个从服务器上执行 START SLAVE; 实现同步在主服务器上添加的数据
START SLAVE;

问答

读写分离:
1)基于程序代码内部实现:优点:性能好,不需要额外的硬件设备支出;缺点:由开发人员负责实现和维护,在一些现有的大型应用中现实读写分离对代码改动会较为困难
2)基于中间代理层实现:优点:实现起来较为简单,不需要重构代码;缺点:需要额外的硬件设置支出,由运维人员负责维护
典型代表:mysql-proxy、mycat、ameoba

相关文章:

【MySQL数据库】MySQL读写分离

文章目录 读写分离概念读写分离的动机读写分离的适用场景主从复制与读写分离MySQL 读写分离原理MySQL读写分离的实现方式代表性程序 MySQL读写分离实验搭建 MySQL 读写分离Amoeba 服务器配置测试读写分离 问答 读写分离 概念 读写分离是为了优化数据库性能&#xff0c;通过将…...

深度学习:简单计算图的反向传播传递导数计算

问题&#xff1a; 太郎在超市买了2个100日元一个的苹果&#xff0c;消费税是10%&#xff0c;请计算支付金额。 反向传播使用与正方向相反的箭头&#xff08;粗线&#xff09;表示。反向传播传递“局部导数”&#xff0c;将导数的值写在箭头的下方。在这个例子中&#xff0c;反向…...

学习AJAX请求(初步)24.10.21-10.23

1.AJAX概念 AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部分网页内容。 虽然所有的AJAX请求都是HTTP请求&#xff0c;但并非所有的HT…...

初识算法——二分查找

1.概念 二分查找算法也称折半查找&#xff0c;是一种非常高效的工作于有序数组的查找算法。 需求&#xff1a;在有序数组 A A A 内&#xff0c;查找值 t a r g e t target target 如果找到返回索引如果找不到返回 − 1 -1 −1 前提给定一个内含 n n n 个元素的有序数组…...

深入剖析 Java Spring 中的 @Autowired、@Resource、@Qualifier、@Inject 注解:使用详解与注意事项

文章目录 Autowired&#xff1a;Spring 最常用的注解1. 作用与简介2. 使用示例3. 注意事项 Resource&#xff1a;按名称注入的利器1. 作用与简介2. 使用示例3. 注意事项 Qualifier&#xff1a;解决多 bean 注入问题1. 作用与简介2. 使用示例3. 注意事项 Inject&#xff1a;标准…...

ThingsBoard规则链节点:Delete Attributes节点详解

引言 删除属性节点简介 用法 含义 应用场景 实际项目运用示例 智能家居安全系统 物流跟踪解决方案 工业自动化生产线 结论 引言 ThingsBoard是一个开源的物联网平台&#xff0c;它提供了设备管理、数据收集与处理以及实时监控等功能。其中&#xff0c;规则引擎是其核心…...

关于作为面试官以及如何准备面试的一些心得

关于作为面试官以及如何准备面试的一些心得 一、面试官&#xff08;我站在前端角度来说&#xff09; 当作为这样身份的时候&#xff0c;我想第一步应该是自己梳理一些从简到难、从点到面的问题 CSS - JS - 框架 - 项目 从这四个角度出发&#xff0c;一步一步的引导面试者的思…...

Bean对象 和 普通对象 的区别

Bean对象 和 普通对象 的区别 前言Bean的概念与new创建的对象的区别Spring Bean的优势两者使用的关键点总结 前言 在Spring框架中&#xff0c;我们通常将Spring容器管理的对象称为“Bean”或“Bean对象”。而通过new关键字创建的对象则被称为“对象”或“普通对象”。 Bean的…...

lego-loam featureAssociation 源码注释(二)

咱们接着往下看initializationValue();&#xff01;&#xff01;&#xff01; FeatureAssociation():nh("~"){subLaserCloud nh.subscribe<sensor_msgs::PointCloud2>("/segmented_cloud", 1, &FeatureAssociation::laserCloudHandler, this);s…...

Claude 3.5 的六大应用场景

Claude 3.5 的六大应用场景 随着人工智能技术的飞速发展&#xff0c;Claude 3.5 已经成为一款强大的语言模型工具&#xff0c;在多个领域展现了其卓越的应用潜力。本文将通过CSDN格式&#xff0c;介绍Claude 3.5在六大主要领域的实际应用场景&#xff0c;帮助开发者和企业更好…...

进程线程知识总结

1. 程序什么时候应该使用线程&#xff0c;什么时候单线程效率高 使用线程&#xff1a;在I/O密集型或高并发的场景&#xff0c;例如网络服务、文件读写等。通过多线程可以同时处理多个任务&#xff0c;提高利用率。单线程效率高&#xff1a;在CPU密集型任务中&#xff0c;当任务…...

Rsync数据复制/备份服务应用

文章目录 1. rsync概述1.1 什么是Rsync1.2 rsync的功能1.3 rsync 的功能特性1.4 Rsync 增量复制原理1.5 生产场景架构集群备份方案 2. Rsync工作方式介绍与实践2.1 本地数据传输模式2.1.1 本地数据传输模式语法2.1.2 本地数据传输模式实践 2.2 远程Shell 数据传输模式2.2.1 远程…...

如何为自己的跨境网站添加多国语言翻译功能及推荐起尔网定制与插件开发

如何为自己的跨境网站添加多国语言翻译功能及推荐起尔网定制与插件开发 在全球化的浪潮下&#xff0c;跨境电商成为越来越多企业拓展国际市场的重要途径。然而&#xff0c;语言障碍成为了一个不可忽视的问题。为了更好地服务全球用户&#xff0c;为自己的跨境网站添加多国语言…...

安全见闻(3)——开阔眼界,不做井底之蛙

内容预览 ≧∀≦ゞ 安全见闻三&#xff1a;脚本程序与病毒声明导语脚本语言BAT/PowerShell脚本木马与宏病毒脚本病毒BIOS病毒 结语 安全见闻三&#xff1a;脚本程序与病毒 声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只…...

MySQL 的意向锁(Intention Locks)原理详解

1. 背景&#xff1a;为什么需要意向锁&#xff1f; MySQL 中意向锁的主要作用是用于支持行级锁与表级锁的并存&#xff0c;特别是在 InnoDB 存储引擎中。InnoDB 提供了行级锁&#xff0c;而在某些场景下&#xff0c;数据库系统仍需要对整张表加锁&#xff0c;例如 LOCK TABLES …...

31个省份农业科技水平(农业技术创新或农业科技专利数据)2010-2022年

一、测算方式&#xff1a;参考C刊《湖北大学学报(哲学社会科学版)》张金鑫&#xff08;2020&#xff09;老师的做法&#xff0c;采用农业( 农林牧渔业) 三类专利总和来衡量农业技术创新 二、资料范围&#xff1a;31个省份&#xff0c;403个观测值&#xff0c;已经整理成面板数…...

Python代码执行失败问题及解决方案

目录 一、Python代码执行失败的原因 二、常见的Python错误类型 1. 语法错误&#xff08;SyntaxError&#xff09; 2. 运行时错误&#xff08;RuntimeError&#xff09; 3. 类型错误&#xff08;TypeError&#xff09; 4. 导入错误&#xff08;ImportError&#xff09; 5…...

Java 遗传算法

遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种基于自然选择和遗传学原理的优化算法&#xff0c;用于求解复杂的搜索和优化问题。在Java中实现遗传算法通常包括以下几个步骤&#xff1a; 初始化种群&#xff1a;生成一组随机解作为初始种群。适应度评估&#x…...

C++ (一) 基础语法

基础语法&#xff1a;C的开胃小菜 欢迎来到C的世界&#xff0c;这里是编程的盛宴&#xff0c;也是逻辑的迷宫。别担心&#xff0c;我们不会一开始就让你啃硬骨头&#xff0c;而是从基础语法开始&#xff0c;让你慢慢品尝编程的美味。准备好了吗&#xff1f;让我们开始这场编程…...

Qt/C++路径轨迹回放/回放每个点信号/回放结束信号/拿到移动的坐标点经纬度

一、前言说明 在使用百度地图的路书功能中&#xff0c;并没有提供移动的信号以及移动结束的信号&#xff0c;但是很多时候都期望拿到移动的哪里了以及移动结束的信号&#xff0c;以便做出对应的处理&#xff0c;比如结束后需要触发一些对应的操作。经过搜索发现很多人都有这个…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...