MyCAT完整实验报告
前言
刚刚看了一下前面的那篇MyCAT的文章 感觉有一些问题 所以拿出一篇文章再说一下 单独构建了完整的实验环境 这样会全面一点
安装MyCAT
bash
#跳过
主从配置
bash
#不多追溯 因为我们选择的主从 也可以做双主机 但我们后边再说
环境搭建
一、环境规划
服务器角色 | IP 地址 | 部署服务 | 说明 |
---|---|---|---|
server_1 | 192.168.3.168 | MySQL + MyCAT | MyCAT 中间件节点 |
server_2(主库) | 192.168.3.135 | MySQL | 主库(MASTER) |
server_3(从库) | 192.168.3.159 | MySQL | 从库(SLAVE) |
(用于下一个实验 目前无需在意) 备用主库 | 192.168.3.160 | MySQL | 双主架构备用主库 |
修改配置文件
bash
vim m1.datasource.json #PS:文件名是 *****.datasource.json
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"m1",
"password":"123",
"queryTimeout":0,
"type":"JDBC",
"url":"jdbc:mysql://192.168.3.135:3306?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true",
"user":"aa",
"weight":0
}
----------------------------------------------------
vim m2.datasource.json
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"m2",
"password":"123",
"queryTimeout":0,
"type":"JDBC",
"url":"jdbc:mysql://192.168.3.160:3306?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true",
"user":"bb",
"weight":0
}
#PS:
#1> MyCat 2 要求每个数据源必须单独放在一个 JSON 文件中,一个 JSON 文件只能定义一个数据源,不能在一个文件中同时定义多个数据源(如 m1 和 m2)。
#2> MyCat 2 加载数据源时,会扫描 conf/datasources 目录下的所有 JSON 文件,每个文件被视为一个独立的数据源配置。
#3> 如果在一个文件中定义多个数据源(即使格式正确),MyCat 会解析失败,导致启动报错。
#PS:以下为命令配置
/*+ mycat:createDataSource
{
"dbType": "mysql",
"idleTimeout": 60000,
"initSqls": [],
"initSqlsGetConnection": true,
"instanceType": "READ_WRITE",
"maxCon": 1000,
"maxConnectTimeout": 3000,
"maxRetryCount": 5,
"minCon": 1,
"name": "m1",
"password": "123",
"type": "JDBC",
"url": "jdbc:mysql://192.168.3.135:3306?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": "m2",
"password": "123",
"type": "JDBC",
"url": "jdbc:mysql://192.168.3.159:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
"user": "root",
"weight": 0
}
*/
集群配置(conf/clusters/prototype.cluster.json)
bash
vim ../clusters/prototype.cluster.json
{
"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":[
"m1"
],
"switchType":"SWITCH"
}
#PS:双主机
{
"clusterType":"MASTER_MASTER", // 双主架构,部分版本也支持用 MASTER_SLAVE(但需将双主都放 masters)
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetry":3,
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
"masters":[
"m1", // 主库1(读写)
"m1s1" // 主库2(读写,原从库升级为双主)
],
"maxCon":2000,
"name":"prototype",
"readBalanceType":"BALANCE_ALL", // 读请求在两个主库间均衡分配
"switchType":"SWITCH", // 支持故障切换
"weight":{ // 可选:给两个主库配置权重,控制请求分配比例
"m1":1,
"m1s1":1
}
}
1. 主从集群构建与高可用基础
- 定义主从角色 :明确集 群中
m1
为 主库(Master) 、m2
为 从库(Replica/Slave) ,MyCat 会基于此角色维护主从关系。 - 主从心跳检测 :通过配置的
heartbeat
机制(超时 1000ms、重试 3 次、最小切换间隔 300ms),实时检测主库m1
和从库m2
的存活状态,为后续故障切换打基础。
2. 读写分离(核心功能)
- 读请求负载均衡 :
readBalanceType: "BALANCE_ALL"
表示 所有从库(此处为 m1s1)都会参与读请求分发,MyCat 会将查询(SELECT)等读操作自动路由到从库,避免主库读压力过大;若从库故障,读请求会自动调整(如 fallback 到主库,具体依赖额外配置)。 - 写请求路由到主库 :所有写操作(INSERT/UPDATE/DELETE)会被 MyCat 强制路由到主库
m1
,确保主库数据是最新的,再通过 MySQL 自身的主从同步(如 binlog 复制)将数据同步到从库m2
,保证主从数据一致性。
测试
重启MyCAT
cd /usr/local/mycat/bin
./mycat restart
netstat -anput | grep 8066
tcp6 0 0 :::8066 :::* LISTEN 8834/java
mysql -u root -p123456 -h 127.0.0.1 -P 8066
创建测试库和表
sql
create database CATTEST; --创CATTEST库
mysql>
mysql> use CATTEST;
Database changed
mysql> create table test(id int);
Query OK, 0 rows affected (0.38 sec)
mysql> insert into test valuse(1);
ERROR 1064 (HY000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'valuse (valuse)' at line 1
mysql> insert into test values(1);
Query OK, 1 row affected (0.01 sec)
mysql>
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| CATTEST |
| information_schema |
| mycat |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
总结
弥补了上一期的MyCAT的不完整 所以 这次 做了了一个相对来说完整的 包括怎么配置等等 其实还想写分库分表的 但理了一下思路 好像在这篇文章去说的话 就会很多了 所以 下篇文章去完整去说
好了 更新的评论越来越慢 但也没办法 博主尽量像写的详细易懂一点 OK 希望大家生活是幸福的 知道自己为了什么努力 下期再见!!!