Mycat的读写分离

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL主从复制原理

MySQL主从复制原理

73d2949c3939459d9ab1961ea07f7aa1.png

Mysql的主从复制中主要有三个线程:master(binlog dump thread)、slave(I/O thread 、SQL thread),Master一条线程和Slave中的两条线程。


master(binlog dump thread)主要负责Master库中有数据更新的时候,会按照binlog格式,将更新的事件类型写入到主库的binlog文件中。


并且,Master会创建log dump线程通知Slave主库中存在数据更新,这就是为什么主库的binlog日志一定要开启的原因。


I/O thread线程在Slave中创建,该线程用于请求Master,Master会返回binlog的名称以及当前数据更新的位置、binlog文件位置的副本。


然后,将binlog保存在 「relay log(中继日志)」 中,中继日志也是记录数据更新的信息。


SQL线程也是在Slave中创建的,当Slave检测到中继日志有更新,就会将更新的内容同步到Slave数据库中,这样就保证了主从的数据的同步。


MySQL主从环境搭建

设置server-id值并开启binlog参数开启gtid
[mysqld]
server_id=10
log_bin=master
gtid_mode=on
enforce_gtid_consistency=true

server_id 主从库不能重复


使用docker搭建

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
1224ecb4130b        mysql:5.7           "docker-entrypoint..."   25 minutes ago      Up 25 minutes       33060/tcp, 0.0.0.0:3309->3306/tcp   mysql3
e8ac80097bd2        mysql:5.7           "docker-entrypoint..."   25 minutes ago      Up 25 minutes       33060/tcp, 0.0.0.0:3308->3306/tcp   mysql2
e9c72c63c9c2        mysql:5.7           "docker-entrypoint..."   25 minutes ago      Up 25 minutes       33060/tcp, 0.0.0.0:3307->3306/tcp   mysql1

docker 里面不好编辑 cp 到服务器操作

docker cp mysql1:/etc/mysql/conf.d/docker.cnf /root/mysqlcnf/

主库设置


/etc/mysql/conf.d/mysql1.cnf 添加

server_id=10
log_bin=master
gtid_mode=on
enforce_gtid_consistency=true

从库1配置

/etc/mysql/conf.d/mysql2.cnf 添加

server_id=11
log_bin=slave
gtid_mode=on
enforce_gtid_consistency=true

从库2配置

/etc/mysql/conf.d/mysql3.cnf 添加

server_id=12
log_bin=slave
gtid_mode=on
enforce_gtid_consistency=true

然后上传到各个docker中

[root@mysql mysqlcnf]# docker cp /root/mysqlcnf/mysql1.cnf  mysql1:/etc/mysql/conf.d/docker.cnf
[root@mysql mysqlcnf]# docker cp /root/mysqlcnf/mysql2.cnf  mysql2:/etc/mysql/conf.d/docker.cnf
[root@mysql mysqlcnf]# docker cp /root/mysqlcnf/mysql3.cnf  mysql3:/etc/mysql/conf.d/docker.cnf
# 重启
[root@mysql mysqlcnf]# docker restart mysql1 mysql2 mysql3
mysql1
mysql2
mysql3

主库配置

建立同步账号
mysql> grant replication slave on *.* to 'rep'@'192.168.1.%' identified by
'123456';

从库配置

change master to
master_host='192.168.1.50',
master_user='repl',
master_password='123456',
master_auto_position=1;

验证

主库创建一个数据库

de63b18841d1460698ff29320cf73c89.png

从库

ec57f67f1fc44fe3999086eb7e06aeb8.png

主从配置成功


MySQL读写分离

一主两从

环境搭建

需要这三个文件

要有Java环境 mycat

-rw-r--r--  1 root root 127431820 Mar 31 00:31 jdk-8u261-linux-x64.rpm
-rw-r--r--  1 root root 151819628 May  9  2022 mycat2-1.21-release-jar-with-dependencies.jar
-rw-r--r--  1 root root   1246974 May  9  2022 mycat2-install-template-1.21.zip

安装jdk

1、解压 mycat2-install-template-1.21.zip

2、将mycat2-1.21-release-jar-with-dependencies.jar 放在mycat 的lib中

3、给mycat下的bin目录赋可执行权限+x

4、在bin目录下启动mycat

1、unzip mycat2-install-template-1.21.zip -d /data/
2、mv mycat2-1.21-release-jar-with-dependencies.jar /data/mycat/lib/
3、chmod +x /data/mycat/bin/*
4、
[root@mysql bin]# ./mycat start
Starting mycat2...
mycat2 is already running.
[root@mysql bin]# ./mycat status
mycat2 is running (18162).

5、使用连接工具连接端口8066

690db25e0f1c41d7a4c9e7117e2ba11c.png

6、主从配置 之前已经配好

7、添加主的数据源(可读可写)

{
  "dbType":"mysql",
  "idleTimeout":60000,
  "initSqls":[],
  "initSqlsGetConnection":true,
  "instanceType":"READ_WRITE",
  "logAbandoned":true,
  "maxCon":1000,
  "maxConnectTimeout":3000,
  "maxRetryCount":5,
  "minCon":1,
  "name":"m1",
  "password":"123456",
  "queryTimeout":0,
  "removeAbandoned":false,
  "removeAbandonedTimeoutSecond":180,
  "type":"JDBC",
  "url":"jdbc:mysql://127.0.0.1:3306/db1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true",
  "user":"root",
  "weight":0
}

8、添加两个从的数据源

{
  "dbType":"mysql",
  "idleTimeout":60000,
  "initSqls":[],
  "initSqlsGetConnection":true,
  "instanceType":"READ",
  "logAbandoned":true,
  "maxCon":1000,
  "maxConnectTimeout":3000,
  "maxRetryCount":5,
  "minCon":1,
  "name":"m1s1",
  "password":"123456",
  "queryTimeout":0,
  "removeAbandoned":false,
  "removeAbandonedTimeoutSecond":180,
  "type":"JDBC",
  "url":"jdbc:mysql://127.0.0.1:3307/db1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true",
  "user":"root",
  "weight":0
}
{
  "dbType":"mysql",
  "idleTimeout":60000,
  "initSqls":[],
  "initSqlsGetConnection":true,
  "instanceType":"READ",
  "logAbandoned":true,
  "maxCon":1000,
  "maxConnectTimeout":3000,
  "maxRetryCount":5,
  "minCon":1,
  "name":"m1s2",
  "password":"123456",
  "queryTimeout":0,
  "removeAbandoned":false,
  "removeAbandonedTimeoutSecond":180,
  "type":"JDBC",
  "url":"jdbc:mysql://127.0.0.1:3308/db1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true",
  "user":"root",
  "weight":0
}

9、查看

d9f94dc8ce244ed897a735a06f67f1e8.png

10、创建集群

{
  "clusterType":"MASTER_SLAVE",
  "heartbeat":{
    "heartbeatTimeout":1000,
    "maxRetryCount":0,
    "minSwitchTimeInterval":300,
    "showLog":true,
    "slaveThreshold":0.0
  },
  "masters":[
    "m1"
  ],
  "maxCon":2000,
  "name":"prototype",
  "readBalanceType":"BALANCE_ALL",
  "replicas":[
    "m1s1",
    "m1s2"
  ],
  "switchType":"SWITCH"
}

68c4d488c9d84716956ae0a407422623.png

11、创建逻辑库

CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

12、修改逻辑库的数据源

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

13、测试读写分离是否成功

use db1
CREATE TABLE SYS_USER( ID BIGINT PRIMARY KEY, USERNAME VARCHAR(200) NOT NULL,
ADDRESS VARCHAR(500));
INSERT INTO SYS_USER(ID,USERNAME,ADDRESS) VALUES(1,"XIAOMING","WUHAN");

fc020d7c3c4147a9b3df664eb48fff35.png

dcef5627bd54438aba9f94ff07c879de.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 关系型数据库 MySQL
MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)
MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)
884 0
|
3月前
|
cobar 关系型数据库 MySQL
使用MyCat实现MySQL主从读写分离(一)概述
【8月更文挑战第11天】MySQL读写分离通过主从复制分散负载,主库负责写操作,从库承担读查询,以复制技术确保数据一致性。此策略有效缓解锁竞争,提升查询效能并增强系统可用性。实现方式包括应用层处理,简便快捷但灵活性受限;或采用中间件如MyCAT、Vitess等,支持复杂场景但需专业团队维护。
117 0
|
4月前
|
SQL 存储 关系型数据库
Mycat 实现分库分表及读写分离
Mycat 实现分库分表及读写分离
83 0
|
6月前
|
中间件 数据库
mycat2.X读写分离
mycat2.X读写分离
138 9
|
6月前
|
SQL 缓存 关系型数据库
【Mycat】详解分库分表
【Mycat】详解分库分表
97 0
|
运维 关系型数据库 MySQL
MyCat-架构剖析-MyCat 主从切换实现 | 学习笔记
快速学习 MyCat-架构剖析-MyCat 主从切换实现
MyCat-架构剖析-MyCat 主从切换实现 | 学习笔记
|
XML SQL 负载均衡
MyCat - 高级 - 读写分离 - 一主一从读写分离配置 | 学习笔记
快速学习MyCat - 高级 - 读写分离 - 一主一从读写分离配置
MyCat - 高级 - 读写分离 - 一主一从读写分离配置 | 学习笔记
|
SQL 存储 cobar
MyCat分库分表
分库分表 1.数据量太大,SQL查询慢怎么办? 从sql语句入手 exist和in in 和 not in like 从数据库设计入手 加索引(不是越多越好) 尽量多考虑使用数值型
278 0
|
负载均衡 关系型数据库 MySQL
MyCat - 高级 - 读写分离 - MyCat 实现 MySQL 双主双从读写分离 | 学习笔记
快速学习 MyCat - 高级 - 读写分离 - MyCat 实现 MySQL 双主双从读写分离
MyCat - 高级 - 读写分离 - MyCat 实现 MySQL 双主双从读写分离 | 学习笔记
|
存储 算法 NoSQL
Mycat实现分库分表
Mycat实现分库分表
1231 0
Mycat实现分库分表
下一篇
无影云桌面