Mycat2是Mycat社区开发的一款分布式关系型数据库(中间件)。它支持分布式SQL查询,兼容MySQL通信协议,以Java生态支持多种后端数据库,通过数据分片提高数据查询处理能力。
源码地址
https://github.com/MyCATApache/Mycat2
https://gitee.com/MycatOne/Mycat2
官网
http://www.mycat.org.cn/
http://mycatone.top/
MySQL主从复制:一个master主数据库,一个slave从数据库
并提前创建好一个数据库test
http://t.csdn.cn/M1YVr
安装包下载地址(不需要手动下载,Dockerfile中会配置):
http://dl.mycat.org.cn/2.0/
请使用openjdk:8-jre版本,其他版本apt-get会报错
FROM openjdk:8-jre
ENV AUTO_RUN_DIR ./mycat2
ENV DEPENDENCE_FILE mycat2-1.22-release-jar-with-dependencies.jar
ENV TEMPLATE_FILE mycat2-install-template-1.21.zip
RUN sed -i "s@http://.*archive.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN sed -i "s@http://.*security.ubuntu.com@http://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN buildDeps='procps wget unzip' \
&& apt-get update \
&& apt-get install -y $buildDeps
# 安装地址 http://dl.mycat.org.cn/2.0/
# http://dl.mycat.org.cn/2.0/1.22-release/
# http://dl.mycat.org.cn/2.0/install-template/
RUN wget -P $AUTO_RUN_DIR/ http://dl.mycat.org.cn/2.0/1.22-release/$DEPENDENCE_FILE \
&& wget -P $AUTO_RUN_DIR/ http://dl.mycat.org.cn/2.0/install-template/$TEMPLATE_FILE
# 解压缩template框架后将jar包移动到mycat文件夹下的lib目录下,并对lib目录及其下面的所有文件授权
RUN cd $AUTO_RUN_DIR/ \
&& unzip $TEMPLATE_FILE \
&& ls -al . \
&& mv $DEPENDENCE_FILE mycat/lib/ \
&& chmod +x mycat/bin/* \
&& chmod 755 mycat/lib/* \
&& mv mycat /usr/local
#copy mycat /usr/local/mycat/
VOLUME /usr/local/mycat/conf
VOLUME /usr/local/mycat/logs
EXPOSE 8066 1984
CMD ["/usr/local/mycat/bin/mycat", "console"]
docker build -t mycat2:1.22 .
如果有现成的mysql,以及mysql用户可以跳过当前步骤;
因为我们在刚开始的环境准备时候已经搭建好了环境所以,这里我直接跳过这一步。
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
登录进去mysql(账号:root,密码:123456),并创建用户以及对应的权限配置,用户名为mycat,密码为123456,赋权限XA_RECOVER_ADMIN对于mysql 8需要,低版本不需要
这里,我是直接在master主数据库上创建该账户的。
CREATE USER 'mycat'@'%' IDENTIFIED BY '123456';
-- 必要的赋权,只有mysql8才有,我用的5.7版本,下面这行直接跳过
GRANT XA_RECOVER_ADMIN ON *.* TO 'root'@'%';
-- 普通的赋权
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
-- 刷新权限
flush privileges;
docker run -d --name=mycat2 -p 8066:8066 -p 1984:1984 mycat2:1.22
# 复制容器内配置
docker cp mycat2:/usr/local/mycat/conf .
docker cp mycat2:/usr/local/mycat/logs .
mycat配置文件夹结构
+ clusters
- prototype.cluster.json //无集群的时候自动创建
+ datasources
- prototypeDs.datasource.json //无数据源的时候自动创建
+ schemas
- mysql.schema.json
+ sequences
- db1_schema.sequence.json//配置全局序列才会有的文件
- server.json //服务器配置
- state.json //mycat运行状态,包含集群选举的主节点信息,配置时间戳
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Itv7Rn5-1684581514177)(C:\Users\ubunt\AppData\Roaming\Typora\typora-user-images\1684569268218.png)]
prototypeDs.datasource.json 该配置不能删除,可以设置用户、密码、数据库,该配置会在启动Mycat2时创建名为mycat的数据库,库中有mycat所需的数据表
cd /conf/datasources
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"prototypeDs",
"password":"123456",
"type":"JDBC",
"url":"jdbc:mysql://172.17.0.6:3306/test?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"mycat",
"weight":0
}
修改mycat的conf下prototype的配置(文件路径conf/datasources/prototypeDs.datasource.json)
修改其中对应的user(用户),password(密码),url中的ip,这里我们用刚才在master数据库中创建好的mycat账户,填入其中。
url需要查询docker容器ip地址
#查询所有正在运行的容器的IP地址 docker inspect -f '{{.Name}} => {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
如果你是按照我的方法创建的数据库容器,那么ip地址就选那个叫mysql-master的容器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gNGmmlHC-1684581514177)(C:\Users\ubunt\AppData\Roaming\Typora\typora-user-images\1684568420913.png)]
cd /conf/users
文件路径conf/users/root.user.json
{
"dialect":"mysql",
"ip":null,
"password":"123456",
"transactionType":"proxy",
"username":"root",
"isolation":3
}
参数解释
username,password 。这里设置的是登录mycat的账户(不要和上面master数据库的账户搞混淆哦)。
transactionType:事务类型
isolation:设置初始化的事务隔离级别
READ_UNCOMMITTED:1
READ_COMMITTED:2
REPEATED_READ:3,默认
SERIALIZABLE:4
docker run -d --name=mycat2 -p 8066:8066 -p 1984:1984 -v $PWD/conf:/usr/local/mycat/conf -v $PWD/logs:/usr/local/mycat/logs mycat2:1.22
# 以root用户权限进入容器
docker exec -it -u root mycat2 bash
# 容器启动失败的时候,查看容器启动日志
docker logs -f mycat2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P8SdD5np-1684581514178)(C:\Users\ubunt\AppData\Roaming\Typora\typora-user-images\1684572599479.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMq2jEUF-1684581514178)(C:\Users\ubunt\AppData\Roaming\Typora\typora-user-images\1684572947861.png)]
登录Mycat后:直接创建一个test数据库
create database test;
执行后,在/conf/schemas/文件下多出一个 test.schema.json 文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VsBIqXzk-1684581514178)(C:\Users\ubunt\AppData\Roaming\Typora\typora-user-images\1684573673408.png)]
test.schema.json:
{
"customTables":{},
"globalTables":{},
"normalProcedures":{},
"schemaName":"test",
"shardingTables":{},
"targetName":"prototype",
"views":{}
}
然后继续执行以下注释:
/*+ mycat:createDataSource{ "name":"master",
"url":"jdbc:mysql://172.17.0.6:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true", "user":"root",
"password":"123456" } */;
/*+ mycat:createDataSource{ "name":"slave",
"url":"jdbc:mysql://172.17.0.7:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true", "user":"root",
"password":"123456" } */;
#查询配置数据源结果
/*+ mycat:showDataSources{} */;
配置从库权限:
vim /conf/datasources/ slave.datasource.json
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iX6V94hB-1684581514179)(C:\Users\ubunt\AppData\Roaming\Typora\typora-user-images\1684575720712.png)]
#更新集群信息,添加dr0从节点.
/*!
mycat:createCluster{"name":"prototype","masters":["master"],"replicas":["slave"]} */;
#查看配置集群信息
/*+ mycat:showClusters{} */;
#查看集群配置文件
vim /conf/clusters/prototype.cluster.json
docker restart mycat2
#建表语句
CREATE TABLE mytbl(id INT,NAME VARCHAR(50));
#插入数据
INSERT INTO mytbl VALUES(1,"zhang3");
SELECT * FROM test.mytbl;
如果查询结果多次出现zhang3,li4证明读写分离配置成功,mycat的默认负载均衡不是平均轮询(主库从库各访问一次)的,所以需要多尝试几次。
至此,mycat读写分离就完成了,在配置过程中遇到了很多的小麻烦,如果没遇到就跳过这个段内容,造成的原因大概有一下几个方面:
1、文件夹或文件的权限太低,导致软件启动无法读取配置,建议配置全部完成后,统一给mycat路径赋权限。
2、主从数据源配置问题,地址、数据库、命名name忘记改对,因为是复制的,总是少改。
3、还有就是启动不起来,一直报错Duplicate key LogicSchemaConfig,这个原因就是在自己测试的时候创建了重复的schema,比如,在配置读写分离之前利用mycat创建了test_data库,然后配置好读写分离,再次启动就会有这个问题,另外,就是没有配置读写分离,就是简单的使用mycat,但是在datasources下存在多个datasource.json文件,也是会出这个问题。