告别混乱:用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 -v4.2 日常维护命令
查看Mycat2日志:
docker logs -f mycat-server进入MySQL容器执行查询:
docker exec -it mycat-mysql mysql -umycat -pmycat123重启单个服务(如修改配置后):
docker-compose restart mycat4.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 # 其他配置保持不变这种方案特别适合需要长期维护的团队级开发环境。