MySQL主从复制、读写分离(MayCat2)实现数据同步

news2024/11/20 23:18:58

文章目录

    • 1.MySQL主从复制原理。
    • 2.实现MySQL主从复制(一主两从)。
    • 3.基于MySQL一主两从配置,完成MySQL读写分离配置。(MyCat2)

1.MySQL主从复制原理。

MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。

主从介绍
MySQL主从又叫Replication、AB复制。简单讲就是A与B两台机器做主从后,在A上写数据,另外一台B
也会跟着写数据,实现数据实时同步。有这样几个关键点:
1)MySQL主从是基于binlog,主上需开启binlog才能进行主从;
2)主从过程大概有3个步骤;
3)主将更改操作记录到binlog里;
4)从将主的binlog事件(SQL语句) 同步本机上并记录在relaylog里;
5)从根据relaylog里面的SQL语句按顺序执行。
二进制日志
二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制, 就是通过该binlog实现的。默认MySQL是未开启该日志的
主从作用
主从作用有:实时灾备,用于故障切换;读写分离,提供查询服务;备份,避免影响业务。
主从形式
在这里插入图片描述
基本原理
在这里插入图片描述
实验环境
基于centos7.9、mysql5.7

2.实现MySQL主从复制(一主两从)。

这里我借助docker来完成
①拉取mysql镜像并运行三个mysql容器
mysql1为主
mysql2和mysql3为从

docker pull mysql:5.7		#拉取mysql镜像
docker run --name mysql1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names=1
docker run --name mysql2 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names=1
docker run --name mysql3 -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names=1

②修改mysql配置文件
将docker上的文件拷贝出来,方便修改

mkdir /mysqlms
cd /mysqlms
docker cp mysql1:/etc/my.cnf mysql1.cnf
docker cp mysql2:/etc/my.cnf mysql2.cnf
docker cp mysql3:/etc/my.cnf mysql3.cnf

修改主的配置文件
mysql1
在[mysqld]下添加:

server-id=1	#服务器的标识
log-bin=master.bin	#打开日志文件功能	

修改两个从的配置文件
mysql2
在[mysqld]下添加

server-id=2

mysql3
在[mysqld]下添加

server-id=3

在这里插入图片描述
③配置文件修改后,复制到容器里面

docker cp mysql1.cnf mysql1:/etc/my.cnf
docker cp mysql2.cnf mysql2:/etc/my.cnf
docker cp mysql3.cnf mysql3:/etc/my.cnf

④启动mysql

[root@www mysqlms]# docker start mysql1 mysql2 mysql3
mysql1
mysql2
mysql3

用Navicat测试连接
在这里插入图片描述
⑤进入主机里面执行相关配置

[root@www mysqlms]# docker exec -it mysql1 bash
bash-4.2# mysql -uroot -p123456
#创建用户:
mysql> create user 'rep'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
#给该用户授予权限:
mysql> grant replication slave on *.* to 'rep'@'%';
Query OK, 0 rows affected (0.00 sec)
#刷新权限:
mysql>  flush privileges;
Query OK, 0 rows affected (0.01 sec)

⑥ 进入从机里面执行相关配置(mysql2 和mysql3配置相同)
这里以mysql2为例
查看主的(mysql1)的状态

在这里插入图片描述

[root@www ~]# docker exec -it mysql2 bash
bash-4.2# mysql -uroot -p123456
mysql> change master to
-> master_host="192.168.15.136",master_port=3307,
-> master_user="rep",
-> master_password="123456",
-> master_log_file="master.000001",
-> master_log_pos=745;
Query OK, 0 rows affected, 2 warnings (0.07 sec)

启动slave并查看状态

在这里插入图片描述
成功标志:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

⑦测试
在mysql1 里面创建数据库,看mysq2、mysql3 有没有复制过去
mysql1上
在这里插入图片描述
mysq2、mysql3 上
在这里插入图片描述
主从复制成功!!!

3.基于MySQL一主两从配置,完成MySQL读写分离配置。(MyCat2)

前提,先搭建好MySQL的主从配置
首先确保有jdk环境

[root@s2 ~]# java -version
java version "1.8.0_361"
Java(TM) SE Runtime Environment (build 1.8.0_361-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.361-b09, mixed mode)

配置mycat环境

#安装程序包:
wget -c http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip
#jar包
wget -c http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies.jar

解压到data目录下

[root@s2 ~]# mkdir /data
[root@s2 ~]# unzip mycat2-install-template-1.21.zip -d /data

修改权限
把bin目录的文件加执行权限:

cd /data/mycat/bin
chmod +x *

把所需的jar复制到mycat/lib目录

cp ~/mycat2-1.21-release-jar-with-dependencies.jar /data/mycat/lib/

MyCat的目录结构

 ll /data/mycat/
total 8
drwxr-xr-x 2 root root 4096 Mar 5 2021 bin
drwxr-xr-x 9 root root 275 Mar 5 2021 conf
drwxr-xr-x 2 root root 4096 Mar 20 14:11 lib
drwxr-xr-x 2 root root 6 Mar 5 2021 logs

bin 执行命令的目录
conf 配置文件
lib 依赖包
logs 日志包
启动一个3306的MySQL
因为mycat代理连接启动时需要有一个默认的数据源,所以我们在启动的时候先为其准备一个数据源,
接下来我们使用docker启动

# 配置docker加速
sudo mkdir -p /etc/docker
# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://rvq9mjyt.mirror.aliyuncs.com"]
}
EOF
# systemctl daemon-reload
# systemctl restart docker
# docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
--lower_case_table_names=1

配置物理库地址
在启动之前我们要配置物理库的地址,要不然MyCAT启动就会报错。

[root@localhost ~]# vim /data/mycat/conf/datasources/prototypeDs.datasource.json 

{
        "dbType":"mysql",
        "idleTimeout":60000,
        "initSqls":[],
        "initSqlsGetConnection":true,
        "instanceType":"READ_WRITE",
        "maxCon":1000,
        "maxConnectTimeout":3000,
        "maxRetryCount":5,
        "minCon":1,
        "name":"prototypeDs",
        "password":"123456",
        "type":"JDBC",
        "url":"jdbc:mysql://localhost:3306?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
        "user":"root",
        "weight":0
}

配置说明:
1)dbType:数据源类型
2)name:数据源名字
3)password:后端MySQL的密码
4)url:后端MySQL的JDBC连接地址
5)user:后端MySQL的用户名
6)weight:配置数据源负载均衡的使用权重

启动MyCat

cd /data/mycat/bin
./mycat start 

额外介绍:

./mycat console 前台运行
./mycat install 添加到系统自动启动
./mycat remove 取消随系统自动启动
./mycat restart 重启
./mycat pause 暂停
./mycat status 查看启动状态

查看logs/wrapper.log文档
如果出现以下的信息就说明启动成功了。

cat /data/mycat/logs/wrapper.log

在这里插入图片描述
** 连接MyCAT**
用Navicat连接在这里插入图片描述
也可在虚拟机上看是否连接成功

# yum install -y mariadb
# mysql -uroot -p123456 -P8066
[root@node4 bin]# mysql -uroot -p123456 -P8066 -h127.0.0.1
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 5.7.33-mycat-2.0 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> \q
Bye

MyCAT2的主从配置
在上面的操作中,我们已经搭建好MySQL的主从配置,登录MyCAT 2在MyCAT2里面操作,也就是连接8066这个端口。
目标:将mysql1(主)设置为可读写的数据源,将mysql2(从)和mysql3(从)设置为只读的数据源。

以下操作均在Navicat上执行,但实际修改和创建的是/data/mycat/下的文件
创建数据源
选择mycat数据库,新建查询

# 添加读写的数据源
/*+ mycat:createDataSource{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"mysql1",
"password":"123456",
"type":"JDBC",
"url":"jdbc:mysql://127.0.0.1:3307/db1?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
"user":"root",
"weight":0
} */;

# 添加读的数据源

/*+ mycat:createDataSource{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"mysql2",
"password":"123456",
"type":"JDBC",
"url":"jdbc:mysql://127.0.0.1:3308/db1?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
"user":"root",
"weight":0
} */;

/*+ mycat:createDataSource{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"mysql3",
"password":"123456",
"type":"JDBC",
"url":"jdbc:mysql://127.0.0.1:3309/db1?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
"user":"root",
"weight":0
} */;

在这里插入图片描述
查询数据源

/*+ mycat:showDataSources{} */

在这里插入图片描述
创建集群

/*! mycat:createCluster{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetry":3,
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
"masters":[
"mysql1"
],
"maxCon":2000,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"replicas":[
"mysql1","mysql2"
],
"switchType":"SWITCH"
} */;

查询集群

/*+ mycat:showClusters{} */

在这里插入图片描述创建逻辑库

CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

此时/data/mycat/conf/schemas/db1.schema.json文件被创建
修改逻辑库的数据源
修改/data/mycat/conf/schemas/db1.schema.json
在里面添加 “targetName”:“prototype”,

[root@localhost conf]# vim /data/mycat/conf/schemas/db1.schema.json 

{
        "customTables":{},
        "globalTables":{},
        "normalProcedures":{},
        "normalTables":{},
        "schemaName":"db1",
        "shardingTables":{},
        "targetName":"prototype",
        "views":{}
}

测试读写分离是否成功(在MyCAT里面测试)
重启MyCAT(因为修改了数据源文件):

[root@localhost conf]# cd /data/mycat/bin/
[root@localhost bin]# ./mycat restart
Stopping mycat2...
Stopped mycat2.
Starting mycat2...
[root@localhost bin]# 

在MyCAT里面创建一个sys_user表:

use db1;
CREATE TABLE SYS_USER( ID BIGINT PRIMARY KEY, USERNAME VARCHAR(200) NOT NULL,
ADDRESS VARCHAR(500));

通过注释生成物理库和物理表:
如果物理表不存在,在 MyCAT2 能正常启动的情况下,根据当前配置自动创建分片表,全局表和物理
表:

/*+ mycat:repairPhysicalTable{} */;

查看后端物理库:发现物理库和物理表都生成了。
在这里插入图片描述
在MyCAT里面向sys_user表添加一条数据:

use db1;
INSERT INTO SYS_USER(ID,USERNAME,ADDRESS) VALUES(1,"XIAOMING","WUHAN");

在这里插入图片描述
修改MySQL里面数据的让数据不一样:(仅用于测试验证)
mysql1上将ADDRESS字段修改成mysql1
mysql2上将ADDRESS字段修改成mysql2
mysql3上将ADDRESS字段修改成mysql3

在这里插入图片描述

在MyCAT里面查询数据,会发现每次查询的结果不一样:
在这里插入图片描述
在这里插入图片描述
MyCAT2主从搭建完成。

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

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

相关文章

AI编程助手 Kodezi : 记录、分享一个 VS code 插件

目录0. 概述1. 安装 / 功能介绍1.1 安装1.2 功能介绍1.2.1 Debug1.2.2 代码优化1.2.3 代码转换1.2.4 逐行注释1.2.5 多行注释1.2.6 生成文档1.2.7 生成代码2. KodeziChat 聊天机器人2.1 聊天机器人功能介绍2.2 如何使用 KodeziChat &#xff1f;3. Kodezi 版本介绍3.1 免费版3.…

【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题三

相关链接 【2023年第十一届泰迪杯数据挖掘挑战赛】C题泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一 【2023年第十一届泰迪杯数据挖掘挑战赛】C题泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题二 【2023年第十一届泰迪杯数据挖…

【软件应用】TamperMonkey同步操作

不废话&#xff0c;记录一些关键点 要设置同步&#xff0c;先得打开高级设置模式 众所周知&#xff0c;这里可以设置同步&#xff0c;建议设置为WebDAV同步&#xff0c;这样通用性更强 至于选择啥网盘就看自己的需求了&#xff0c;支持WebDAV的网盘还是很多的&#xff0c;甚…

数据库设计案例

一个专辑可以包含多个曲目&#xff0c;一个曲目只能属于一个专辑 一对多 一个专辑可以包含多条短评&#xff0c;一条短语只能属于一个专辑 一对多 一个用户可以包含多条短评&#xff0c;一个短评只能属于一个用户 一对多 一个专辑可以属于多个用户&#xff0c;一个用户…

04-vue3侦听器

文章目录1.watch1.侦听数据源类型2.demo2.watchEffect函数3.watch vs. watchEffect1.watch 计算属性允许我们声明性地计算衍生值。然而在有些情况下&#xff0c;我们需要在状态变化时执行一些“副作用”&#xff1a;例如更改 DOM&#xff0c;或是根据异步操作的结果去修改另一…

熬大夜~ 阿里P8架构师总结微服务设计企业架构转型之道笔记

前言 本文涉及两个方面的知识体系&#xff0c;即企业架构知识体系和软件架构知识体系。 企业架构和软件架构虽然都与IT相关&#xff0c;但其知识体系是完全不同的两个领域。一般而言&#xff0c;搞企业架构的人士不明白软件架构的细节和实现&#xff0c;而从事软件架构的架构…

如何评价一款RTK差分基站的性能?

RTK是Real-Time Kinematic(实时动态)的缩写&#xff0c;是一种利用载波相位观测进行实时动态相对定位的技术&#xff0c;它能够实时提供测站点在指定坐标系中的三维定位结果&#xff0c;并达到厘米级精度。国内有时也将利用RTK技术为卫星定位设备提供厘米级修正服务的RTK基站简…

114. 二叉树展开为链表 Python

文章目录一、题目描述示例 1示例 2示例 3二、代码三、解题思路一、题目描述 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终…

基于jsp的公交查询系统源码数据库论文

目录 摘 要 1 Abstract 1 1 绪论 1 1.1 选题背景 1 1.2 国内外发展状况 1 1.3 选题的目的 1 1.4 研究手段及意义 1 2相关技术简介 3 2.1Jsp技术介绍 3 2.2 MyEclipse简介 4 2.3 数据库技术 4 2.3.1 数据库的体系结构 4 2.3.2 数据库管理系统&#xff08;D…

(十七)排序算法-基数排序

1 基本介绍 1.1 概述 &#xff08;1&#xff09;基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff0c;顾名思义&#xff0c;它是通过键值的各个位的值&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;达到排序的作用。 &#xff08;2&#x…

Denoising Diffusion Probabilistic Model,DDPM阅读笔记——(一)

Denoising Diffusion Probabilistic Model一、写在前面二、相关数学知识简介二、生成模型简介&#xff1a;三、变分自编码器概述&#xff08;VAE&#xff09;一、写在前面 人工智能生成内容&#xff08;AI Generated Content&#xff0c;AIGC&#xff09;近年来成为了非常前沿…

2023最新面试题-Java-2

基础语法 1. Java有哪些数据类型 定义&#xff1a;Java语言是强类型语言&#xff0c;对于每一种数据都定义了明确的具体的数据类型&#xff0c;在内存中分配了不同 大小的内存空间。 细化的数据类型就是占用空间的基本元素。分类&#xff1a;基本数据类型 数值型 整数类型…

MySQL-事务处理

MySQL事务 什么是事务 数据中的事务是指数据库执行的一些操作&#xff0c;这些操作最终要么全部执行成功&#xff0c;要么全部失败&#xff0c;不会存在部分成功&#xff0c;部分失败的情况 如果在事务的支持下&#xff0c;最终有两种结果&#xff1a; 操作成功&#xff1a;…

推荐一款 AI 脑图软件,助你神速提高知识体系搭建

觅得一款神器&#xff0c;接近我理想中&#xff0c;搭建知识体系的方法&#xff0c;先来看视频作为数据库开发或管理者&#xff0c;知识体系搭建尤为重要。来看看近些年缺乏足够数据库知识面造成的危害&#xff1a;a/ 数据安全风险&#xff1a;例如&#xff0c;2017年Equifax数…

Dubbo之认识RPC架构

文章目录一、互联网架构演变1.1 RPC架构1.2 SOA架构1.3 微服务架构1.4 SOA vs 微服务二、RPC 基本概念2.1 RPC 协议2.2 RPC 框架2.3 RPC 运行流程2.4 RPC vs HTTP提示&#xff1a;以下是本篇文章正文内容&#xff0c;Dubbo 系列学习将会持续更新 官方文档&#xff1a;https://c…

电池连接接触电阻的优化研究

金属与金属接触处的接触电阻主要受以下因素影响&#xff1a; 表面结构机械负载 表面结构可以通过表面平整度、表面氧化和吸水性进一步描述。 电池组中的这些接头将采用焊接或螺栓连接方式。最初最容易想到的是螺栓母线接头。 螺栓扭矩可用于估算力&#xff0c;从而估算接触压…

mvc的编辑和删除

之前实现了mvs的翻页登录显示等等一系列操作&#xff0c;现在我们再照葫芦画瓢实现一下编辑和删除。 1、编辑 我的思路是首先在list页面要给出编辑的超链接按钮&#xff0c;点击后跳转到一个jsp页面用来输入编辑的相关内容&#xff0c;再提交到负责编辑功能的servlet中。 首…

双硬盘安装Ubuntu22

1、下载Ubuntu系统的iso文件 官方下载地址&#xff1a;Download Ubuntu Desktop | Download | Ubuntu 阿里云镜像下载地址&#xff1a;ubuntu-releases安装包下载_开源镜像站-阿里云 2、制作U盘引导盘 下载软件 Rufus&#xff1a;https://rufus.akeo.ie 绿色免安装&#xff0…

Spring Security源码剖析从入门到精通.跟学尚硅谷(二)

Spring Security源码剖析从入门到精通.跟学尚硅谷 二4. SpringSecurity 微服务权限方案4.1 什么是微服务1、微服务由来2、微服务优势3、微服务本质4.2 微服务认证与授权实现思路1、认证授权过程分析2、权限管理数据模型3、项目技术说明4、搭建工程(1).创建父工程(2).创建子模块…

2023年天猫青团销售数据:口味更个性化,但老字号品牌依然称霸

青团本是清明时节祭祀的产物&#xff0c;但随着时节的推移&#xff0c;青团已经突破了地域与时间的限制&#xff0c;如今的青团已经成为地域性特色小吃的一种&#xff0c;并逐渐被全国消费者所接受。 随着消费回暖及内容营销的助力&#xff0c;今年的青团季比往年相比提高了不少…