Mycat2(三)mycat2搭建读写分离

news2024/11/17 7:24:08

文章目录

  • 一、mycat一主一从读写分离原理
  • 二、搭建MySQL主从复制
  • 三、配置mycat2一主一从读写分离
  • 四、配置Mycat2双主双从读写分离
    • 4.1 Mysql 双主双从搭建步骤
      • 1、创建MySQL数据库与MySQL 机器信息
      • 2、双柱双从配置
        • 2.1 master1配置
        • 2.2 master2配置
        • 2.3 Slave1、Slave2 配置
      • 3、在两台主机上建立账号,并授权Slave。
      • 4、开始搭建主从复制(S1复制M1,S2复制M2,M1-M2相互复制)
    • 4.2 双主双从读写分离扩展
    • 4.3 读写分离扩展
      • 1、读写分离(一主m一从s,无备)
      • 2、读写分离(一主m一从s,从机s也可以当作备用机)
      • 3、读写分离(一主m一从s,一备b)
      • 4、MHA、MGR(一主m一从s一备b,READ_ONLY判断主)
      • 5、GARELA_CLUSTER(一主m一从s一备b,b是多主)

一、mycat一主一从读写分离原理

在这里插入图片描述

二、搭建MySQL主从复制

这里的主从复制可以参考文章:Docker搭建Mysql主主架构
重新搭建主从复制的两个命令:

stop slave;
reset master;

mysql的主从复制是从接入点开始,主机之前的数据,从机不会复制;但是redis是从头开始备份,主机之前的数据,从机也会获得。
在这里插入图片描述

三、配置mycat2一主一从读写分离

  1. 登录mycat2,创建逻辑库,配置数据源。
create database mydb1
  1. 修改mydb1.schema.json,指定数据源targetNameprototype,配置主机数据源。
    在这里插入图片描述
  2. 添加数据源
-- 添加主库
/*+ mycat:createDataSource{
"name":"rwSepw",
"url":"jdbc:mysql://127.0.0.1:23306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"admin"
} */;
-- 添加从库
/*+ mycat:createDataSource{
"name":"rwSepr",
"url":"jdbc:mysql://127.0.0.1:33306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"admin"
} */;
-- 查看数据源配置
/*+ mycat:showDataSources{} */;
  1. 添加集群
-- 添加集群
/*+ mycat:createCluster{
"name":"prototype",
"masters": ["rwSepw"],
"replicas": ["rwSepr"]
} */;
-- 查看集群信息
/*+ mycat:showClusters{} */;
  1. 重启mycat2,并测试读写分离
mycat restart

测试原理,利用了mysql的logbin中statement可能导致数据不一致的特性。

扩展:MySQL的logbin三种类型
statement:
ROW:
MIXED:解决了一部分数据不一致的问题。

测试:

-- 利用两台MySQL主机名不一致来判断
insert into tb1 values(1,@@hostname);
select * from tb1;

注意:如果是用的docker,默认的hostname是容器ID的前几位。可以在创建的时候使用--hostname=$(hostName)传入hostname变量。

docker run -p port:prot --name mysql --hostname=$(hostName) mysql3306

四、配置Mycat2双主双从读写分离

一个主机m1用于处理所有写请求,它的从机 s1 和另一台主机m2 还有它的从机 s2 负责所有读请求。当m1主机岩机后,m2 主机负责写请求,m1、m2 互为备机。架构图如下“
在这里插入图片描述

4.1 Mysql 双主双从搭建步骤

1、创建MySQL数据库与MySQL 机器信息

角色IP端口映射机器名server-id
master1172.17.0.313306 -> 3306mysql-133061
master2(备用机)172.17.0.523306 -> 3306mysql-233062
slave1172.17.0.633306 -> 3306mysql-333063
slave2172.17.0.743306 -> 3306mysql-433064

注意:这里是使用docker创建的MySQL数据库,我们要使用容器内的IP地址。所以我们要使用以下命令来查看容器的IP:docker inspect mysql-13306 --format='{{.NetworkSettings.IPAddress}}
docker 创建四台MySQL:

 docker run -p 13306:3306 --add-host=mysql-13306:172.17.0.2 --privileged=true --name mysql-13306  --hostname=mysql-13306  -v /D/Docker/mysql-13306/mysql:/etc/mysql -v /D/Docker/mysql-13306/logs:/logs -v /D/Docker/mysql-13306/data:/var/lib/mysql -v /D/Docker/mysql-13306/mysql-files:/var/lib/mysql-files  -e MYSQL_ROOT_PASSWORD=admin -d mysql:5.7
 docker run -p 23306:3306 --add-host=mysql-23306:172.17.0.3 --privileged=true --name mysql-23306  --hostname=mysql-23306  -v /D/Docker/mysql-23306/mysql:/etc/mysql -v /D/Docker/mysql-23306/logs:/logs -v /D/Docker/mysql-23306/data:/var/lib/mysql -v /D/Docker/mysql-23306/mysql-files:/var/lib/mysql-files  -e MYSQL_ROOT_PASSWORD=admin -d mysql:5.7
 docker run -p 33306:3306 --add-host=mysql-33306:172.17.0.4 --privileged=true --name mysql-33306  --hostname=mysql-33306  -v /D/Docker/mysql-33306/mysql:/etc/mysql -v /D/Docker/mysql-33306/logs:/logs -v /D/Docker/mysql-33306/data:/var/lib/mysql -v /D/Docker/mysql-33306/mysql-files:/var/lib/mysql-files  -e MYSQL_ROOT_PASSWORD=admin -d mysql:5.7
 docker run -p 43306:3306 --add-host=mysql-43306:172.17.0.5 --privileged=true --name mysql-43306  --hostname=mysql-43306  -v /D/Docker/mysql-43306/mysql:/etc/mysql -v /D/Docker/mysql-43306/logs:/logs -v /D/Docker/mysql-43306/data:/var/lib/mysql -v /D/Docker/mysql-43306/mysql-files:/var/lib/mysql-files  -e MYSQL_ROOT_PASSWORD=admin -d mysql:5.7

2、双柱双从配置

2.1 master1配置

修改D:\Docker\mysql-13306\mysql\my.cnf,并将其拷贝到容器中etc/mysql/目录下:

docker cp D:/Docker/mysql-13306/mysql/my.cnf mysql-13306:/etc/mysql/

配置内容:

[mysqld]
# 主服务器唯一ID
server-id=1
# 启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
# 设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
# 表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1,65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1,65535
auto-increment-offset=1

2.2 master2配置

修改D:\Docker\mysql-23306\mysql\my.cnf,并将其拷贝到容器中etc/mysql/目录下:

docker cp D:/Docker/mysql-23306/mysql/my.cnf mysql-23306:/etc/mysql/

配置内容

[mysqld]
# 主服务器唯一ID
server-id=3
# 启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
# 设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
# 表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1,65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1,65535
auto-increment-offset=3

2.3 Slave1、Slave2 配置

修改D:\Docker\mysql-33306\mysql\my.cnfD:\Docker\mysql-43306\mysql\my.cnf,并将其拷贝到容器中etc/mysql/目录下:

docker cp D:/Docker/mysql-33306/mysql/my.cnf mysql-33306:/etc/mysql/
docker cp D:/Docker/mysql-43306/mysql/my.cnf mysql-43306:/etc/mysql/

Slave1 配置内容:

# 从机唯一ID
server-id=2
# 启用中继日志
relay-log=mysql-relay

Slave2 配置内容:

# 从机唯一ID
server-id=4
# 启用中继日志
relay-log=mysql-relay

注意:由于修改配置要重启所有MySQL服务。docker restart mysql-13306

3、在两台主机上建立账号,并授权Slave。

grant replication slave on *.* to 'rep'@'%' identified by '123456';flush privileges;
flush privileges;

4、开始搭建主从复制(S1复制M1,S2复制M2,M1-M2相互复制)

-- 创建M1-S1的主从复制。这里给出案例,其他的雷同。
-- 查看M1主机状态,并记录下File和Position位置
SHOW MASTER STATUS;
-- 在S1上执行change命令,创建主从复制并开启
change master to master_host='172.17.0.3',master_port=3306,master_user='rep'
,master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
start slave; 	-- 开启slave
show slave status; -- 查看状态
stop slave;		--停止slave

注意:如果配置出错可以使用reset master来重置主从复制。

4.2 双主双从读写分离扩展

  1. 修改mycat2的集群配置来实现多种主从
    mycat2的特点是凸显了集群的概念。和MySQL主从复制、集群配合来实现多节点的读写分离。
-- 查看数据源信息
/*+ mycat:showDataSources{} */
-- 创建写数据源,端口13306。并修改name、url创建写数据源2rwSepw2,端口23306。
/*+ mycat:createDataSource{
"name":"rwSepw1",
"url":"jdbc:mysql://127.0.0.1:13306/db1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"admin"
}*/;
-- 创建读数据源rwSepr1,端口33306。并修改name、url创建读数据源2rwSepr2,端口43306。
/*+ mycat:createDataSource{
"name":"rwSepr1",
"url":"jdbc:mysql://127.0.0.1:33306/db1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"root",
"password":"admin"
}*/;
  1. 修改集群配置Cluster
    • 查看集群配置:/*! mycat:showClusters{} */
    • 执行以下命令:
      /*! mycat:createCluster{
      	"name":"prototype",
      	"masters":["rwSepw1","rwSepw2"],
      	"replicas":["rwSepw2","rwSepr1","rwSepr1"]
      	} */
      
    • 也可以直接修改mycat\conf\clusters\prototype.cluster.json文件,并重启mycat2
      {
      	"clusterType":"MASTER_SLAVE",
      	"heartbeat":{
      		"heartbeatTimeout":1000,
      		"maxRetryCount":3,
      		"minSwitchTimeInterval":300,
      		"showLog":false,
      		"slaveThreshold":0.0
      	},
      	"masters":[
      		"rwSepw1", "rwSepw2"
      	],
      	"maxCon":2000,
      	"name":"prototype",
      	"readBalanceType":"BALANCE_ALL",
      	"replicas":[
      		"rwSepw2", "rwSepr1", "rwSepr2"
      	],
      	"switchType":"SWITCH"
      }
      
  2. mycat2新建db1库新建tb1表。也可以修改以下的配置文件mycat\conf\schemas\db1.schema.json
    {
    	"customTables":{},
    	"globalTables":{},
    	"normalProcedures":{},
    	"normalTables":{
    		"tb1":{
    			"createTableSQL":"CREATE TABLE `db1`.`tb1` (\n\t`id` int(0) NOT NULL AUTO_INCREMENT,\n\t`name` varchar(255) NULL,\n\tPRIMARY KEY (`id`)\n)",
    			"locality":{
    				"schemaName":"db1",
    				"tableName":"tb1",
    				"targetName":"prototype"
    			}
    		}
    	},
    	"schemaName":"db1",
    	"shardingTables":{},
    	"views":{}
    }
    
  3. 测试,插入数据,然后在mycat8066中查询
insert into tb1 values(3, @@hostname)

在这里插入图片描述

4.3 读写分离扩展

通过对集群配置的修改,可以根据需求实现更多种情况的读写分离配置。

1、读写分离(一主m一从s,无备)

{
	"clusterType":"MASTER_SLAVE",
	"heartbeat":{
		"heartbeatTimeout":1000,
		"maxRetryCount":3,
		"minSwitchTimeInterval":300,
		"showLog":false,
		"slaveThreshold":0.0
	},
	"masters":[
		"m"
	],
	"maxCon":2000,
	"name":"prototype",
	"readBalanceType":"BALANCE_ALL",
	"replicas":[
		"s" 
	],
	"switchType":"SWITCH",
	"timer:": {
		"initialDelay": 30,
		"period": 5,
		"timeUnit": "SECONDS"
	}
}

2、读写分离(一主m一从s,从机s也可以当作备用机)

需要实现mysql双主架构

{
	"clusterType":"MASTER_SLAVE",
	"heartbeat":{
		"heartbeatTimeout":1000,
		"maxRetryCount":3,
		"minSwitchTimeInterval":300,
		"showLog":false,
		"slaveThreshold":0.0
	},
	"masters":[
		"m","s"
	],
	"maxCon":2000,
	"name":"prototype",
	"readBalanceType":"BALANCE_ALL",
	"replicas":[
		"s" 
	],
	"switchType":"SWITCH",
	"timer:": {
		"initialDelay": 30,
		"period": 5,
		"timeUnit": "SECONDS"
	}
}

3、读写分离(一主m一从s,一备b)

需要实现mysql双主架构

{
	"clusterType":"MASTER_SLAVE",
	"heartbeat":{
		"heartbeatTimeout":1000,
		"maxRetryCount":3,
		"minSwitchTimeInterval":300,
		"showLog":false,
		"slaveThreshold":0.0
	},
	"masters":[
		"m","b"
	],
	"maxCon":2000,
	"name":"prototype",
	"readBalanceType":"BALANCE_ALL",
	"replicas":[
		"s" 
	],
	"switchType":"SWITCH",
	"timer:": {
		"initialDelay": 30,
		"period": 5,
		"timeUnit": "SECONDS"
	}
}

4、MHA、MGR(一主m一从s一备b,READ_ONLY判断主)

{
	"clusterType":"MHA",	// 或者MGR
	"heartbeat":{
		"heartbeatTimeout":1000,
		"maxRetryCount":3,
		"minSwitchTimeInterval":300,
		"showLog":false,
		"slaveThreshold":0.0
	},
	"masters":[
		"m","b"
	],
	"maxCon":2000,
	"name":"prototype",
	"readBalanceType":"BALANCE_ALL",
	"replicas":[
		"s" 
	],
	"switchType":"SWITCH",
	"timer:": {
		"initialDelay": 30,
		"period": 5,
		"timeUnit": "SECONDS"
	}
}

5、GARELA_CLUSTER(一主m一从s一备b,b是多主)

{
	"clusterType":"GARELA_CLUSTER",
	"heartbeat":{
		"heartbeatTimeout":1000,
		"maxRetryCount":3,
		"minSwitchTimeInterval":300,
		"showLog":false,
		"slaveThreshold":0.0
	},
	"masters":[
		"m","b"
	],
	"maxCon":2000,
	"name":"prototype",
	"readBalanceType":"BALANCE_ALL",
	"replicas":[
		"s" 
	],
	"switchType":"SWITCH",
	"timer:": {
		"initialDelay": 30,
		"period": 5,
		"timeUnit": "SECONDS"
	}
}

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

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

相关文章

程序员如何在职场上走得更远一些?

一. 工作心态 首先第一个要聊的啊就是这个心态的问题,我觉得有时候可以改变一下自己的心态,可以尝试把工作当成一种投资,或者说呢把工作当成一种自己的产品来经营,把目光多多的聚焦在这个收获和成长上面啊这样一个心态来应对&…

KV数据分片和分布

KV数据分片和分布 KV存储数据组织方式 Hash:对于Hash方式,键值对数据的存储位置由预定义的Hash函数确定,因此所有键值对数据不是有序排列。Hash方式的优点是通过Hash函数计算存储位置的效率高,因此处理插入、删除、更新、单点查…

MySQL之事务

引入事务: 一个事务其实就是一个完整的业务逻辑,它是一个最小的工作单元,是不可再分的。 那么什么是一个完整的业务逻辑呢? 拿现实生活中的银行业务举例,假设转账,从A账户向B账户中转账10000&#xff0c…

Redis:一、简介

Redis 1. redis的简介 1.1 NoSQL的介绍 在介绍redis之前,我们先来了解一下NoSQL(Not only SQL),不仅仅是SQL。 NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别…

Cache(缓存)基本概念

cache的概念在计算机中被广泛应用,包括TLB等都使用了它的理念,因此对其进行总结。Cache——位于CPU上,处于寄存器和内存之间的存储单元。 Cache Hit & Miss在写入cache的时候,有hit(命中)和miss&#x…

基于ros1的 apollo 7.0.0规划控制算法

apollo.ros-7.0.0 上次给大家带来了之前学习apollo时开发的内容apollo.ros-1.0.0和apollo.ros-3.0.0,主要是针对apollo 1.0.0和3.0.0版本进行了ros1下的移植和规划控制算法的学习。本次在之前工作的基础上,针对apollo 7.0.0版本,进行了ros1下…

植物大战僵尸:分析植物的攻击速度

植物大战僵尸中,植物是有攻击速度的,比如每隔一段时间会吐出一些子弹,那么由此可判断吐出子弹应该是由一个计数器控制的,也就是说只要我们能够找到控制植物攻击的时钟并改写它,也就可以实现植物的无限吐子弹。 吐出子…

数据结构---二叉树

坚持看完,结尾有思维导图总结 这里写目录标题什么是二叉树?二叉树的定义二叉树的性质二叉树的基石在哪里?总结什么是二叉树? 二叉树的定义 二叉树,就是从一个根开始,按照两边分支的方式向下生长的树,就能…

python虚拟环境的概念,用法(pycharm)

1.在PyCharm中创建python项目时,需要配置python的运行环境,除了使用系统现有环境以外,还可以创建虚拟环境。 2.虚拟环境的创建是因为在实际开发中需要同期用到不同版本的python解释器,不同的第三方库以及同一个第三方库的不同版本…

Qt音视频开发08-ffmpeg内核优化(极速打开/超时回调/实时响应)

一、前言 最初编写这套视频解析组件的时候,面对的场景是视频监控行业,对应设备都是网络监控摄像机,传过来的都是rtsp这种视频流,做过这一块的人都知道,打开某个视频流默认耗时比较大,基本上在2s左右&#…

高级前端二面手写面试题(边面边更)

解析 URL Params 为对象 let url http://www.domain.com/?useranonymous&id123&id456&city%E5%8C%97%E4%BA%AC&enabled; parseParam(url) /* 结果 { user: anonymous,id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字…

四【Servlet基础】文件配置及环境搭建(重要)

文章目录4.1 Servlet概念4.2 Servlet作用4.3 Servlet开发步骤4.3.1 搭建开发环境4.3.2 创建项目4.3.3 部署Servlet4.3.4 配置Servlet4.3.5 测试运行4.1 Servlet概念 (1)Servlet:Server Applet的简称,是运行在Web服务器端的Java程…

GDB无法debug的错误

GDB无法debug的错误 一、输出错误信息描述 Warning: opening /proc/PID/mem file for lwp 707.707 failed: No such file or directory (2) Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x806950 二、解决方法 方法:修改 GDB 的二进…

spring之IoC注解(三)负责注入的注解

文章目录前言一、Value注解Product类spring配置文件测试程序运行结果二、Autowired与Qualifier注解1.创建OrderDao接口2.创建OrderDao接口实现类3.创建OrderService类4.配置文件5.测试程序6.运行结果三、Resource注解(重要)1、创建StudentDao接口2、创建…

皮带断裂识别检测系统 opencv

皮带断裂识别检测系统通过opencv深度学习yolo计算机视觉识别技术对皮带运行状态进行全天候实时监测,当识别到皮带断裂撕裂时立即抓拍告警存档。OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。OpenCV-Python使用Numpy,这是一个高度…

LeetCode刷题复盘笔记—一文搞懂动态规划之392. 判断子序列问题(动态规划系列第三十八篇)

今日主要总结一下动态规划的一道题目,392. 判断子序列 题目:392. 判断子序列 Leetcode题目地址 题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除&a…

08 LIN

基础知识 LIN的全称为Local Interconnect Network。LIN主要功能是为CAN总线网络提供辅助功能,应用场合有智能传感节点、自动车窗节点等。 硬件 特点 1.采用单主多从的组网方式,无CAN总线那样的仲裁机制,最多可连接16个节点(1主…

大数据技术——HBase安装配置DDLDML操作

HBase文章目录1. HBase 安装1.1 HBase下载1.2 HBase安装1.3 HBase 初始配置2. 配置高可用并且群起集群2.1 HBase高可用2.2 群起集群2.3 进入HBase客户端3. DDL&DML操作3.1 DDL操作3.2 DML操作1. HBase 安装 1.1 HBase下载 HBase下载官方网站直达 选择自己需要的版本&…

Allegro孔和线被做到器件里面如何解锁操作指导

Allegro孔和线被做到器件里面如何解锁操作指导 在做PCB设计的时候,会遇到孔和线被做到器件的情况,当需要移动器件的时候,孔和线也会跟着移动。如下图 具体操作如下 选择Route选择Convert Fanout

Acwing 796子矩阵的和

Acwing 796子矩阵的和 前缀和 更新 (前缀和数组):s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j] 查询(x1,y1)-------(x2,y2)矩阵的元素和 Ss[x2][y2]-s[x-1][y2]-s[x2][y1-1]s[x1-1][y1-1] 输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每…