Mycat的读写分离

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
JSON 自然语言处理 数据格式
Tauri 开发实践 — Tauri 自定义多语言菜单开发
本文介绍了如何在 Tauri 应用中实现自定义菜单并支持多语言。首先,通过 `Translator` 类加载和解析多语言 JSON 文件,实现简单的翻译功能。接着,创建包含文件、编辑和窗口子菜单的基本菜单结构,并根据当前语言进行翻译。最后,在主函数中读取语言设置,创建菜单并处理菜单事件,确保应用的国际化和用户体验。源码可在 GitHub 上查看。
574 2
|
9月前
|
存储 人工智能 API
PDF to Podcast:英伟达开源黑科技!PDF 秒转播客/有声书,告别阅读疲劳轻松学习!
NVIDIA推出的PDF to Podcast工具,基于大型语言模型和文本到语音技术,将PDF文档转换为生动的音频内容。
571 14
PDF to Podcast:英伟达开源黑科技!PDF 秒转播客/有声书,告别阅读疲劳轻松学习!
|
9月前
|
人工智能 安全 API
新手指南:Claude 3.5/4.0国内怎么使用?精选3种使用方法!
更强的上下文理解能力: Claude 在处理长文本和复杂对话时简直是王者
3791 2
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用
【10月更文挑战第8天】本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,通过 Spring Initializr 创建并配置 Spring Boot 项目,实现后端 API 和安全配置。接着,使用 Ant Design Pro Vue 脚手架创建前端项目,配置动态路由和菜单,并创建相应的页面组件。最后,通过具体实践心得,分享了版本兼容性、安全性、性能调优等注意事项,帮助读者快速搭建高效且易维护的应用框架。
286 3
|
负载均衡 网络协议 安全
DPDK用户态协议栈-KNI
DPDK用户态协议栈-KNI
游戏对接广告看视频系统开发详细规则/方案逻辑/步骤逻辑/规则玩法/源码程序
Advertising location and display method: According to the characteristics of the game interface and scene, choose the appropriate advertising location and display method to ensure that the advertisement naturally integrates into the game and does not affect the player's game experience.
|
存储 XML 前端开发
Python 入门指南(三)(3)
Python 入门指南(三)
128 5
|
JSON 算法 Unix
一篇文章带你分清楚JWT、JWS与JWE
随着移动互联网的兴起,传统基于 `session/cookie` 的 web 网站认证方式转变为了基于 OAuth2 等开放授权协议的单点登录模式(SSO),相应的基于服务器 session+ 浏览器 cookie 的 Auth 手段也发生了转变,Json Web Token 出现成为了当前的热门的 Token Auth 机制。
19616 2
一篇文章带你分清楚JWT、JWS与JWE