告别混乱:用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容器配置有几个关键点值得注意:

  1. 环境变量 :我们通过环境变量设置了root密码、创建了专用数据库和用户,这比手动执行SQL更加简洁可靠
  2. 初始化脚本 /docker-entrypoint-initdb.d/ 是MySQL官方镜像的特殊目录,任何放在这里的.sql文件都会在容器首次启动时自动执行
  3. 数据持久化 :将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 性能调优建议

对于性能要求较高的场景,可以调整以下参数:

  1. JVM参数 :通过环境变量设置
environment:
  JAVA_OPTS: "-Xms1G -Xmx2G -XX:+UseG1GC"
  1. 连接池配置 :修改prototypeDs.datasource.json中的maxCon和minCon

  2. Mycat2线程池 :调整conf/server.json中的processor配置

5.3 常见问题排查

问题1 :Mycat2启动失败,日志显示无法连接MySQL

解决方案

  1. 确认MySQL容器已正常运行: docker ps
  2. 检查MySQL日志: docker logs mycat-mysql
  3. 验证网络连通性: docker exec mycat-server ping mysql

问题2 :修改配置后不生效

解决方案

  1. 确认配置文件已正确挂载: docker exec mycat-server ls /opt/mycat/conf
  2. 重启Mycat2服务: docker-compose restart mycat
  3. 检查文件权限:确保主机上的配置文件可读

问题3 :性能瓶颈

解决方案

  1. 监控系统资源: docker stats
  2. 调整JVM内存参数
  3. 优化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版本时,建议遵循以下步骤:

  1. 备份当前配置和数据:
cp -r config config_backup
cp -r data data_backup
  1. 修改docker-compose.yml中的版本号

  2. 启动新版本:

docker-compose up -d
  1. 对比新旧版本的配置文件差异,必要时进行调整

  2. 验证功能正常后,再考虑删除备份

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
  # 其他配置保持不变

这种方案特别适合需要长期维护的团队级开发环境。

更多推荐