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

文章目录

    • 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主从搭建完成。

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

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

相关文章

设计模式之门面模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、门面模式是什么&#xff1f; 门面模式是一种结构型的软件设计模式&#xff0c;也叫外观模式&#xff0c;它提供了统一的接口去…

程序员的天花板到底有多高?

程序员是很多人眼里的职业天花板&#xff0c;毕竟薪资水平、发展前景摆在那里&#xff0c;而且&#xff0c;一个又会debug又会修电脑&#xff08;划掉&#xff09;&#xff0c;还会费心为你制造浪漫的程序员&#xff0c;有谁不喜欢呢&#xff1f; 但现实中很多程序员都焦虑担忧…

从0使用TCP手撸http服务器六

html模板设计&#xff1a; 上篇我们说到通过路由去返回不同的html页面&#xff0c;如果每一个页面都是一个数组的话&#xff0c;那么我们可能需要很多数组&#xff0c;里面很多内容都是一样的&#xff0c;这样子会浪费我们单片机很多flash&#xff0c;我们需要把共同的部分固定…

神经网络之反向传播算法(加入Nesterov动量的误差反向传播算法)

文章目录1、Nesterov动量2、结合Nesterov动量的误差反向传播算法3、算法实现3.1 训练过程3.2 测试过程4、参考源码及数据集1、Nesterov动量 在动量法提出不久之后&#xff0c;Nesterov动量也随之被提了出来&#xff0c;此方法属于动量法的进一步发展&#xff0c;与动量法不同的…

基于windows11配置深度学习环境包含WSL2配置ubuntu20.04

基于windows11配置深度学习环境包含WSL2配置ubuntu20.04目录平台WSL2 系统准备(Windows Subsystem of Linux)安装WSL2基于WSL2中的Ubuntu安装CUDA和cudnnCUDA 安装目录 平台 系统 : windows11 专业版 CPU Intel I7 8750hq 显卡&#xff1a;Nvidia GTX1060移动端 显卡驱动版本…

安装Windows11提示这台电脑不符合安装此版本的Windows所需的最低系统要求

现在很多用户都会选择用U盘来安装系统&#xff0c;最新有用户在使用U盘安装Win11系统的时候&#xff0c;结果安装到第一步就提示这台电脑无法运行Windows11&#xff0c;这台电脑不符合安装此版本的Windows所需的最低系统要求。下面小编就来教大家解决此问题的方法。 问题解析&a…

BIO/NIO/AIO/IO多路复用简介

bio、nio、aio、io多路复用、reactor模式io&#xff0c;在将IO的时候&#xff0c;是不是都遇到过这些概念&#xff0c;也有种傻傻分不清&#xff1f;甚至别人在大谈特谈的时候&#xff0c;一会nio&#xff0c;一会io多路复用&#xff0c;一会又搞到reactor模式上去了&#xff1…

一文搞懂原型和原型链

在了解原型和原型链之前首先得明确它俩是什么东西&#xff1a; 原型&#xff1a;prototype 又称显示原型 1、原型是一个普通对象 2、只有构造函数才具备该属性 3、公有属性可操作 隐式原型&#xff1a;__proto__ 1、只有对象(普通对象、函数对象&#xff09;具备 2、私有的对…

《Spring系列》第2章 解析XML获取Bean

一、基础代码 Spring加载bean实例的代码 public static void main(String[] args) throws IOException {// 1.获取资源Resource resource new ClassPathResource("bean.xml");// 2.获取BeanFactoryDefaultListableBeanFactory factory new DefaultListableBeanFa…

Airtest自动化测试工具实战演练

一开始知道Airtest大概是在年初的时候&#xff0c;当时&#xff0c;看了一下官方的文档&#xff0c;大概是类似Sikuli的一个工具&#xff0c;主要用来做游戏自动化的&#xff0c;通过截图的方式用来解决游戏自动化测试的难题。最近&#xff0c;移动端测试的同事尝试用它的poco库…

iwebsec靶场-命令执行漏洞

漏洞简介 命令执行漏洞&#xff08;Command Injection&#xff09;是一种常见的安全漏洞&#xff0c;也被称为代码注入漏洞。它允许攻击者将恶意代码注入到受攻击的应用程序中&#xff0c;从而可以在应用程序的上下文中执行任意命令。 命令执行漏洞通常出现在Web应用程序中&…

好的表单设计应该遵循什么规则?

在数字化时代&#xff0c;表单已经成为了人们生活中不可或缺的一部分。它们可能是网站注册表格、调查问卷、订单表格或者其他类型的表格。无论表单的类型是什么&#xff0c;都必须经过精心设计才能提供良好的用户体验。在本文中&#xff0c;我们将探讨如何设计一份用户体验好的…

Redis缓存双写一致性

目录双写一致性Redis与Mysql双写一致性canal配置流程代码案例双写一致性理解缓存操作细分缓存一致性多种更新策略挂牌报错,凌晨升级先更新数据库,在更新缓存先删除缓存,在更新数据库先更新数据库,在删除缓存延迟双删策略总结双写一致性 Redis与Mysql双写一致性 canal 主要是…

低代码开发公司:用科技强力开启产业分工新时代!

实现办公自动化&#xff0c;是不少企业的共同追求。低代码开发公司会遵循时代发展规律&#xff0c;注入强劲的科技新生力量&#xff0c;在低代码开发市场厚积爆发、努力奋斗&#xff0c;推动企业数字化转型升级&#xff0c;为每一个企业的办公自动化升级创新贡献应有的力量。 一…

【数据结构与算法】堆的实现(附源码)

目录 一.堆的概念及结构 二.接口实现 A.初始化 Heapinit 销毁 Heapdestroy B.插入 Heappush 向上调整 AdjustUp 1.Heappush 2.AdjustUp C.删除 Heappop 向下调整 AdjustDown D.堆的判空 Heapempty 堆顶数据 Heaptop 堆的大小 Heapsize 三.源码 Heap.h He…

【模板】带权并查集

文章目录1. 奇偶游戏2. 银河英雄传说1. 奇偶游戏 239. 奇偶游戏 题意&#xff1a; 依次给出多个区间的含 111 的个数的奇偶性&#xff0c;找出第一个不符合的答案的回答。 思路&#xff1a; 已知区间[a,b][a,b][a,b][b,c][b,c][b,c]的奇偶性&#xff0c;那么具有传递性&…

分享一个国内可用的免费ChatGPT网站(自己写的)

背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 作为一个程序员&#xff0c;我也忍不住做了一个基于ChatGPT的网站&#xff0c;免费&#xff01;免登陆&#xff01;&#xff01;国内可直接对话ChatGPT&#xff0c;也…

10.线性表代码实战

10.1 与408关联解析及本节内容介绍 链表比顺序表出现的顺序更加的频繁。 10.2线性表地顺序表示原理解析 线性表的特点&#xff1a; &#xff08;1&#xff09;表中的元素的个数是有限的 &#xff08;2&#xff09;表中元素的数据类型相同。意味着每一个元素占用相同大小的空…

使用Dism++和360安全卫士搞定Windows10离线升级

Windows10有很多版本&#xff0c;常见的由1903、1909、20H1、21H2等&#xff0c;在离线状态下&#xff0c;很难下载到匹配的升级补丁。期间尝试多种方法均失败&#xff0c;最后用Dism和360安全卫士组合拳搞定。 1、使用下载补丁&#xff0c;升级失败 比如这里介绍了常见补丁&a…

【SL101】 传感器接入chirpstack平台

【SL101】 传感器接入chirpstack平台使用硬件SL100工程师答疑chirpstack 中 net-server 使能 80-87 频段网关开启80-87 频段设备传感器端配置频点连接成功测试结果---chirpstackSL100系列温湿度传感器产品&#xff08;墨水屏版&#xff09;接入chirpstack 平台笔记记录 使用硬件…