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

四、MySQL读写分离之MyCAT

一、读写分离概述

1、什么是读写分离:

读写分离:就是将读写操作分发到不同的服务器,读操作分发到对应的服务器 (slave),写操作分发到对应的服务器(master)

① M-S (主从) 架构下,读写必须分离,如果不分离,业务可能出现问题;

② M-M (双主) 架构下,可以随意读写操作,特定的操作交由特定的服务器操作,工作效率更高 。

2、读写分离目的:

将读写业务分配到不同的服务器上,让服务器做特定的操作,使工作效率提高,同时降低主服务器的压力。

3、读写分离实现方式:

(1) 业务代码读写分离:

需要在业务代码中,判断数据操作是读还是写。

写操作 → mysql01(主数据库):

增加:

mysql> insert into 数据表 values ('字段值1','字段值2',...);

● 删除:

mysql> delete from 数据表 where 条件; #删除满足条件的记录
mysql> delete from 数据表 where 字段 in (字段值1,字段值2,...); #删除多个字段
mysql> delete from 数据表; #删除表中所有记录

● 更新:

mysql> update 数据表 set 字段1=字段值1,字段2=字段值2,... where条件;

读操作 → mysql02(从数据库):

● 查询:

mysql>select */字段列表 from 数据表 where条件 group by分组 having 子句 order by排序 limit子句;#where 条件:where 关键字用于过滤结果的条件,只有满足这个条件的记录才会被检索出来。
#group by分组:将检索出来的结果进行分组。
#having 子句:用于过滤分组后的结果集。
#ORDER BY:用于对结果集进行排序,ASC 升序或 DESC 降序。
#LIMIT 子句:用于限制返回的记录数。

(2) 中间件代理读写分离:

在业务代码中,数据库的操作,不直接连接数据库,而是先请求到代理服务器,由代理服务器判断读操作去从数据服务器,写操作去主数据服务器。

二、数据库读写分离操作:

1、MySQL从服务器准备:

(1) 克隆CentOS7母机,生成MySQL02数据库服务器:

配置IP地址与UUID编号

设置主机名称,绑定IP与主机名称到/etc/hosts文件

关闭防火墙与SELinux

关闭NetworkManager

时间同步

(2) 在MySQL02服务器中安装MySQL:

使用rsync传输文件到MySQL02:

不需要进行数据库初始化,只需要保证主从数据库之间的数据一致即可。

tar -zxf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
chown -R mysql.mysql /usr/local/mysql
cd /usr/local/mysql
rm -rf data/*  #移除测试数据库

(3) 将MySQL01的/usr/local/mysql/data/下的所有文件传输MySQL02中:

rsync -av /usr/local/mysql/data/* root@10.1.1.14:/usr/local/mysql/data/

(4) 在MySQL02服务器中,删除/usr/local/mysql/data/auto.cnf文件:

auto.cnf这个文件保存了每一个数据库的唯一编号,删除避免主从数据库配置出错。

rm /usr/local/mysql/data/auto.cnf

(5) 环境配置:

cp support-files/mysql.server /etc/init.d/mysql
service mysql start
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile

2、MySQL主从配置:

(1) MySQL主从同步原理:

① 从库的IO线程连接到主库的主进程,并请求复制数据。主库验证从库身份后,将复制数据交给主库IO线程处理。

② 主库IO线程读取主库上的binlog,并将binlog事件发送到从库。从库的IO线程接收到这些事件,并将它们写入到从库的relay-log中。

③ 从库的SQL线程读取relay-log中的binlog事件,并将它们应用到从库的数据中。同时,从库会更新master.info文件,记录复制的位置信息。

④ 重复上述步骤,从而实现持续的主从同步。

(2) 配置MySQL01与MySQL02的my.cnf文件:

MySQL01

vim /usr/local/mysql/my.cnf

[mysqld]basedir=/usr/local/mysql #MySQL安装的基础目录
datadir=/usr/local/mysql/data #数据库文件存储位置
port=3306
socket=/tmp/mysql.sock
log-error=/usr/local/mysql/data/mysql.err #错误日志文件的位置
character_set_server=utf8mb4 #MySQL服务器使用的字符集,utf8mb4可存储四字节的字符。
server_id = 10 #主从复制中标识服务器的身份,必须唯一。
log-bin=/usr/local/mysql/data/binlog
#二进制日志 (binlog) 的存储位置,二进制日志记录了所有更改数据的语句。

MySQL02

vim /etc/my.cnf

[mysqld]basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
log-error=/usr/local/mysql/data/mysql.err
character_set_server=utf8mb4
server_id=20
relay-log=/usr/local/mysql/data/relaylog
#中继日志(relay logs)的路径。中继日志是从服务器在复制过程中用来暂存主服务器的二进制日志(binlog)事件的。

(3) 在MASTER(MySQL01)中创建一个账号slave,用于实现数据同步:

mysql> grant replication slave on *.* to 'slave'@'10.1.1.%' identified by '123';

#授予slave用户将主服务器上的二进制日志文件复制到从服务器上的权限

mysql> flush privileges;

(4) 开启主从同步:

MySQL01:show master status\G

标识了二进制日志文件以及从哪个点开始读取日志中的事件。

MySQL02:

mysql> CHANGE MASTER TOMASTER_HOST='10.1.1.12',  #主数据库IPMASTER_USER='slave',    #连接到主库的用户名MASTER_PASSWORD='123',  #连接到主库的密码MASTER_PORT=3306,MASTER_LOG_FILE='binlog.000001',  #从哪个二进制日志文件开始复制MASTER_LOG_POS=405,   #指定二进制日志文件中的开始位置MASTER_CONNECT_RETRY=10;   #连接失败,从服务器重试连接的秒数间隔。mysql>start slave;
mysql> show slave status\G

3、使用MyCat中间件实现读写分离:

(1) 准备一台MyCat服务器:

基于CentOS7母机进行克隆生成MyCAT服务器,调整CPU与内存(建议2核心2GB)

更改IP地址与UUID编号

更改主机名称

绑定IP与主机名称到/etc/hosts文件

关闭防火墙与SELinux

关闭NetworkManager

时间同步

(2) JDK软件的安装与配置:

为什么需要JDK:

MyCAT是基于Java语言开发的程序,其操作系统中必须拥有Java的运行环境,否则MyCAT无法运行。

② JDK与JRE的区别:

JDK:包含了JRE和Java开发工具,主要用于开发Java应用程序。

JRE:只包含了运行Java程序所必需的文件,用于运行已经编译好的Java应用程序。

安装JDK:

tar xvf jdk-8u192-linux-x64.tar.gz
mkdir /usr/local/java
mv jdk1.8.0_192 /usr/local/java/

配置环境变量:mycat在环境变量中找java环境。

export PATH=$PATH:/usr/local/java/jdk1.8.0_192/bin >> /etc/profile
source /etc/profile

查看java版本:

(3) MyCAT软件的安装:

tar xvf Mycat-server-1.6.5-release-20180122220033- linux.tar.gz -C /usr/local

bin:mycat二进制文件目录; conf:配置文件目录; logs:日志目录。

查看mysql是否启动:/usr/local/mycat/bin/mycat console

此时终端占用中,开启另一个终端查看端口:

8066:MyCAT客户端 (连接web服务器) ; 9066:MyCAT管理端 (连接MySQL数据库)

4MyCAT核心配置:

MyCAT核心配置文件有两个:

server.xml:对外提供的用户等的设置

schema.xml:配置后端数据库服务器相关信息

(1) server.xml文件:
默认情况下,MyCAT中server.xml已经配置完毕,无需修改。

vim /usr/local/mycat/conf/server.xml

(2) schema.xml文件:

schema.xml文件面向的是后端真实的数据库 (MySQL01与MySQL02),需要进行配置。

vim /usr/local/mycat/conf/schema.xml

删除配置文件中多余的部分(建议先备份,避免删错):

删除所有注释;

删除schema标签中的所有table:

:6,22d

dataNode节点只保留一个dn1;

writeHost节点只保留一个。

schema.xml文件的大致结构:

在标签中添加dataNode节点:

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

TESTDB是虚拟数据库,用于连接web服务器和MyCAT。dataNode用于连接真实的MySQL数据库。

在dataNode节点中,指定真实的数据库:

<dataNode name="dn1" dataHost="localhost1" database="ds_shop"/>

dataHost:数据库集群

设置writeHost与readHost (读写服务器信息):

<writeHost host="hostM1" url="10.1.1.12:3306" user="dsshop" password="123">

        <readHost host="hostS2" url="10.1.1.14:3306" user="dsshop" password="123" />

</writeHost>

dsshop:数据库中创建的用于远程连接的账号。

开启读写分离:

balance属性:

balance="0":关闭读写分离,所有读写操作都发送到 writeHost 上;

balance="1":开启读写分离,所有读操作发送到 readHost 上。

启动MyCAT:

/usr/local/mycat/bin/mycat start

5、MyCAT客户端与管理端:

(1) MycCAT组成:

MyCAT软件一共有两端:8066客户端 ;9066管理端

Web01/Web02 通过 MyCAT 8066客户端去访问 MySQL01/MySQL02

MyCAT(8066客户端)→ 9066管理端 → MySQL01/MySQL02

(2) 查看代理客户端 8066 (对接 Web):

在MyCAT服务器中安装MySQL客户端软件mysql:

yum install mysql -y
rm -rf /etc/my.cnf

登录MyCAT中的虚拟数据库:

使用IP地址+端口号链接MyCAT 8066客户端

mysql -h 10.1.1.15 -P 8066 -uroot -p
Enter password:123456

虽然数据库名是TESTDB,但数据库中的表仍是ds_,说明TESTDB只是用于连接真实数据库的一个虚拟数据库。

(3) 管理监控端 9066 (管理后端MySQL):

使用IP地址+9066端口号链接管理端:

mysql -h 10.1.1.15 -P 9066 -uroot -p
Enter password:123456

使用show @@help命令查看MyCAT管理端提供的所有操作指令:

使用show @@heartbeat命令查看后端MySQL数据库的连接心跳信息:

当停止了MySQL02后:

6、DSShop商城系统更改:

web服务器与MyCAT服务器关联,修改database.php配置文件。

web01、web02与MyCAT建立联系所需要配置的内容:

IP地址:10.1.1.15

端口:8066

数据库名称:TESTDB

用户名:root

密码:123456

vim /home/www/application/database.php

登录商城后出现这种错误,其原因在于DSShop商城系统中,没有开启SQL语句的预读功 能。

vim /home/www/application/database.php

'params' => [\PDO::ATTR_EMULATE_PREPARES => true
]

相关文章:

四、MySQL读写分离之MyCAT

一、读写分离概述 1、什么是读写分离&#xff1a; 读写分离&#xff1a;就是将读写操作分发到不同的服务器&#xff0c;读操作分发到对应的服务器 &#xff08;slave&#xff09;&#xff0c;写操作分发到对应的服务器&#xff08;master&#xff09; ① M-S (主从) 架构下&…...

通讯录项目实现

引言&#xff1a;通过顺序表的逻辑实现通讯录。这里就不讲关于顺序表的函数了。如果有不明白的可以看我写的顺序表的博客。 目录 顺序表与通讯录的比较 各源文件文件大榄 Contact.c中通讯录相关函数的定义 初始化和销毁通讯录 添加联系人&#xff1a; 删除联系人&#xf…...

xss相关知识点与绕过思路总结

前言 对xss的绕过进行了系统的学习与实践后&#xff0c;重新审视一下xss&#xff0c;对他的绕过进行一个总结。 &#xff08;当然我也是个小白&#xff0c;这些也是我当时瞎鸡儿乱搞绕过了几个xss自己做的小总结&#xff09; 可能有点丑陋&#xff0c;献丑了。 好博客推荐 …...

深入解析语言模型:原理、实战与评估

引言 随着人工智能的飞速发展&#xff0c;语言模型作为自然语言处理&#xff08;NLP&#xff09;的核心技术之一&#xff0c;日益受到业界的广泛关注。本文旨在深入探讨语言模型的原理、实战应用以及评估方法&#xff0c;帮助读者更好地理解和应用这一技术。 一、语言模型原理…...

Elasticsearch 的索引优化常规项

优化常规项 https://blog.csdn.net/bairo007/article/details/132019575 1、按实际情况适当调整主分片的数量 如果主分片数量太少&#xff0c;会导致每个分片中的数据量过大&#xff0c;而且无法利用集群中所有节点的计算资源。如果主分片数量太多&#xff0c;会导致索引过度…...

【JavaParser笔记01】JavaParser解析Java源代码中的类信息(javadoc注释、类​​​​​​​名称)

这篇文章,主要介绍如何使用JavaParser解析Java源代码中的类信息(javadoc注释、类名称)。 目录 一、JavaParser依赖库 1.1、引入依赖 1.2、获取类注释信息...

Stable Diffusion扩散模型【详解】小白也能看懂!!

文章目录 1、Diffusion的整体过程2、加噪过程2.1 加噪的具体细节2.2 加噪过程的公式推导 3、去噪过程3.1 图像概率分布 4、损失函数5、 伪代码过程 此文涉及公式推导&#xff0c;需要参考这篇文章&#xff1a; Stable Diffusion扩散模型推导公式的基础知识 1、Diffusion的整体…...

关于rabbitmq的prefetch机制

消息预取机制&#xff08;Prefetch Mechanism&#xff09;是RabbitMQ中用于控制消息传递给消费者的一种机制。它定义了在一个信道上&#xff0c;消费者允许的最大未确认的消息数量。一旦未确认的消息数量达到了设置的预取值&#xff0c;RabbitMQ就会停止向该消费者发送更多消息…...

机器学习介绍

机器学习是人工智能&#xff08;AI&#xff09;的一个分支&#xff0c;它使计算机系统能够从数据中学习并改进它们的性能。机器学习的核心在于开发算法&#xff0c;这些算法可以从大量数据中识别模式和特征&#xff0c;并用这些信息来做出预测或决策&#xff0c;而无需进行明确…...

OpenCV4.9开发之Window开发环境搭建

1.打开OpenCV所在github地址 2.点击opencv仓库,进入仓库详情,点击右下方的OpenCV 4.9.0进入下载页面 3.点击opencv-4.9.0-windows.exe下载 开始下载中... 下载完成 下载完成后,双击运行解压,默认解压路径,修改为c:/...

DDD 中的实体和值对象有什么区别?

在DDD中&#xff0c;实体 Entity 和值对象 Value Object 是两个基本的概念&#xff0c;它们之间有一些重要的区别。 唯一性&#xff1a;实体是唯一的&#xff0c;每个实体都有一个唯一的标识符&#xff0c;即使它的属性在一段时间内发生了变化&#xff0c;它仍然是这个实体。与…...

算法-最值问题

#include<iostream> using namespace std; int main() {int a[7];//上午上课时间int b[7];//下午上课时间int c[7];//一天总上课时间for (int i 0; i < 7; i) {cin >> a[i] >> b[i];c[i] a[i] b[i];}int max c[0];//max记录最长时间int index -1;//索…...

Go 性能压测工具之wrk介绍与使用

在项目正式上线之前&#xff0c;我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug&#xff1b;压力测试&#xff08;压测&#xff09;是确保系统在高负载情况下仍能稳定运行的重要步骤。通过模拟高并发场景&#xff0c;可以评估系统的性能瓶颈、可靠…...

数学思想论(有目录)

数学思想是数学发展过程中的重要指导原则,它涉及对数学概念、方法和理论的理解和认识,以及如何利用这些工具来解决实际问题。数学思想的形成和演进是随着数学的发展而逐渐深化的,它体现了人类对数学本质和应用的不断探索和思考。 一些主要的数学思想包括: 函数与方程思想…...

C++的并发世界(五)——线程状态切换

0.线程状态 初始化&#xff1a;该线程正在被创建&#xff1b; 就绪&#xff1a;该线程在列表中就绪&#xff0c;等待CPU调度&#xff1b; 运行&#xff1a;该线程正在运行&#xff1b; 阻塞&#xff1a;该线程被阻塞挂机&#xff0c;Blocked状态包括&#xff1a;pend&#xff…...

C语言——指针

地址是由物理的电线上产生的&#xff0c;能够标识唯一一个内存单元。在C语言中&#xff0c;地址也叫做指针。 在32位机器中&#xff0c;有32根地址线。地址是由32个0/1组成的二进制序列&#xff0c;也就是用4个字节来存储地址。 在64位机器中&#xff0c;有64根地址线。地址是…...

手搓二分查找

第一种&#xff1a; 该种方法是若a[mid]目标数&#xff0c;则让r一直等于mid&#xff0c;让l往右移动&#xff0c;一直移动到rl&#xff0c;这时候跳出循环&#xff0c;在循环外判断 但是不能写成让lmid&#xff0c;让r往左移动&#xff0c;比如a[2]key&#xff0c;这时&#x…...

pycharm调试(步过(Step Over)、单步执行(Step Into)、步入(Step Into)、步出(Step Out))

pycharm调试 pycharm调试 pycharm调试为什么要学会调试&#xff1f;1. 步过 (Step Over)2. 单步执行 (Step Into)3. 步入&#xff08;Step Into&#xff09;4. 步出&#xff08;Step Out&#xff09; 为什么要学会调试&#xff1f; 调试可以帮助初学者更深入地理解编程基础&am…...

Linux是什么,该如何学习

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Linux的起源与发展 2、Linux在现代计算机领域…...

C++ | Leetcode C++题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; class Solution { public:int reverse(int x) {int rev 0;while (x ! 0) {if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {return 0;}int digit x % 10;x / 10;rev rev * 10 digit;}return rev;} };...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...