Docker 部署Mycat2

Docker 部署Mycat2

分布式数据库中间件Mycat2简介

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/

1.Dockerfile文件

请使用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"]

2.编译镜像

docker build -t mycat2:1.22 .

3.创建mysql

如果有现成的mysql,以及mysql用户可以跳过当前步骤;

因为我们在刚开始的环境准备时候已经搭建好了环境所以,这里我直接跳过这一步。

docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

4.为Mycat创建一个MySQL账户(后面配置文件prototypeDs.datasource.json会用到)

登录进去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;

创建镜像

1.复制配置

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 .

Mycat2配置

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)]

1.数据源配置

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)]

2.修改登录用户

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

3.创建容器

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

登录Mycat2

1.使用navicat登录Mycat2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P8SdD5np-1684581514178)(C:\Users\ubunt\AppData\Roaming\Typora\typora-user-images\1684572599479.png)]

2.登录成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMq2jEUF-1684581514178)(C:\Users\ubunt\AppData\Roaming\Typora\typora-user-images\1684572947861.png)]

读写分离配置

1.使用注释方式配置数据源

登录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)]

2.配置集群

#更新集群信息,添加dr0从节点.
/*!
mycat:createCluster{"name":"prototype","masters":["master"],"replicas":["slave"]} */;
#查看配置集群信息
/*+ mycat:showClusters{} */;
#查看集群配置文件
vim /conf/clusters/prototype.cluster.json

3.重启Mycat容器

docker restart mycat2

测试读写分离

1.登录Mycat然后进入test数据库,执行一下语句:

#建表语句
CREATE TABLE mytbl(id INT,NAME VARCHAR(50));
#插入数据
INSERT INTO mytbl VALUES(1,"zhang3");

2.进入slave库,修改zhang3为li4

3.回到Mycat登录,多次执行下面语句:

SELECT * FROM test.mytbl;

如果查询结果多次出现zhang3,li4证明读写分离配置成功,mycat的默认负载均衡不是平均轮询(主库从库各访问一次)的,所以需要多尝试几次。

至此,mycat读写分离就完成了,在配置过程中遇到了很多的小麻烦,如果没遇到就跳过这个段内容,造成的原因大概有一下几个方面:
1、文件夹或文件的权限太低,导致软件启动无法读取配置,建议配置全部完成后,统一给mycat路径赋权限。
2、主从数据源配置问题,地址、数据库、命名name忘记改对,因为是复制的,总是少改。
3、还有就是启动不起来,一直报错Duplicate key LogicSchemaConfig,这个原因就是在自己测试的时候创建了重复的schema,比如,在配置读写分离之前利用mycat创建了test_data库,然后配置好读写分离,再次启动就会有这个问题,另外,就是没有配置读写分离,就是简单的使用mycat,但是在datasources下存在多个datasource.json文件,也是会出这个问题。

你可能感兴趣的:(docker,数据库,java)