mycat2入门教程

链接:https://pan.baidu.com/s/15e6cljmlmj1VMSN5WoklYw 
提取码:xlpz

把文件上传到一个目录

cd /root/mycat

解压

unzip mycat2-install-template-1.20.zip 

然后把jar包拷贝到mycat的lib下

cp mycat2-1.21-release-jar-with-dependencies.jar /root/mycat/mycat/lib/

对mycat文件赋予权限

cd /root/mycat/mycat

chmod u+x bin/*

 mycat只是一个代理,需要先安装mysql数据库

docker run -d -p 13306:3306 --privileged=true -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql:5.7
cd /root/mycat/mycat/conf/datasources

vi prototypeDs.datasource.json

只修改密码,就是mysql的密码和url,就是你的mysql连接这两部分,其他不动

 我这里改成这样,咱们安装的mysql端口是13306,所以这里要注意

然后启动mycat

cd /root/mycat/mycat/bin

./mycat start

ps aux|grep mycat

 查看有没有启动成功

 查看日志文件有没有报错

cd /root/mycat/mycat/logs

cat wrapper.log 

如果要停止mycat,可以使用 

./mycat stop

这里没有报错就表示,启动成功了

 我们看下mycat的用户名和密码

cd /root/mycat/mycat/conf/users

cat root.user.json 

可以看到账号是root,密码是123456,端口号默认是8066

 接下来我们连接下mycat

 mycat的端口在这里看

cd /root/mycat/mycat/conf

cat server.json

 接下来我们在mycat创建一个用户

/*+ mycat:createUser{
	"username":"user",
	"password":"",
	"ip":"127.0.0.1",
	"transactionType":"xa"
} */

显示用户

/*+ mycat:showUsers */

cd /root/mycat/mycat/conf/users

ll

 可以看到这这个目录多了一个文件

 接下来删除创建的用户

/*+ mycat:dropUser{
	"username":"user"} */

可以看到用户已经删除了,配置文件也没有了

 接下来我们在看下创建数据源

/*+ mycat:createDataSource{
"name":"sj01",
"url":"jdbc:mysql://127.0.0.1:3306/mysql",
"user":"root",
"password":"xxxx"
} */;

显示数据源

/*+ mycat:showDataSources{} */

cd /root/mycat/mycat/conf/datasources

ll

可以看到,在这个目录就多了一个文件

 接下来删除数据源

/*+ mycat:dropDataSource{
	"name":"sj01"
} */;

 配置文件也没有了

 接下来我们看下集群的创建,在这之前先创建2个数据源

一个主数据源,一个从数据源

/*+ mycat:createDataSource{
"name":"zhu",
"url":"jdbc:mysql://127.0.0.1:3306/mysql",
"user":"root",
"password":"xxxx"
} */;



/*+ mycat:createDataSource{
"name":"cong",
"url":"jdbc:mysql://127.0.0.1:3306/mysql",
"user":"root",
"password":"xxxx"
} */;

创建集群

/*! mycat:createCluster{"name":"c0","masters":["zhu"],"replicas":["cong"]} */;

查看集群

/*+ mycat:showClusters{} */

cd /root/mycat/mycat/conf/clusters
ll

可以看到多了一个文件

 接下来删除集群

/*! mycat:dropCluster{
	"name":"c0"
} */;

 可以看到文件没有了

接下来我们在安装一个mysql,做成主从复制

docker run -d -p 13307:3306 --privileged=true -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql:5.7

 连接一下是否成功,注意端口13307

 接下来我们修改主机配置文件

cd /mydata/mysql-master/conf
 
vi my.cnf
 
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

修改从机的配置文件 

cd /mydata/mysql-slave/conf
 
vi my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1

然后我们重启master的数据,并且给进入master给从机创建一个用户

然后重启docker
 
docker restart mysql-master
 
进入容器
docker exec -it mysql-master /bin/bash
 
mysql -uroot -p123456
 
master容器创建数据同步用户
 
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
 
查看主从同步状态
show master STATUS;

 新开一个窗口,重启slave的mysql

docker restart mysql-slave
进入mysql-slave容器
 
docker exec -it mysql-slave /bin/bash
 
mysql -uroot -p123456
 
从数据库中配置主从复制
 
change master to master_host='192.168.184.145', master_user='slave', master_password='123456', master_port=13306, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;



主从复制命令参数说明
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
 
 
在slave数据库查看 主从同步状态
 
show slave status \G;
 
在slave数据库 开启主从同步
start slave;
 
在slave数据库查看 主从同步状态
show slave status \G;

 接下来我们在master创建一个数据库,然后再slave刷新

 接下来,我们把之前测试的数据源zhu,cong2个删除掉

/*+ mycat:dropDataSource{
	"name":"zhu"
} */;

/*+ mycat:dropDataSource{
	"name":"cong"
} */;



/*+ mycat:showDataSources{} */

接下来为mysql的主从,配置新的数据源

/*+ mycat:createDataSource{
"name":"xie",
"url":"jdbc:mysql://192.168.184.145:13306",
"user":"root",
"password":"123456"
} */;

/*+ mycat:createDataSource{
"name":"du",
"url":"jdbc:mysql://192.168.184.145:13307",
"user":"root",
"password":"123456"
} */;



/*+ mycat:showDataSources{} */

 

 为读写配置集群

/*! mycat:createCluster{"name":"c0","masters":["xie"],"replicas":["du"]} */;



/*+ mycat:showClusters{} */

 主节点是写,从节点是读

然后再mycat 创建数据库和表,可以看到mysql的主从都有数据了

 接下来我们在看下mysql的多主多从,基于之前的安装,

我们在配置一个master1的从节点,然后再配置一个master2的主节点和从节点

docker run -d -p 13308:3306 --privileged=true -v /mydata/mysql-slave-2/log:/var/log/mysql -v /mydata/mysql-slave-2/data:/var/lib/mysql -v /mydata/mysql-slave-2/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave-2 mysql:5.7
docker run -d -p 13309:3306 --privileged=true -v /mydata/mysql-master2/log:/var/log/mysql -v /mydata/mysql-master2/data:/var/lib/mysql -v /mydata/mysql-master2/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master2 mysql:5.7
docker run -d -p 13310:3306 --privileged=true -v /mydata/mysql-slave2/log:/var/log/mysql -v /mydata/mysql-slave2/data:/var/lib/mysql -v /mydata/mysql-slave2/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave2 mysql:5.7

接下来进入配置文件

cd /mydata/mysql-slave-2/conf

vi my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=103
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave-2-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
cd /mydata/mysql-master2/conf

vi my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=104
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall2-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
 

cd /mydata/mysql-slave2/conf

vi my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=105
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave2-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1

然后重启mysql


docker restart mysql-slave-2


docker restart mysql-master2


docker restart mysql-slave2

然后使用navicat连接一下

 接下来我们为这3台节点配置主从,

先配置mysql-slave-2

docker exec -it mysql-slave-2 /bin/bash

mysql -uroot -p123456

 从数据库中配置主从复制,这里要注意,主节点的偏移量变成了2721,master_log_pos=2721

change master to master_host='192.168.184.145', master_user='slave', master_password='123456', master_port=13306, master_log_file='mall-mysql-bin.000001', master_log_pos=2721, master_connect_retry=30;
show slave status \G;
 
在slave数据库 开启主从同步
start slave;
 
在slave数据库查看 主从同步状态
show slave status \G;

退出容器,接下来配置master2,因为master2也是master1的从机

docker exec -it mysql-master2 /bin/bash

mysql -uroot -p123456
change master to master_host='192.168.184.145', master_user='slave', master_password='123456', master_port=13306, master_log_file='mall-mysql-bin.000001', master_log_pos=2721, master_connect_retry=30;
show slave status \G;
 
在slave数据库 开启主从同步
start slave;
 
在slave数据库查看 主从同步状态
show slave status \G;

接下来在master2容器里面创建数据同步的用户,为他的从机使用


 
CREATE USER 'slave2'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave2'@'%';

在master2节点上查看节点状态

show master status;

  打开另一个窗口,配置slave2

docker exec -it mysql-slave2 /bin/bash

mysql -uroot -p123456

这里要注意了,这里的数据都是master2的数据,用户也是master2创建是同步用户

change master to master_host='192.168.184.145', master_user='slave2', master_password='123456', master_port=13309, master_log_file='mall2-mysql-bin.000001', master_log_pos=619, master_connect_retry=30;
show slave status \G;
 
在slave数据库 开启主从同步
start slave;
 
在slave数据库查看 主从同步状态
show slave status \G;

接下来我们在master1数据库创建db2,可以看到,从1,从1-2,master2都有数据了

然后再master2创建db3数据库,可以看到在从2数据库刷新了

 接下来我们为mycat配置双主双从

先配置3个数据源

/*+ mycat:createDataSource{
"name":"du-2",
"url":"jdbc:mysql://192.168.184.145:13308",
"user":"root",
"password":"123456"
} */;



/*+ mycat:createDataSource{
"name":"xie2",
"url":"jdbc:mysql://192.168.184.145:13309",
"user":"root",
"password":"123456"
} */;



/*+ mycat:createDataSource{
"name":"du2",
"url":"jdbc:mysql://192.168.184.145:13310",
"user":"root",
"password":"123456"
} */;



/*+ mycat:showDataSources{} */

我们先把之前的集群删除掉,然后配置新的集群

 

/*! mycat:dropCluster{
	"name":"c0"
} */;


/*! mycat:createCluster{"name":"c0","masters":["xie","xie2"],"replicas":["du","du-2","du2"]} */;



/*+ mycat:showClusters{} */

然后我们在mycat创建数据库和表,可以看到数据已经发生了变化

 

 接下来我们在看下分库分表

垂直切分:就是把不相关的表分成多个数据库,比如系统表分为一个库,库存表分为1个库,订单表分为一个库

水平切分:表结构相同,数据不同,就是订单表里面有北京的用户,上海的用户,北京的放一个库,上海的放一个库

当我们的mysql的数据达到了比如说600万的数据,我们就采用分库分表

先重置mycat环境,重置配置

/*+ mycat:resetConfig{} */

 然后把数据库全部删除掉,数据目录,配置文件也全删掉,我们重新安装5个数据库

一个是mycat的默认数据库,2主2从

docker run -d -p 13305:3306 --privileged=true -v /mydata/mysql-mycat/log:/var/log/mysql -v /mydata/mysql-mycat/data:/var/lib/mysql -v /mydata/mysql-mycat/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=123456 --name mysql-mycat mysql:5.7


docker run -d -p 13306:3306 --privileged=true -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master mysql:5.7


docker run -d -p 13307:3306 --privileged=true -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave mysql:5.7



docker run -d -p 13308:3306 --privileged=true -v /mydata/mysql-master2/log:/var/log/mysql -v /mydata/mysql-master2/data:/var/lib/mysql -v /mydata/mysql-master2/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master2 mysql:5.7


docker run -d -p 13309:3306 --privileged=true -v /mydata/mysql-slave2/log:/var/log/mysql -v /mydata/mysql-slave2/data:/var/lib/mysql -v /mydata/mysql-slave2/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave2 mysql:5.7

我们先进去mycat目录,停掉mycat

cd /root/mycat/mycat/bin

./mycat stop

然后修改配置文件

cd /root/mycat/mycat/conf/datasources

vi prototypeDs.datasource.json

把端口号改一下 ,改成13305

 然后再重启mycat

cd /root/mycat/mycat/bin

./mycat start

接下来我们在配置mysql的主从,注意了,m2的节点就和m1的节点没有关系了

my.cnf还是之前的,可以从上面拿,记得配置好

进入m1容器


docker exec -it mysql-master /bin/bash
 
mysql -uroot -p123456
 

 
CREATE USER 'slave3'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave3'@'%';
 

show master STATUS;

 

 

新开一个窗口,进入s1容器

docker exec -it mysql-slave /bin/bash
 
mysql -uroot -p123456


change master to master_host='192.168.184.145', master_user='slave3', master_password='123456', master_port=13306, master_log_file='mall-mysql-bin.000002', master_log_pos=836, master_connect_retry=30;


start slave;


show slave status \G;

接下来开启新的窗口,进入m2容器


docker exec -it mysql-master2 /bin/bash
 
mysql -uroot -p123456


CREATE USER 'slave4'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave4'@'%';


show master status;

 接下来开启新的窗口,进入s2容器

docker exec -it mysql-slave2 /bin/bash
 
mysql -uroot -p123456

change master to master_host='192.168.184.145', master_user='slave4', master_password='123456', master_port=13308, master_log_file='mall2-mysql-bin.000002', master_log_pos=619, master_connect_retry=30;

如果出现这种错误,执行stop slave; 然后再执行上面的命令

 开启主从同步并查询状态


start slave;
 
show slave status \G;

接下来验证下数据库,主机创建数据库,从机刷新

 接下来为mycat配置4个数据源

/*+ mycat:createDataSource{
"name":"m1",
"url":"jdbc:mysql://192.168.184.145:13306",
"user":"root",
"password":"123456"
} */;



/*+ mycat:createDataSource{
"name":"s1",
"url":"jdbc:mysql://192.168.184.145:13307",
"user":"root",
"password":"123456"
} */;

/*+ mycat:createDataSource{
"name":"m2",
"url":"jdbc:mysql://192.168.184.145:13308",
"user":"root",
"password":"123456"
} */;


/*+ mycat:createDataSource{
"name":"s2",
"url":"jdbc:mysql://192.168.184.145:13309",
"user":"root",
"password":"123456"
} */;



/*+ mycat:showDataSources{} */

接下来配置mycat集群

注意:自动分片默认要求集群名称以c为前缀,数字为后缀
c0就是分片表第一个节点;
c1就是分片表第二个节点; 

/*! mycat:createCluster{"name":"c0","masters":["m1"],"replicas":["s1"]} */;

/*! mycat:createCluster{"name":"c1","masters":["m2"],"replicas":["s2"]} */;


/*+ mycat:showClusters{} */

 接下来我们看下mycat全局表(广播表)配置

全局表就是在所有库都存在,并且数据都一样

先在mycat创建数据库,然后执行建表语句,可以看到所有数据库都有这个表了

注意BROADCAST这个是广播的意思,不加这个就不会在其他数据库显示

CREATE TABLE IF NOT EXISTS db6.`biao` (
	`id` int NOT NULL AUTO_INCREMENT,
	`address` varchar(255) NULL,
	PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8mb4 BROADCAST
;

接下来我们在看下mycat的分片表配置

在mycat上执行建表语句

CREATE TABLE IF NOT EXISTS db6.`order` (
	`id` int NOT NULL AUTO_INCREMENT,
	`address` varchar(255) NULL,
	`customer_id` varchar(255) NULL,
	PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8mb4 

dbpartition by mod_hash(customer_id) tbpartition by mod_has(customer_id)

tbpartitions 1 dbpartitions 2

;

 取模算法就是对2个数据库取余,一个放入主,一个放入从

分片字段是客户id

dbpartition by mod_hash(customer_id):指定数据库的分片算法及使用那一条数据进行分片hash

tbpartition by mod_hash(customer_id):指定表的分片算法及使用那一条数据进行分片hash

tbpartitions 1 表的分片数量
dbpartitions 2 数据库的分片数量

可以看到mycat为我们动态创建了_0,_1的数据库,就是按照客户id取模插入不同的数据库

 我们在mycat来插入一些数据

INSERT INTO `db6`.`order` ( id,`address`, `customer_id`) VALUES (100,'aa', '101');
INSERT INTO `db6`.`order` ( id,`address`, `customer_id`) VALUES (101,'bb', '102');

INSERT INTO `db6`.`order` ( id,`address`, `customer_id`) VALUES (102,'cc', '103');
INSERT INTO `db6`.`order` ( id,`address`, `customer_id`) VALUES (103,'dd', '104');

 可以看到_0数据库存储了一部分数据,_1存储了一部分数据

 

 我们在mycat查询一下表的数据,可以看到所有数据都被查询出来了

 

如果id没有插入,那么主键自增,mycat会为我们使用雪花算法来创建,类型必须是bigint,因为他的长度是18位

 

如果在java代码使用,只需要连接mycat的数据库就可以了

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://192.168.184.145:8066/db6
    username: root
    password: 123456


 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值