链接: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