MyCAT实现mysql8主从同步读写分离

本文主要介绍用mycat配置实现MySQL主从读写分离。

MyCAT是目前最流行的分布式数据库中间插件,是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器。前端用户可以把它看作一个数据库代理,用MySQL客户端工具和命令行访问,其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是*分表分库*,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

配置逻辑:先安装mycat,然后测试mycat是否能正常工作,然后将主从配置到mycat上面

mycat安装:

1、下载安装包 下载对应的tar安装包,以及对应的jar包

资源地址:http://dl.mycat.org.cn/2.0/

安装程序包: 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的datasourcesuser,因为可以直接在本地进行数据库的连接和测试。这有助于确保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 distribution

Copyright (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进行读写分离的全部配置,详细功能配置建议参考官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值