mysql 26day 数据库双主双从 搭建mycat 数据库负载均衡 读写分离

news2025/3/17 8:08:36

目录

  • 搭建一个(双主双从) (然后搭建mycat)
    • 四台主机配置
    • master1 (主库1)
    • master2 (主库2)
    • slave 1(从库1)
    • master1 (主库1)
    • slave 1(从库1)
    • 如果配置出错 需要从这里从新配置
  • 写入数据(测试)
  • mycat
    • 安装java
    • 安装mycat
      • 编辑文件server.xml
      • 编辑文件schema.xml
      • 配置 mycat 用户
      • 配置schema.xml
        • 上述库的一些参数
      • 启动mycat服务
    • 登录mysql 用户端 测试
      • 测试 主从 数据库负载均衡
    • 测试负载均衡

搭建一个(双主双从) (然后搭建mycat)

  • 需要准备四台机器(master1、master2、slave1、slave2)
  • 克隆的时候 不要链接 要完整克隆
    -在这里插入图片描述

四台主机配置

# 配置本地解析
或者 vim /etc/hosts
cat >> /etc/hosts << EOF
{ip}  master1
{ip}  master2
{ip}  slave1
{ip}  slave2
{ip}  mycat
EOF

cat >> /etc/hosts << EOF
10.12.155.146  master1
10.12.155.89  master2
10.12.155.92  slave1
10.12.155.97  slave2
10.12.155.93  mycat
EOF




# 配置 复制数据库
scp mysql5.7.44.tar.gz  master1:/opt/
scp mysql5.7.44.tar.gz  master2:/opt/
scp mysql5.7.44.tar.gz  slave1:/opt/
scp mysql5.7.44.tar.gz  slave2:/opt/
scp mysql5.7.44.tar.gz  mycat:/opt/

# 解压包  安装

tar -xf /opt/mysql5.7.44.tar.gz


# 安装mysql
cd /opt/mysql5.7.44/
yum -y localinstall *

#启动数据库
systemctl start mysqld
systemctl enable mysqld

#修改mysql密码
mysqladmin -uroot -p"`awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log`" password '@Baipiao123'

# 创建备份文件
mkdir /data
chown mysql.mysql /data

master1 (主库1)

# 配置文件
vim /etc/my.cnf
log_bin=/data/mysql-bin
server-id = 1
log-slave-updates     #添加上这个配置之后 就可以传多分bin-log

# 登录数据库
mysql -uroot -p"@Baipiao123"

# 授权账号。
mysql> grant replication slave on *.* to "king2"@"%" identified by "@Baipiao123";

# 刷新授权表

mysql> flush privileges;
# 查看当前binlog 日志文件用的哪个 以及post 
msyql> show master status\G

## 重新设置 设置轮转日志
mysql> reset master;

# 重启数据库
systemctl restart mysqld
mysql -uroot -p"@Baipiao123"

# 登录数据库 查看myster 的状态

msyql> show master status\G

master2 (主库2)

# 配置文件
vim /etc/my.cnf
log_bin=/data/mysql-bin
server-id = 2
log-slave-updates 

# 登录数据库 配置从的信息

mysql -uroot -p"@Baipiao123"

# 授权账号。
mysql> grant replication slave on *.* to "king2"@"%" identified by "@Baipiao123";

# 刷新授权表

mysql> flush privileges;

# 配置成  master 1 的从库
mysql>? change master to 

CHANGE MASTER TO
  MASTER_HOST='master1',
  MASTER_USER='king',
  MASTER_PASSWORD='@Baipiao123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000002',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;

# 重新加载配置
mysql>start slave;

# 登录数据库 查看myster 的状态

msyql> show slave status\G

slave 1(从库1)

# 配置文件
vim /etc/my.cnf
log_bin=/data/mysql-bin
server-id = 3


# 登录数据库 配置从的信息

mysql -uroot -p"@Baipiao123"

# 配置成  master 1 的从库
mysql>? change master to 

mysql>CHANGE MASTER TO
  MASTER_HOST='master1',
  MASTER_USER='king',
  MASTER_PASSWORD='@Baipiao123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000002',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;

# 重新加载配置
mysql>start slave;

# 登录数据库 查看myster 的状态

msyql> show slave status\G

master1 (主库1)

这里是回头把 master1 (主库1) 配置成 master2 (主库2) 的从库

这样,master1 (主库1) 和 master2 (主库2) 就可以互为主从

# 登录数据库 配置从的信息

mysql -uroot -p"@Baipiao123"


# 查看主机2
msyql> show master status\G

# 配置成  master 1 的从库
mysql>? change master to 

mysql>CHANGE MASTER TO
  MASTER_HOST='master2',
  MASTER_USER='king2',
  MASTER_PASSWORD='@Baipiao123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000002',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;

# 重新加载配置
mysql>start slave;

# 登录数据库 查看myster 的状态

msyql> show slave status\G

slave 1(从库1)

配置成 主库2 的从库

# 配置文件
vim /etc/my.cnf
log_bin=/data/mysql-bin
server-id = 4


# 登录数据库 配置从的信息

mysql -uroot -p"@Baipiao123"

# 配置成  master 1 的从库
mysql>? change master to 

mysql>CHANGE MASTER TO
  MASTER_HOST='master2',
  MASTER_USER='king2',
  MASTER_PASSWORD='@Baipiao123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000002',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;

# 重新加载配置
mysql>start slave;

# 登录数据库 查看myster 的状态

msyql> show slave status\G

如果配置出错 需要从这里从新配置

mysql>stop slave;
mysql> reset slave;
mysql>CHANGE MASTER TO
  MASTER_HOST='master',
  MASTER_USER='master',
  MASTER_PASSWORD='@Baipiao123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;
## 启动slave
mysql>start slave;
# 产看状态
msyql>show slave status\G;

# -------------------------------------------------------------------
CHANGE MASTER TO
  MASTER_HOST='master1',
  MASTER_USER='king',
  MASTER_PASSWORD='@Baipiao123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000003',
  MASTER_LOG_POS=1511,
  MASTER_CONNECT_RETRY=10;
  
  
  CHANGE MASTER TO
  MASTER_HOST='master2',
  MASTER_USER='king2',
  MASTER_PASSWORD='@Baipiao123',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000003',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;

写入数据(测试)

只往 master1 上写
# 在主库1 上插入数据
mysql -uroot -p"@Baipiao123" -e"create database baipiao;"
mysql -uroot -p"@Baipiao123" -e"create table baipiao.t1(id int,myname varchar(40));"
mysql -uroot -p"@Baipiao123" -e"insert into baipiao.t1 values(1,'hanwudi');"
mysql -uroot -p"@Baipiao123" -e"insert into baipiao.t1 values(2,'liubang');"
mysql -uroot -p"@Baipiao123" -e"insert into baipiao.t1 values(3,'xiaohe');"
mysql -uroot -p"@Baipiao123" -e"insert into baipiao.t1 values(4,'zhangliang');"



# 在其余三个库中查寻数据
mysql -uroot -p"@Baipiao123" -e"select * from baipiao.t1"

在这里插入图片描述

mycat

安装java

安装java 环境
因为mycat 是用 java 写的 所以这里需要一个java环境

需要 jdk 环境
# 安装 杰哥 的包 直接用

# 解压包
tar -xf jdk-8u211-linux-x64c.tar.gz
# 移动解压包
mv jdk1.8.0_0   /usr/jdk
# 修改配置文件  增加全局变量
vim /etc/profile.d/java.sh
	# 写入内容

export JAVA_HOME=/usr/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 更新环境变量
source /etc/profile
source /etc/profile.d/java.sh

# 检查 java 版本 (java 不用启动)
java -version

安装mycat

# mycat 解压就可以用了
tar  -xf  {mycat 包}

 tar -xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz 

# 移动解压包
mv mycat   /usr/


# 一个假的 一个真的
/usr/mycat/conf/server.xml    	//存放和假的
/usr/mycat/conf/schema.xml		//存放着真的
# server.xml
给后端的时候
就给一个假的   到时候假的 会对应一个真的 然后进行登录


# 编制之前先备份
cp /usr/mycat/conf/server.xml   /usr/mycat/conf/server.xml.back
cp /usr/mycat/conf/schema.xml   /usr/mycat/conf/schema.xml.back

# 编辑文件  会在下边逐个编辑 (此处仅为展示)

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

编辑文件server.xml

vim  /usr/mycat/conf/server.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	<!-- name="root" 是假库 用户名 -->
	<user name="root" defaultAccount="true">
		<!-- 这里是 假库密码  -->
		<property name="password">123456</property>
		<!-- 这里是假库库名 -->
		<property name="schemas">TESTDB</property>
	</user>
</mycat:server>

编辑文件schema.xml

vim  /usr/mycat/conf/schema.xml 

配置 mycat 用户

# 授权一个mycat 用户
mysql> grant all on *.* to "mycat"@"%" identified by "@Baipiao123";
# 查看用户
mysql> select user from mysql.user; 
# 刷新授权
mysql> flush privileges;
# 创建一个真库  (假库 TESTDB 会对应到db1库)
mysql> create database db1;
# 给库中创建一个表格
mysql> create table  db1.t1(id int);

配置schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 这个地方写虚拟库的信息 -->
	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
	</schema>
	<dataNode name="dn1" dataHost="localhost1" database="db1" />
		<!-- balance="3" 负载均衡 -->
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		
		
		
		
		<!-- 做一个判断,判断 主1 库是否正常 -->
		<heartbeat>select user()</heartbeat>




		<!--  主库1 master1 -->
		<writeHost host="hostM1" url="master1:3306" user="mycat"
				   password="@Baipiao123">
			<!-- 从库1(slave1) -->
			<readHost host="hostS1" url="slave1:3306" user="mycat" password="@Baipiao123" />
		</writeHost>


		<!-- 主库2 (master2)-->
		<writeHost host="hostM2" url="master2:3306" user="mycat"
				   password="@Baipiao123">
				   <!-- 从库2(slave2) -->
			<readHost host="hostS2" url="slave2:3306" user="mycat" password="@Baipiao123" />
		</writeHost>
	</dataHost>
</mycat:schema>

上述库的一些参数
----------------------------------------------------------------------------------------------
配置到这里就结束了  下边是一些参数解释
----------------------------------------------------------------------------------------------
database="db1" 需写一个真实的库

maxCon ="1000" 最大连接数
minCon ="10" 最少连接数
balance = "0" 负载均衡
writeType=
dbType=    //数据库类型
dbDriver= //引擎


--------------------------------------------------
<heartbeat>select user()</heartbeat>
试试检测 库1 有没有宕机


--------------------------------------------------
writeHost
host =
url= {数据库链接地址}
user= {数据库用户名}
passwd= {数据库用户密码}

启动mycat服务

#配置文件  改完之后

/usr/mycat/bin/mycat #mycat 配置
/usr/mycat/bin/mycat  status	# 查看状态
/usr/mycat/bin/mycat  start	# 查看状态
/usr/mycat/bin/mycat  restart # 重新启动
jps         # 查看java 进程

ss -ntlp

在这里插入图片描述

登录mysql 用户端 测试

使用 mysql 客户端 

mycat  端口是8066

mysql -P8066 -uroot -p123456 -hmycat 

show databases;

在这里插入图片描述

测试 主从 数据库负载均衡

balance 属性
负载均衡类型,目前的取值有 3 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1", 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 
    互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
4. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
5. balance="3", 所有读请求随机的分发到 writerHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType 属性
负载均衡类型
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准.
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。

测试负载均衡

# 登录四个库
mysql -uroot -p"@Baipiao123"
show databases;
use db1;

# 关闭链接 分别创建四个库
mysql -uroot -p"@Baipiao123" -e"stop slave;"
stop slave;

# 每个库执行一个   每个库执行一个    每个库执行一个
# 注意哈  这个四个命令是在四个库中执行的  这个时候数据是不一样的 
# 这里是为了测试  是不是完成了读写分离
mysql -uroot -p"@Baipiao123" -e"create table db1.kk1(id int);"
mysql -uroot -p"@Baipiao123" -e"create table db1.kk2(id int);"
mysql -uroot -p"@Baipiao123" -e"create table db1.kk3(id int);"
mysql -uroot -p"@Baipiao123" -e"create table db1.kk4(id int);"


# 这里是 sql 语法
create table db1.kk1(id int);
create table db1.kk2(id int);
create table db1.kk3(id int);
create table db1.kk4(id int);




# 登录假库
mysql -P8066 -uroot -p123456 -hmycat 

# 进入到假库中
use TESTDB;

# 多次执行这个命令 可以看到如图的 现象  
show databases;

在这里插入图片描述


🌸🌸花开的时候,那便是春风带给来的盛装和温暖,每年都是这样。爱也一样,三千年不会变。🌸🌸

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网站被恶意扫描怎么办(上WAF)

在网络安全领域&#xff0c;有一大类工具被广泛使用&#xff0c;且作用不可忽视&#xff0c;它就是网络安全扫描器。扫描器是一种专门设计用来评估计算机、网络或者应用中已知的弱点的计算机程序&#xff0c;但是很多人恶意使用&#xff0c;找到网站弱点进行攻击。 扫描器的种…

【csapp】cachelab

文章目录 Part APart B32 * 3264 * 6461 * 67 实验全程参考大佬的博客CS:APP3e 深入理解计算机系统_3e CacheLab实验 &#xff0c;感觉大佬在矩阵转置那块介绍的还是有些简略&#xff0c;我自己又做了点动图加以补充理解。膜拜大佬&#xff01; Part A 先解决解析命令行参数的…

fpga verilog rs232 发送模块实现

RS-232是一种串行通信协议&#xff0c;用于在计算机和其他外部设备之间进行数据传输。RS-232定义了电气特性、信号级别、机械特性和传输速率等规范&#xff0c;为串行通信提供了一种标准化的接口。 RS-232通常使用DB9连接器&#xff0c;用于传输和接收数据、控制信号以及地线连…

VMware17Pro虚拟机安装Linux CentOS 7.9(龙蜥)教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装Linux4.1 新建虚拟机4.2 安装操作系统4.2.1 选择 ISO 映像文件4.2.2 开启虚拟机4.2.3 选择语言4.2.4 软件选择4.2.5 禁用KDUMP4.2.6 安装位置配置4.2.7 网络和主机名配置…

小学班委有哪些职位

在成长的道路上&#xff0c;班委是一个不可或缺的角色。它不仅是一个职位&#xff0c;更是一份责任和担当。对于孩子们来说&#xff0c;成为班委不仅意味着荣誉&#xff0c;更意味着在集体中发挥自己的力量&#xff0c;为班级做贡献。 那么&#xff0c;小学班委有哪些职位呢&am…

小学班级管理方法和措施

开学了&#xff0c;宝贝们步入小学的大门&#xff0c;新环境、新同学、新起点。如何为孩子们营造一个和谐、有序的学习环境&#xff1f;这离不开我们班主任的精心管理。 制定明确的班规 教室里&#xff0c;同学们有秩序地坐着&#xff0c;这得益于我们班的班规。但班规不是摆设…

Java SPI 机制介绍和实战

目录 什么是 Java SPI Java SPI 原理 Java SPI 使用场景 1. 框架扩展与插件化 2. 服务加载与扩展 3. 组件化和模块化设计 4. 数据转换和格式化 5. 插件化应用程序 Java SPI 实战 步骤 1&#xff1a;定义服务接口 步骤 2&#xff1a;实现服务提供者 步骤 3&#xf…

UE5 C++(九)— 静态、动态加载类和资源

文章目录 前提静态加载类和资源静态加载资源静态加载类 动态加载类和资源动态资源动态加载类 前提 有必要说一下&#xff0c;静态这块内容加载时我用UE5.2版本出现调用静态资源不是显示问题&#xff0c;修改后容易崩。所以&#xff0c;这里不建议5.2版本&#xff0c;直接用5.3…

VS2005环境下编译C++报错

WinGenerateKey.obj : error LNK2011: 未链接预编译对象&#xff1b;映像可能不能运行 解决&#xff1a;连接器->输入&#xff0c;添加&#xff1a;..\WinGenerateKey\Debug\stdafx.obj 或者 ..\WinGenerateKey\Release\stdafx.obj 报错&#xff1a;fatal error C1083: Can…

【数据结构和算法】找到最高海拔

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…

【WSL2】安装和配置ubuntu

文章目录 1. 安装WSL22. 安装ubuntu2.1. 通过Microsoft Store2.1. 通过命令行 3. ubuntu的使用3.1. 创建管理员root账户3.2. 换源3.3. 安装图形化界面GNOME 1. 安装WSL2 在控制面板 - 程序 - 程序与功能中点击启用或关闭Windows功能&#xff0c;选择 虚拟机平台适用于Linux的W…

阅读2023:让每一天都徜徉于书海之中

阅读&#xff0c;是中华民族的优良传统&#xff0c;也是创新发展的永续动力。2023年初&#xff0c;教育部、中央宣传部等八部门印发《全国青少年学生读书行动实施方案》&#xff0c;推动青少年学生阅读深入开展&#xff0c;促进全面提升育人水平。 阅读不仅是文化传承的重要手…

AI智能五子棋这个逆袭.高.智.商.人群的神器竟然是它果断入手

「当当狸智能五子棋」新品现已震撼上市发售啦&#xff0c;将迎来一个全新的对弈时代 市面上首款将智能语音交互&#xff0c;AI陪玩功能融合在棋盘里&#xff0c;且不用摆子收纳的新式棋盘五子棋。 一款打破传统&#xff0c;全面革新&#xff0c;融合AI智能陪玩模式的五子棋诞…

JavaScript基础知识点总结:从零开始学习JavaScript(二)

如果大家感感兴趣也可以去看&#xff1a; &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

Vue使用Element table表格格式化GMT时间为Shanghai时间

Vue使用Element表格格式化GMT时间为Shanghai时间 说明 阿里巴巴java开发规范规定&#xff0c;数据库必备gmt_create、gmt_modified字段&#xff0c;使用的是GMT时间&#xff0c;在中国使用必然要转换我中国时间。 在阿里巴巴的Java开发规范中&#xff0c;要求每个表都必备三…

英特尔A770显卡介绍与解读

基础介绍 英特尔A770显卡。这是英特尔推出的一款高性能显卡&#xff0c;属于他们的Arc系列。这个系列的显卡主要面向游戏玩家和专业内容创作者&#xff0c;提供高性能图形处理能力。 A770显卡配备了先进的特性&#xff0c;例如支持硬件级光线追踪、AI加速技术&#xff0c;以及…

【小白专用】C# 压缩文件 ICSharpCode.SharpZipLib.dll效果:

插件描述&#xff1a; ICSharpCode.SharpZipLib.dll 是一个完全由c#编写的Zip, GZip、Tar 、 BZip2 类库,可以方便地支持这几种格式的压缩解压缩, SharpZipLib 的许可是经过修改的GPL&#xff0c;底线是允许用在不开源商业软件中&#xff0c;意思就是免费使用。具体可访问ICSha…

【数据结构】——期末复习题题库(2)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

基于Java SSM框架实现宜百丰超市进销存购物商城系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现宜百丰超市进销存购物商城系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被…

【温故而知新】HTML回流和重绘

概念 HTML回流和重绘是浏览器渲染页面时的两个重要过程。 回流&#xff08;reflow&#xff09;指的是浏览器在渲染页面时&#xff0c;根据页面的结构和样式计算元素的布局和位置。当页面布局或元素位置发生变化时&#xff0c;浏览器需要重新计算元素的布局&#xff0c;这个过…