Mycat(二)读写分离(Mysql读写分离->MyCat读写分离)、安装JDK

文章目录

  • 概述
  • 搭建 MySQL 数据库主从复制
    • MySQL 主从复制原理
    • 主机配置(atguigu01)
    • 从机配置(atguigu02)
    • 主机、从机重启 MySQL 服务
    • 主机从机都关闭防火墙
    • 在主机上建立帐户并授权 slave
    • 在从机上配置需要复制的主机
    • 主机新建库、新建表、insert 记录,从机复制
    • 停止从服务复制功能
    • 重新配置主从
  • Mycat安装
    • 下载
    • 启动
  • Mycat读写分离配置
    • 创建逻辑库
    • 重新启动 Mycat
    • 验证读写分离

概述

通过 Mycat 和 MySQL 的主从复制配合搭建数据库的读写分离,实现 MySQL 的
高可用性。
将搭建:一主一从、双主双从两种读写分离模式。
在这里插入图片描述

搭建 MySQL 数据库主从复制

Docker搭建主从(建议Docker创建,方便快速)
https://blog.csdn.net/qq_45742250/article/details/137911684

MySQL 主从复制原理

在这里插入图片描述

主机配置(atguigu01)

修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT

一般用ROW,为了后续演示使用STATEMENT
在这里插入图片描述

binlog 日志有三种格式,分别为 STATMENT 、 ROW 和 MIXED。

在 MySQL 5.7.7 之前,默认的格式是 STATEMENT , MySQL 5.7.7 之后,默认值是 ROW。日志格式通过 binlog-format 指定。

  • STATMENT:基于SQL 语句的复制( statement-based replication, SBR ),每一条会修改数据的sql语句会记录到binlog 中 。
    优点:不需要记录每一行的变化,减少了 binlog 日志量,节约了 IO , 从而提高了性能;
    缺点:在某些情况下会导致主从数据不一致,比如执行sysdate() 、 slepp() 等 。
  • ROW:基于行的复制(row-based replication, RBR ),不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了 。
    优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题 ;
    缺点:会产生大量的日志,尤其是alter table 的时候会让日志暴涨
  • MIXED:基于STATMENT 和 ROW 两种模式的混合复制(mixed-based replication, MBR ),一般的复制使用STATEMENT 模式保存 binlog ,对于 STATEMENT 模式无法复制的操作使用 ROW 模式保存 binlog

从机配置(atguigu02)

修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

主机、从机重启 MySQL 服务

主机从机都关闭防火墙

在主机上建立帐户并授权 slave

#在主机MySQL里执行授权命令
CREATE USER 'slave2'@'%' IDENTIFIED BY '123123';
GRANT REPLICATION SLAVE ON *.* TO 'slave2'@'%';
#此语句必须执行。否则见下面。
ALTER USER 'slave2'@'%' IDENTIFIED WITH mysql_native_password BY '123123';
flush privileges;
#查询master的状态
show master status;
#记录下File和Position的值
#执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化

在这里插入图片描述

在从机上配置需要复制的主机

#复制主机的命令
CHANGE MASTER TO MASTER_HOST='主机的IP地址',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;
# 下面图1

#启动从服务器复制功能
start slave;
#查看从服务器状态
show slave status\G;
#下面两个参数都是Yes,则说明主从配置成功!
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes

图1
在这里插入图片描述

主机新建库、新建表、insert 记录,从机复制

#建库语句
CREATE DATABASE mydb1;
#建表语句
CREATE TABLE mytbl(id INT,NAME VARCHAR(50));
#插入数据
INSERT INTO mytbl VALUES(1,"zhang3");

停止从服务复制功能

stop slave;

重新配置主从

stop slave;
reset master;

Mycat安装

需要JDK环境,可参考下载这一节末尾出现启动不了没有JDK问题

下载

镜像下载:
https://www.topunix.com/post-12169.html
下载对应的 tar 安装包,以及对应的 jar 包
tar(zip)包 :
http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.20.zip
jar 包 :
http://dl.mycat.org.cn/2.0/1.21-release/

把这个 jar 放进解压的 tar 中的 mycat\lib 文件夹下
在这里插入图片描述
把整合好的文件夹拷贝到 linux 下 /usr/local/
在这里插入图片描述
修改文件夹及以下文件的权限
修改成最高权限,否则运行启动命令时,会因权限不足而报错

cd /usr/local/mycat/bin
chmod 777 *linux*
chmod 777 mycat
cd /usr/local/mycat
# 启动报错的话建一下
mkdir logs

启动

1、mysql中配置用户

CREATE USER 'mycat'@'%' IDENTIFIED BY '123456';
--必须要赋的权限mysql8才有的
GRANT XA_RECOVER_ADMIN ON *.* TO 'root'@'%';
---视情况赋权限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
flush privileges;

2、修改mycat的prototype的配置
启动mycat之前需要确认prototype数据源所对应的mysql数据库配置,修改对应的
user(用户),password(密码),url中的ip

# password、url、user至少需要修改
vim conf/datasources/prototypeDs.datasource.json
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"prototypeDs",
"password":"123123",
"type":"JDBC",
"url":"jdbc:mysql://localhost:3306/mycat?useUnicode=true&serverTimezone=Asi
a/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}

3、验证数据库访问情况
Mycat 作为数据库中间件要和数据库部署在不同机器上,所以要验证远程访问
情况

mysql -uroot -p123123 -h 192.168.140.100 -P 3307
mysql -uroot -p123123 -h 192.168.140.100 -P 3308
#如远程访问报错,请建对应用户
grant all privileges on *.* to root@'缺少的host'
identified by '123123';

4、启动mycat
linux启动命令

cd mycat/bin
./mycat start
./mycat status
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动(暂未实现)
./mycat remove 取消随系统自动启动(暂未实现)
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态…

出现启动不了没有JDK问题
Java Downloads | Oracle

cd /opt
tar -zxvf jdk-8u381-linux-x64.tar.gz
# 1、用vim编辑器来编辑profile文件(按“i”进入编辑)
vim /etc/profile
 
# 2、在文件末尾添加以下内容
 
export JAVA_HOME=/opt/jdk1.8.0_381
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile

Mycat读写分离配置

逻辑库的库名必须和物理库的 库名完全一样,如果不一样,逻辑库无法自动更新物理库中的数据表

创建逻辑库

# 检查mycat是否运行,有防火墙的关闭防火墙否则navicate远程连接不上
ps -ef|grep mycat

在这里插入图片描述

通过navicate连接mycat,创建逻辑库
在这里插入图片描述
在Mycat里创建数据库mydb1
创建db2逻辑库

create database mydb1;

多生成一个mydb1.schema.json
在这里插入图片描述

修改mydb1.schema.json 指定数据源 “targetName”:“prototype”,配置主机数据源

vim /usr/local/mycat/conf/schemas/mydb1.schema.json
# "targetName":"prototype"
/*+ mycat:createDataSource{ "name":"rwSepw","url":"jdbc:mysql://192.168.217.129:3307/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"123456" } */;

/*+ mycat:createDataSource{ "name":"rwSepr","url":"jdbc:mysql://192.168.217.129:3308/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"123456" } */;

查询数据源

/*+ mycat:showDataSources{} */;

更新集群信息

/*!mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */;

查询配置集群情况

/*+ mycat:showClusters{} */;

在这里插入图片描述
查看集群配置文件

vim /usr/local/mycat/conf/clusters/prototype.cluster.json

在这里插入图片描述
readBalanceType:查询负载均衡策略

可选值:
BALANCE_ALL(默认值):获取集群中所有数据源
BALANCE_ALL_READ:获取集群中允许读的数据源
BALANCE_READ_WRITE:获取集群中允许读写的数据源,但允许读的数据源优先
BALANCE_NONE:获取集群中允许写数据源,即主节点中选择

switchType

NOT_SWITCH:不进行主从切换
SWITCH:进行主从切换

重新启动 Mycat

./mycat restart

如果不放心可使用下面命令查看是否已经启动

ps -ef|grep mycat

验证读写分离

在写主机数据库表mytbl中插入带系统变量数据,造成主从数据不一致

INSERT INTO myth1 VALUES(2,@@hostname);

在这里插入图片描述
在这里插入图片描述
在mycat中执行下面sql会出现交替读取两个物理库

select * from myth1;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux基本指令(2)

目录 mv指令: cat: more指令: less指令: head指令: tail指令: mv指令: 说明: mv命令是move的缩写,可以用来移动文件或者文件改名(move(rename)files),是linux系统下…

LMDeploy 量化部署 LLM-VLM 实践 学习笔记

视频链接 https://www.bilibili.com/video/BV1tr421x75B/?vd_sourcea1ce254b4a97f9f687a83e661793cb2c 什么是模型部署 部署指的是已经开发好的大模型投入使用,要把模型部署到服务器或者移动端里,如何在有限的资源里加载大模型? 比如你好不…

2024年信息教育化与语言艺术国际学术会议(IACIELA 2024)

2024年信息教育化与语言艺术国际学术会议(IACIELA 2024) 2024 International Conference on Information Education and Language Art 一、【会议简介】 2024年信息教育化与语言艺术国际学术会议,将探讨教育与语言艺术的结合。 在当今的信息时代,语言艺术…

ElasticSearch批处理

在刚才的新增当中,我们是一次新增一条数据。那么如果你将来的数据库里有数千上万的数据,你一次新增一个,那得多麻烦。所以我们还要学习一下批量导入功能。 也就是说批量的把数据库的数据写入索引库。那这里的需求是,首先利用mybat…

C#基础|StringBuilder字符串如何高效处理。

哈喽,你好,我是雷工。 字符串处理在C#程序开发中是使用频率比较高的,但常规的字符串处理方式对内存占用比较多,为了优化内存,减少不必要的内存浪费,引入了StringBuilder类。 下面学习下StringBuilder类的使…

牛客NC99 多叉树的直径【较难 深度优先 Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/a77b4f3d84bf4a7891519ffee9376df3 思路 核心就是树的最大直径(globalMax)一定是以某一个node为root最长的两个path-to-leaf. 就是普通dfs的同时算路径长度。时间: O(n), DFS一次 空间: O(n)参考答案Java impo…

(二十一)C++自制植物大战僵尸游戏僵尸游戏关卡结束数据处理

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs 文件位置 代码实现的文件在Class\Scenes\GameScene文件夹中,如下图所示。 GameEndLayer.h class GSGameEndLayer :public LayerColor { public:CREATE_FUNC(GSGameEndLayer);void successfullEntry();void brea…

大田场景下的路径检测论文汇总

文章目录 2020Visual Servoing-based Navigation for Monitoring Row-Crop Fields 2020 Visual Servoing-based Navigation for Monitoring Row-Crop Fields code: https://github.com/PRBonn/visual-crop-row-navigation 摘要: 自主导航是野外机器人执行精确农业…

C++ day5

#include <iostream> using namespace std; class Person {string name;int *age; public:Person():name("zhangsan"),age(new int(18)){cout << "Person的无参构造" << endl;}Person(string name,int age):name("zhangsan"),…

喜报!得帆被评为2024年上海市重点服务独角兽企业

月23日&#xff0c;在市经济信息化委和闵行区政府指导下“2024年上海市重点服务独角兽&#xff08;潜力&#xff09;企业榜单发布会暨高质量发展产业对接会”在上海成功举办。 会上正式公布《2024年上海市重点服务独角兽&#xff08;潜力&#xff09;企业榜单》&#xff0c;上…

08_Scala函数式编程重点

文章目录 函数式编程1.创建简单函数2.可变参数3.默认参数4.函数式编程&#xff0c;代码简化 函数式编程 函数式编程是对功能进行封装&#xff0c;最终是需要等号 def test() {} //于python略有不同1.创建简单函数 // 1.定义函数def test(): Unit {}牛逼之处就是可以在m…

由于找不到msvcr120.dll,无法继续执行代码

在日常编程中&#xff0c;缺少关键的msvcr120.dll文件可能会导致代码无法执行&#xff0c;给我们带来不便。针对缺少msvcr120.dll文件的情况&#xff0c;我们可以采取一些有效的解决方法来解决这一问题。通过下载安装或使用Visual C Redistributable工具安装该msvcr120.dll文件…

数据结构四:线性表之带头结点的单向循环链表的设计

前面两篇介绍了线性表的顺序和链式存储结构&#xff0c;其中链式存储结构为单向链表&#xff08;即一个方向的有限长度、不循环的链表&#xff09;&#xff0c;对于单链表&#xff0c;由于每个节点只存储了向后的结点的地址&#xff0c;到了尾巴结点就停止了向后链的操作。也就…

STM32G431RBT6之LCD与LED配置

首先,配置时钟树,时钟树的配置在我的另外一篇博客里,这里不再赘述. LCD与LED具有共同的IO口,同时创建工程较好. 打开原理图,发现LED的IO口是PC8~PC15,还有一个容易看漏的PD2.LCD的IO口是PC0到PC15. 当然,看产品手册也可以知道,但是还是推荐大家看原理图. 打开cubumx,给PC0~PC…

如何讲好ppt演讲技巧(4篇)

如何讲好ppt演讲技巧&#xff08;4篇&#xff09; 如何讲好PPT演讲技巧&#xff08;四篇&#xff09; **篇&#xff1a;精心准备&#xff0c;奠定演讲基础 一个成功的PPT演讲&#xff0c;离不开精心的准备。首先&#xff0c;要确定演讲的主题和目标&#xff0c;确保演讲内容清…

应用实战|只需几步,即可享有外卖订餐小程序

本示例是一个简单的外卖查看店铺点菜的外卖微信小程序&#xff0c;小程序后端服务使用了MemFire Cloud&#xff0c;其中使用到的MemFire Cloud功能包括&#xff1a; 其中使用到的MemFire Cloud功能包括&#xff1a; 云数据库&#xff1a;存储外卖微信小程序所有数据表的信息。…

服务端不 listen 可以创建 tcp 连接吗

这个问题有三类答案。 上来就撸 linux kernel 源码&#xff0c;折腾半天&#xff0c;哦&#xff0c;终于在 tcp_rcv_state_process 里找到了 tcp_rcv_synsent_state_process 调用&#xff0c;后者包含&#xff1a; if (th->syn) {/* We see SYN without ACK. It is attemp…

前端JS必用工具【js-tool-big-box】,Number数值转换的方法调用学习

这一小节&#xff0c;我们针对前端工具包&#xff08;npm&#xff09;js-tool-big-box的使用做一些讲解&#xff0c;主要是针对Number数值型转换的一些方法使用。 目录 前言 1 安装和引入 2 千位逗号分割 3 判断是否大于0 4 判断是否大于0的整数 5 生成指定范围内的随机数…

leetcode 循环列表的插入(Python)

题目如果不进行思考&#xff0c;巨多坑。 首先我们需要找到列表中的最小值&#xff0c;最大值这个节点&#xff0c;因为找到后可以与我们的新元素进行比较厚插入。 找到最小值&#xff0c;最大值需要循环一遍列表&#xff0c;如果当前cur元素的值<nex元素的值&#xff0c;…

堆的应用——堆排序

堆排序 堆排序是一种基于比较的排序算法&#xff0c;它利用堆这种数据结构所设计。堆是一个近似完全二叉树的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子结点的键值或索引总是小于&#xff08;或者大于&#xff09;它的父结点。 堆排序可以分为两个主要步骤&#…