四、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数据库)

4、MyCAT核心配置:
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、什么是读写分离: 读写分离:就是将读写操作分发到不同的服务器,读操作分发到对应的服务器 (slave),写操作分发到对应的服务器(master) ① M-S (主从) 架构下&…...
通讯录项目实现
引言:通过顺序表的逻辑实现通讯录。这里就不讲关于顺序表的函数了。如果有不明白的可以看我写的顺序表的博客。 目录 顺序表与通讯录的比较 各源文件文件大榄 Contact.c中通讯录相关函数的定义 初始化和销毁通讯录 添加联系人: 删除联系人…...
xss相关知识点与绕过思路总结
前言 对xss的绕过进行了系统的学习与实践后,重新审视一下xss,对他的绕过进行一个总结。 (当然我也是个小白,这些也是我当时瞎鸡儿乱搞绕过了几个xss自己做的小总结) 可能有点丑陋,献丑了。 好博客推荐 …...
深入解析语言模型:原理、实战与评估
引言 随着人工智能的飞速发展,语言模型作为自然语言处理(NLP)的核心技术之一,日益受到业界的广泛关注。本文旨在深入探讨语言模型的原理、实战应用以及评估方法,帮助读者更好地理解和应用这一技术。 一、语言模型原理…...
Elasticsearch 的索引优化常规项
优化常规项 https://blog.csdn.net/bairo007/article/details/132019575 1、按实际情况适当调整主分片的数量 如果主分片数量太少,会导致每个分片中的数据量过大,而且无法利用集群中所有节点的计算资源。如果主分片数量太多,会导致索引过度…...
【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、 伪代码过程 此文涉及公式推导,需要参考这篇文章: Stable Diffusion扩散模型推导公式的基础知识 1、Diffusion的整体…...
关于rabbitmq的prefetch机制
消息预取机制(Prefetch Mechanism)是RabbitMQ中用于控制消息传递给消费者的一种机制。它定义了在一个信道上,消费者允许的最大未确认的消息数量。一旦未确认的消息数量达到了设置的预取值,RabbitMQ就会停止向该消费者发送更多消息…...
机器学习介绍
机器学习是人工智能(AI)的一个分支,它使计算机系统能够从数据中学习并改进它们的性能。机器学习的核心在于开发算法,这些算法可以从大量数据中识别模式和特征,并用这些信息来做出预测或决策,而无需进行明确…...
OpenCV4.9开发之Window开发环境搭建
1.打开OpenCV所在github地址 2.点击opencv仓库,进入仓库详情,点击右下方的OpenCV 4.9.0进入下载页面 3.点击opencv-4.9.0-windows.exe下载 开始下载中... 下载完成 下载完成后,双击运行解压,默认解压路径,修改为c:/...
DDD 中的实体和值对象有什么区别?
在DDD中,实体 Entity 和值对象 Value Object 是两个基本的概念,它们之间有一些重要的区别。 唯一性:实体是唯一的,每个实体都有一个唯一的标识符,即使它的属性在一段时间内发生了变化,它仍然是这个实体。与…...
算法-最值问题
#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介绍与使用
在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug;压力测试(压测)是确保系统在高负载情况下仍能稳定运行的重要步骤。通过模拟高并发场景,可以评估系统的性能瓶颈、可靠…...
数学思想论(有目录)
数学思想是数学发展过程中的重要指导原则,它涉及对数学概念、方法和理论的理解和认识,以及如何利用这些工具来解决实际问题。数学思想的形成和演进是随着数学的发展而逐渐深化的,它体现了人类对数学本质和应用的不断探索和思考。 一些主要的数学思想包括: 函数与方程思想…...
C++的并发世界(五)——线程状态切换
0.线程状态 初始化:该线程正在被创建; 就绪:该线程在列表中就绪,等待CPU调度; 运行:该线程正在运行; 阻塞:该线程被阻塞挂机,Blocked状态包括:pendÿ…...
C语言——指针
地址是由物理的电线上产生的,能够标识唯一一个内存单元。在C语言中,地址也叫做指针。 在32位机器中,有32根地址线。地址是由32个0/1组成的二进制序列,也就是用4个字节来存储地址。 在64位机器中,有64根地址线。地址是…...
手搓二分查找
第一种: 该种方法是若a[mid]目标数,则让r一直等于mid,让l往右移动,一直移动到rl,这时候跳出循环,在循环外判断 但是不能写成让lmid,让r往左移动,比如a[2]key,这时&#x…...
pycharm调试(步过(Step Over)、单步执行(Step Into)、步入(Step Into)、步出(Step Out))
pycharm调试 pycharm调试 pycharm调试为什么要学会调试?1. 步过 (Step Over)2. 单步执行 (Step Into)3. 步入(Step Into)4. 步出(Step Out) 为什么要学会调试? 调试可以帮助初学者更深入地理解编程基础&am…...
Linux是什么,该如何学习
🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Linux的起源与发展 2、Linux在现代计算机领域…...
C++ | Leetcode C++题解之第7题整数反转
题目: 题解: 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;} };...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
