当前位置: 首页 > 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;} };...

Linux------一篇博客了解Linux最常用的指令

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;Linux &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#…...

vscode安装通义灵码

作为vscode的插件&#xff0c;直接使用 通义灵码-灵动指间&#xff0c;快码加编&#xff0c;你的智能编码助手 通义灵码&#xff0c;是一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研…...

RIP协议(路由信息协议)

一、RIP协议概述 RIP协议&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的内部网关协议&#xff0c;即根据跳数来度量路由开销&#xff0c;进行路由选择。 相比于其它路由协议&#xff08;如OSPF、ISIS等&#xff09;&#…...

SpringBoot根据配置类动态加载不同环境下的自定义配置

dev环境配置 Profile({"dev","test"}) PropertySource("classpath:dev.properties") public class DevConfigLoader { }Profile("prod") PropertySource("classpath:prod.properties") public class ProdConfigLoader { }P…...

什么?穷哥们没钱RLHF?跟我一起DPO吧,丐版一样用

本次DPO训练采用TRL的方式来进行训练 Huggingface TRL是一个基于peft的库&#xff0c;它可以让RL步骤变得更灵活、简单&#xff0c;你可以使用这个算法finetune一个模型去生成积极的评论、减少毒性等等。 本次进行DPO的模型是一个500M的GPT-2&#xff0c;目的是训练快&#x…...

【Leetcode笔记】102.二叉树的层序遍历

目录 知识点Leetcode代码&#xff1a;ACM模式代码&#xff1a; 知识点 vector、queue容器的操作 对vector<int> vec;做插入元素操作&#xff1a;vec.push_back(x)。对queue<TreeNode*> que;做插入元素操作&#xff1a;que.push(root);。队列有四个常用的操作&…...

进程的状态

目录 1.操作系统的进程状态 2.Linux系统的进程状态 特殊的进程状态 进程的查看 1.操作系统的进程状态 a.新建&#xff1a;就是新建一个进程 b.运行&#xff1a;PCB结构体在运行队列中排队 c.阻塞&#xff1a;PCB结构体在等待队列中&#xff0c;等待非CPU资源就续 d:挂起…...

spring-boot集成websocket

引入Maven依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>跟随spingboot版本</version> </dependency>后端代码 /*** 开启WebSocket支持*…...

【Python】【Flask】提交表单后报500错误

【背景】 日常用户使用的一个Online的基于Flask做的工具,今天忽然报错,看现象是点击表单提交按钮后发生错误。报500内部错误。 【分析】 用print步步为营接近root cause。 报错对应视图函数的展示部分正常执行。提交表单按钮后的内容全部没有正常执行。 提交表单用的方法是…...

Golang vs Java

目录 前言 一、语言背景与特性 二、性能与效率 三、生态系统与库支持 四、开发体验与工具支持 五、微服务架构设计中的对比 六、总结与建议 前言 在当今的软件开发世界中&#xff0c;选择合适的编程语言对于项目的成功至关重要。GoLang&#xff08;也称为Golang&#x…...

想做外贸去哪个网站做/站群seo

使用Script中的Defer属性。script中的defer属性默认情况下是false的。也就是说&#xff1a;如果是编写脚本的时候加入defer属性&#xff0c;那么浏览器在下载脚本的时候就不必立即对其进行处理&#xff0c;而是继续对页面进行下载和解析&#xff0c;这样会提高下载的性能。这样…...

工控网做网站维护吗/seo专业培训需要多久

当线程对象的Execute()执行完毕&#xff0c;我们就认为此线程终止了。这时候&#xff0c;它会调用Delphi的一个标准例程EndThread()&#xff0c;这个例程再调用API函数ExitThread()。由ExitThread()来清除线程所占用的栈。 当结束使用TThread对象时&#xff0c;应该确保已经把这…...

512内存做网站/上海发布微信公众号

CDI&#xff08;Contexts and Dependency Injection 上下文依赖注入&#xff09;&#xff0c;是JAVA官方提供的依赖注入实现&#xff0c;可用于Dynamic Web Module中&#xff0c;先给3篇老外的文章&#xff0c;写得很不错 1、Java EE CDI Dependency Injection (Inject) tutori…...

山西有新冠病例吗/福州短视频seo公司

1。“regex”方法行不通&#xff01;在你想要的东西是不可能的&#xff01;简单明了的回答。在原因&#xff1a;对于一般情况&#xff0c;不能使用regex在PDF文本中查找“匹配项”。我甚至不会在这里谈论Unicode字符。。。在我只考虑问题中示例中的简单文本字符串&#xff1a;m…...

wordpress主题修改软件/b站推广网站入口mmm

以太网转串口是工控领域最常见的智能通信模块&#xff0c;有的是一网口转1串口&#xff0c;有的是一网口转4串口&#xff0c;最多的可以达到一转16串口&#xff08;好像有的最多可以支持32串口&#xff09;。如果该类模块做的足够完善&#xff0c;可以提供一个windows系统的设备…...

做的比较好的货运网站/app开发流程

增强for循环实现数组遍历代码&#xff1a; package cn.tedu.demo; public class Demo { //增强for循环实现数组遍历 public static void main(String[] args) { int[] ages new int[]{1,4,2,45,0}; for(int a : ages){ System.out.print("–>"a); } } } 输出&…...