告别混乱:用Docker Compose一键部署Mycat2开发测试环境
告别混乱:用Docker Compose一键部署Mycat2开发测试环境
在分布式数据库中间件的开发与测试过程中,环境配置往往是最令人头疼的环节之一。传统的手动部署方式不仅步骤繁琐,还容易因系统环境差异导致各种"玄学"问题。想象一下这样的场景:你花了半天时间按照文档一步步安装配置,却在最后一步发现某个依赖库版本不兼容;或者当需要同时测试多个Mycat2版本时,系统目录被各种配置文件搞得一团糟。这些问题不仅浪费时间,更会严重打断开发者的思路流畅性。
容器化技术为这些问题提供了优雅的解决方案。通过Docker Compose,我们可以在几分钟内创建一个隔离的、可复制的Mycat2测试环境,而且这个环境与生产环境的拓扑结构完全一致。当测试完成后,只需一条命令就能彻底清理所有痕迹,不会在主机系统留下任何"残渣"。这种方法特别适合需要频繁搭建和销毁测试环境的场景,比如CI/CD流水线、多版本兼容性测试,或是团队内部的知识分享与培训。
1. 环境准备与架构设计
在开始编写docker-compose.yml之前,我们需要明确整个环境的组件构成。一个完整的Mycat2测试环境通常包含以下元素:
- Mycat2服务 :作为数据库中间件核心,版本选择1.21
- MySQL原型数据库 :Mycat2运行所必需的后端数据库
- 网络配置 :确保各容器间可以互相通信
- 数据持久化卷 :用于保存配置文件和日志
- 初始化脚本 :自动创建必要用户和权限
这种架构的最大优势在于其 环境一致性 。无论是在本地开发机、团队成员的笔记本,还是CI服务器上,只要使用相同的docker-compose文件,就能获得完全一致的运行环境。这彻底解决了"在我机器上能跑"的经典问题。
1.1 目录结构规划
合理的目录结构是项目可维护性的基础。建议采用如下布局:
mycat2-docker/
├── docker-compose.yml
├── config/
│ ├── prototypeDs.datasource.json
│ └── server.json
├── scripts/
│ └── init.sql
└── data/
├── mysql/
└── mycat/
关键目录说明 :
-
config/:存放Mycat2的配置文件 -
scripts/:数据库初始化SQL脚本 -
data/:MySQL和Mycat的数据持久化目录
2. Docker Compose文件详解
下面是一个功能完整的docker-compose.yml示例,我们分段解析其关键配置:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mycat-mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: mycat
MYSQL_USER: mycat
MYSQL_PASSWORD: mycat123
volumes:
- ./data/mysql:/var/lib/mysql
- ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "3306:3306"
networks:
- mycat-network
mycat:
image: mycat/mycat2:1.21
container_name: mycat-server
depends_on:
- mysql
volumes:
- ./config:/opt/mycat/conf
- ./data/mycat/logs:/opt/mycat/logs
ports:
- "8066:8066"
networks:
- mycat-network
networks:
mycat-network:
driver: bridge
volumes:
mysql-data:
mycat-data:
2.1 MySQL服务配置解析
MySQL容器配置有几个关键点值得注意:
- 环境变量 :我们通过环境变量设置了root密码、创建了专用数据库和用户,这比手动执行SQL更加简洁可靠
-
初始化脚本
:
/docker-entrypoint-initdb.d/是MySQL官方镜像的特殊目录,任何放在这里的.sql文件都会在容器首次启动时自动执行 - 数据持久化 :将MySQL数据目录挂载到主机,确保容器重启后数据不丢失
2.2 Mycat2服务配置要点
Mycat2容器的配置有几个技术细节:
- 版本选择 :明确指定1.21版本,避免自动更新导致的不兼容
- 配置文件挂载 :将主机上的config目录映射到容器内的配置目录,方便修改配置
- 依赖管理 :通过depends_on确保MySQL先于Mycat2启动
- 网络配置 :使用自定义网络确保容器间可通过服务名互相访问
3. 配置文件与初始化脚本
3.1 Mycat2核心配置
在
config/prototypeDs.datasource.json
中,我们需要配置Mycat2连接原型数据库的参数:
{
"dbType": "mysql",
"idleTimeout": 60000,
"instanceType": "READ_WRITE",
"maxCon": 1000,
"name": "prototypeDs",
"password": "mycat123",
"type": "JDBC",
"url": "jdbc:mysql://mysql:3306/mycat?useUnicode=true&characterEncoding=UTF-8",
"user": "mycat"
}
关键参数说明 :
-
url中的主机名使用服务名"mysql"而非IP,这是Docker网络的优势 - 密码与docker-compose中设置的MySQL用户密码一致
-
dbType明确指定为mysql,这是Mycat2支持的后端数据库类型
3.2 数据库初始化脚本
scripts/init.sql
用于设置Mycat所需的数据库权限:
-- 创建Mycat专用用户
CREATE USER 'mycat'@'%' IDENTIFIED BY 'mycat123';
GRANT XA_RECOVER_ADMIN ON *.* TO 'mycat'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%';
FLUSH PRIVILEGES;
这个脚本会在MySQL容器首次启动时自动执行,确保Mycat2有足够的权限创建和管理所需的系统表。
4. 操作流程与日常管理
4.1 启动与停止环境
启动整个环境只需一条命令:
docker-compose up -d
参数说明 :
-
-d表示在后台运行 - 首次运行会自动拉取镜像并创建容器
停止环境同样简单:
docker-compose down
如果需要彻底清理(包括持久化数据):
docker-compose down -v
4.2 日常维护命令
查看Mycat2日志:
docker logs -f mycat-server
进入MySQL容器执行查询:
docker exec -it mycat-mysql mysql -umycat -pmycat123
重启单个服务(如修改配置后):
docker-compose restart mycat
4.3 连接与测试
Mycat2默认监听8066端口,可以使用任何MySQL客户端连接:
mysql -h127.0.0.1 -P8066 -uroot -p123456
或者使用图形化工具如DBeaver、Navicat等连接,连接参数与普通MySQL一致。
5. 高级配置与技巧
5.1 多节点部署模式
如果需要模拟生产环境的集群部署,可以扩展docker-compose.yml:
services:
mysql-master:
image: mysql:8.0
# ...其他配置类似
environment:
MYSQL_REPLICATION_MODE: master
MYSQL_REPLICATION_USER: repl
MYSQL_REPLICATION_PASSWORD: repl123
mysql-slave:
image: mysql:8.0
depends_on:
- mysql-master
environment:
MYSQL_REPLICATION_MODE: slave
MYSQL_REPLICATION_USER: repl
MYSQL_REPLICATION_PASSWORD: repl123
MYSQL_MASTER_HOST: mysql-master
然后在Mycat2配置中配置读写分离规则即可。
5.2 性能调优建议
对于性能要求较高的场景,可以调整以下参数:
- JVM参数 :通过环境变量设置
environment:
JAVA_OPTS: "-Xms1G -Xmx2G -XX:+UseG1GC"
-
连接池配置 :修改prototypeDs.datasource.json中的maxCon和minCon
-
Mycat2线程池 :调整conf/server.json中的processor配置
5.3 常见问题排查
问题1 :Mycat2启动失败,日志显示无法连接MySQL
解决方案 :
-
确认MySQL容器已正常运行:
docker ps -
检查MySQL日志:
docker logs mycat-mysql -
验证网络连通性:
docker exec mycat-server ping mysql
问题2 :修改配置后不生效
解决方案 :
-
确认配置文件已正确挂载:
docker exec mycat-server ls /opt/mycat/conf -
重启Mycat2服务:
docker-compose restart mycat - 检查文件权限:确保主机上的配置文件可读
问题3 :性能瓶颈
解决方案 :
-
监控系统资源:
docker stats - 调整JVM内存参数
- 优化Mycat2和MySQL的配置参数
6. 版本管理与升级策略
6.1 多版本并存方案
通过修改docker-compose.yml中的image标签,可以轻松切换Mycat2版本:
mycat:
image: mycat/mycat2:1.20 # 切换为1.20版本
不同版本的容器可以同时运行,只需修改容器名称和端口映射即可:
mycat-1.20:
image: mycat/mycat2:1.20
ports:
- "8067:8066" # 使用不同端口
mycat-1.21:
image: mycat/mycat2:1.21
ports:
- "8066:8066"
6.2 配置迁移策略
当需要升级Mycat2版本时,建议遵循以下步骤:
- 备份当前配置和数据:
cp -r config config_backup
cp -r data data_backup
-
修改docker-compose.yml中的版本号
-
启动新版本:
docker-compose up -d
-
对比新旧版本的配置文件差异,必要时进行调整
-
验证功能正常后,再考虑删除备份
6.3 自定义镜像构建
如果需要修改Mycat2的默认配置或添加自定义插件,可以基于官方镜像构建自定义镜像:
FROM mycat/mycat2:1.21
# 覆盖默认配置
COPY my-custom-config/ /opt/mycat/conf/
# 添加自定义插件
COPY custom-plugins/ /opt/mycat/lib/
然后在docker-compose.yml中引用这个自定义镜像:
mycat:
build: ./my-custom-mycat
# 其他配置保持不变
这种方案特别适合需要长期维护的团队级开发环境。
更多推荐


所有评论(0)