本文主要介绍用mycat配置实现MySQL主从读写分离。
MyCAT是目前最流行的分布式数据库中间插件,是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器。前端用户可以把它看作一个数据库代理,用MySQL客户端工具和命令行访问,其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是*分表分库*,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
配置逻辑:先安装mycat,然后测试mycat是否能正常工作,然后将主从配置到mycat上面
mycat安装:
1、下载安装包 下载对应的tar安装包,以及对应的jar包
安装程序包: http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip
Jar包:http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies.jar
2、百度网盘:链接:https://pan.baidu.com/s/1VSQou4wRFW_PERWfL14M6A?pwd=m66d
提取码:m66d
这里可以自己去官网,也可以自己从我给的网盘下载,一共三个文件
安装:
yum install unzip -y
unzip mycat2-install-template-1.21.zip -d /usr/local/
cp mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/
cd /usr/local/mycat/bin/
chmod +x ./*
[root@VM-0-8-centos mycat]# ll
total 16
drwxr-xr-x 2 root root 4096 Mar 5 2021 bin #执行命令的目录
drwxr-xr-x 9 root root 4096 Mar 5 2021 conf #配置文件所在目录
drwxr-xr-x 2 root root 4096 Feb 8 17:27 lib #地三方依赖
drwxr-xr-x 2 root root 4096 Feb 9 10:20 logs #日志文件所在地
以上我们就已经安装好了mycat
测试
通过安装一个本地的MySQL实例,可以更容易地配置MyCAT的datasources
和user
,因为可以直接在本地进行数据库的连接和测试。这有助于确保MyCAT的配置是正确的,并且能够在不依赖外部网络的情况下进行基本的测试和验证。
mycat本身是个中间件,datasources目录下面就是通过添加配置文件来添加数据源,可以通过在conf/datasources/
目录下添加多个.datasource.json
文件来配置多个数据源,并且可以设置主从配置选项以实现负载均衡和高可用。每个文件代表一个数据源,文件内包含了连接该数据源所需的各种参数,如数据库类型、URL、用户名、密码等。
user则是配置用于登录mycat的用户
我们查看datasources里面的配置文件
[root@VM-0-8-centos mycat]# tail conf/datasources/prototypeDs.datasource.json
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"prototypeDs",
"password":"@OPENlab123",#这是我们待会儿设置本地用户的密码,明文
"type":"JDBC",
"url":"jdbc:mysql://localhost:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",#MySQL一些配置,后端MySQL的JDBC连接地址
"user":"root",#用户
"weight":0#配置数据源负载均衡的使用权重
}
user文件,用配置登录mycat的用户
[root@VM-0-8-centos mycat]# tail conf/users/root.user.json
{
"dialect":"mysql",#数据库(方言)类型
"ip":null,#配置白名单,一般为null,除非要限定为指定用户
"password":"@OPENlab123",
"transactionType":"proxy",#(本地事务,在涉及大于1个数据库的事务,commit阶段失败会导致不一致,但是兼容性最好)可选值:xa(事务,需要确认存储节点集群类型是否支持XA)
"username":"root"#这里默认是root,我们需要添加一个为demo的用户用于登录
}
[root@VM-0-8-centos mycat]# cp conf/users/root.user.json conf/users/demo.user.json
然后修改里面的user字段为demo用户
登录到mycat上面会间接的访问底层的MySQL,相当于一个上层封装
下载MySQL
dnf install mysql-server -y
[root@VM-0-8-centos mycat]# mysql --version
mysql Ver 8.0.26 for Linux on x86_64 (Source distribution)
初次安装应该进入是没有密码的,有的话也可以在mysql的日志文件中查看(/var/log/mysql/mysqld.log)
然后我们修改MySQL的root用户密码 ,在终端中输入:
mysqladmin -uroot password '@OPENlab123'
然后添加一个用户demo,用于待会儿远程登录测试:
CREATE USER 'demo'@'%' IDENTIFIED WITH mysql_native_password BY '@OPENlab123';
---视情况赋权限
GRANT ALL PRIVILEGES ON *.* TO 'demo'@'%' ;
现在我们可以正式测试mycat了,我们可以通过进入到/usr/local/mycat/bin目录中(你自己安装的目录)使用./mycat start
#--------相关命令--------
cd mycat/bin
./mycat start
./mycat status
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动
./mycat remove 取消随系统自动启动
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态…
#-------------------------------------
# ./mycat start
Starting mycat2...# ./mycat status
mycat2 is running (3934).
mycat监听的端口是8066和9066
[root@VM-0-8-centos mycat]# netstat -lntup | grep -E '9066|8066'
tcp6 0 0 127.0.0.1:9066 :::* LISTEN 349974/java
tcp6 0 0 :::8066 :::* LISTEN 349974/java
我们在另一台主机上试着登录(注意防火墙和selinux)
[root@server-test ~]# mysql -udemo -h132.232.210.127 -P8066 -p@OPENlab123
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 0
Server version: 5.7.33-mycat-2.0 Source distributionCopyright (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)]> show databases;
+--------------------+
| `Database` |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.121 sec)
测试完毕可以正常运行,在下面开始添加主从服务器到mycat上面之前,先介绍下其他配置信息:
逻辑库与逻辑表(logicaltable)
作用:配置MyCAT里面和MySQL对应的逻辑表。
逻辑库是由一个或多个数据库集群构成的虚拟数据库,用于MyCAT直连操作数据库。它是MyCAT对底层多个物理数据库的抽象,使得应用程序可以像操作单一数据库一样操作多个数据库。
逻辑表是逻辑库中读写数据的表,是MyCAT对底层多个物理表的抽象。逻辑表可以是数据切分后分布在一个或多个分片库中的表,也可以是不进行数据切分、只由一个表构成的表。
配置位置:mycat/conf/schemas/{库名}.schema.json
{
"customTables": {},
"globalTables": {},
"normalTables": {},
"schemaName": "test",
"shardingTables": {},
"targetName": "prototype"
}
配置说明
1)customTables:自定义表
2)globalTables:全局表
3)normalTables:默认表
4)schemaName:库名
5)shardingTables:分片表
6)targetName:数据源名,也可以是集群名
MyCat2主从搭建
在正式搭建的时候,可以通过配置上面datasources文件,命名格式为mycat/conf/datasources/{数据源名字}.datasource.json。
但官方给的推荐做法是,使用注释配置:在登入mycat的客户端中授权的用户可以
我们以root用户本地登录一下mycat
[root@VM-0-8-centos users]# mysql -uroot -p@OPENlab123 -P8066 -h192.168.40.150#本地IP地址
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.33-mycat-2.0 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> /*+ mycat:createUser{
-> "username":"user",
-> "password":"",
-> "ip":"127.0.0.1",
-> "transactionType":"xa"}
-> */;
Query OK, 0 rows affected (0.31 sec)mysql> /*+ mycat:showUsers */;
+----------+-----------+-----------------+--------+
| username | ip | transactionType | dbType |
+----------+-----------+-----------------+--------+
| root | NULL | proxy | mysql |
| user | 127.0.0.1 | xa | mysql |
| demo | NULL | proxy | mysql |
+----------+-----------+-----------------+--------+
3 rows in set (0.01 sec)
此时,conf/user/多了一个user.user.json文件里面就是我们的配置文件(好处是添加配置文件后不需要重启服务)
1. 默认权限设计
- MyCat2 默认将 `root` 用户视为超级管理员,拥有所有管理权限(如添加用户、数据源等)。
- 非 root 用户的权限需要显式配置,否则默认无管理权限。
2. 权限控制粒度
- MyCat2 通过配置文件的 `privileges` 字段定义用户权限,未配置时默认拒绝操作。
- 注释配置(如 `/*+ mycat:xxx{} */`)属于管理类操作,需要明确的权限授权。
3. 配置隔离
- 用户权限和数据源权限是分离的,普通用户默认只能执行 SQL 查询,不能修改底层配置。
后续的配置我们采用注释配置的方式进行配置,一下是相关的命令:
#重置配置
/*+ mycat:resetConfig{} */
#创建登录mycat用户
/*+ mycat:createUser{
"username":"user",
"password":"",
"ip":"127.0.0.1",
"transactionType":"xa"}
*/#删除用户
/*+ mycat:dropUser{ "username":"user"} */
#显示用户
/*+ mycat:showUsers */
#新建数据源
/*+ mycat:createDataSource{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"dc1",
"password":"123456",
"type":"JDBC",
"url":"jdbc:mysql://127.0.0.1:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
"user":"root",
"weight":0}
*/;#删除数据源
/*+ mycat:dropDataSource{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"dc1",
"type":"JDBC",
"weight":0}
*/;#显示数据源
/*+ mycat:showDataSources{} */
集群相关的
#创建集群
/*! mycat:createCluster{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetry":3,
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
"masters":[
"dc1" //主节点
],
"maxCon":200,
"name":"c0",
"readBalanceType":"BALANCE_ALL",
"replicas":[
"dc2" //从节点
],
"switchType":"SWITCH"
} */#删除集群
/*! mycat:dropCluster{ "name":"c0"} */;
#显示集群
/*+ mycat:showClusters{} */
MyCat2的主从配置
前提,先搭建好MySQL的主从配置,登录MyCAT 2在MyCAT2里面操作,也就是连接8066这个端口。
登录Mycat,创建逻辑库,配置数据源
mysql -uroot -p@OPENlab123 -P8066 -h192.168.40.150
使用注解的方式添加数据源,指向从机。不过再次之前需要在主从结构中创建用户用于mycat进行登录:
master上创建用户:
CREATE USER 'mycat'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
--必须要赋的权限mysql8才有的
GRANT XA_RECOVER_ADMIN ON *.* TO 'mycat'@'%';
---视情况赋权限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
flush privileges;
注释配置:
/*+ mycat:createDataSource{
"name":"rwmaster",
"url":"jdbc:mysql://192.168.40.151:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"mycat",
"password":"@OPENlab123"
} */
/*+ mycat:createDataSource{
"name":"rwslave1",
"url":"jdbc:mysql://192.168.40.152:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true",
"user":"mycat",
"password":"192.168.40.152"
} */
...
然后可以通过/*+ mycat:showDataSources{} */\G;查看添加的数据源
现在可以更新集群信息,添加节点了:
/*!mycat:createCluster{"name":"prototype","masters":["rwmaster"],"replicas":["rwslave1"]} */;#这里的prototype就是之前配置的逻辑数据库名称
验证配置的集群信息:
mysql> /*+ mycat:showClusters{} */\G;
*************************** 1. row ***************************
NAME: prototype
SWITCH_TYPE: SWITCH
MAX_REQUEST_COUNT: 2000
TYPE: BALANCE_ALL
WRITE_DS: rwmaster
READ_DS: rwmaster,rwslave1
WRITE_L: io.mycat.plug.loadBalance.BalanceRandom$1
READ_L: io.mycat.plug.loadBalance.BalanceRandom$1
AVAILABLE: true
1 row in set (0.01 sec)
也可以直接查看集群配置文件cat /usr/local/mycat/conf/clusters/prototype.cluster.json
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetryCount":3,
"minSwitchTimeInterval":300,
"showLog":false,
"slaveThreshold":0.0
},
"masters":[
"rwmaster"
],
"maxCon":2000,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"replicas":[
"rwslave1"
],
"switchType":"SWITCH"
}
名词解释:
readBalanceType
查询负载均衡策略
可选值:
BALANCE_ALL(默认值)
获取集群中所有数据源
BALANCE_ALL_READ
获取集群中允许读的数据源
BALANCE_READ_WRITE
获取集群中允许读写的数据源,但允许读的数据源优先
BALANCE_NONE
获取集群中允许写数据源,即主节点中选择
switchType
NOT_SWITCH:不进行主从切换
SWITCH:进行主从切换
进入mycat中
创建数据库mydb1:create database mydb1;此时会多出来一个mydb1.schema.json,我们指定这个数据库与我们添加的集群prototype关联
vim /usr/local/mycat/conf/schemas/mydb1.schema.json
{
"customTables":{},
"globalTables":{},
"normalProcedures":{},
"normalTables":{},
"schemaName":"mydb1",
"targetName":"prototype",#这里添加一行,指定数据源也可以是集群源,名字为prototype
"shardingTables":{},
"views":{}
}
我们现在验证下效果:我们由于指定了创建的数据库mydb1和对应的集群源,那么访问master或slave上面的数据也就会有
mysql> use mydb1
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> create table stud(
-> id int primary key,
-> name varchar(20));
Query OK, 0 rows affected (1.14 sec)
mysql> insert into stud values (1,'zhangsan'),(2,'lisi');
Query OK, 2 rows affected (0.07 sec)
#下面不是必须的,刷新物理表
mysql> /*+ mycat:repairPhysicalTable{} */;
Query OK, 0 rows affected (0.00 sec)
我们在master上面查看数据内容:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mydb1 |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
6 rows in set (0.00 sec)
mysql> use mydb1
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------+
| Tables_in_mydb1 |
+-----------------+
| stud |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from stud;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
+----+----------+
2 rows in set (0.00 sec)
以上就是使用mycat进行读写分离的全部配置,详细功能配置建议参考官方文档