MyCat 2保姆级配置指南:从Docker环境搭建到双主双从集群实战(附避坑清单)
2026/5/7 12:25:09 网站建设 项目流程

MyCat 2实战指南:Docker环境下的高可用集群部署与分库分表优化

在当今数据爆炸式增长的时代,传统单机数据库已经难以应对海量数据存储和高并发访问的挑战。作为一款开源的分布式数据库中间件,MyCat 2通过分库分表、读写分离等核心技术,为开发者提供了透明化的分布式数据库解决方案。本文将带您从零开始,在Docker环境中搭建MyCat 2集群,并深入探讨其核心功能与最佳实践。

1. 环境准备与Docker部署

在开始之前,我们需要准备以下环境:

  • Docker Engine 20.10+
  • Docker Compose 2.0+
  • 至少4GB可用内存
  • JDK 1.8(MyCat 2运行依赖)

推荐配置表:

组件版本端口备注
MyCat 21.218066管理端口9066
MySQL5.73306-3309建议使用5.7版本
JDK1.8-必须1.8版本

首先创建docker-compose.yml文件:

version: '3.7' services: mycat: image: mycat:1.21 ports: - "8066:8066" - "9066:9066" volumes: - ./mycat/conf:/opt/mycat/conf - ./mycat/logs:/opt/mycat/logs environment: - JAVA_OPTS=-Xms512m -Xmx1g depends_on: - mysql-m1 - mysql-m2 - mysql-s1 - mysql-s2 mysql-m1: image: mysql:5.7 ports: - "3307:3306" environment: MYSQL_ROOT_PASSWORD: "123456" MYSQL_DATABASE: "db1" command: - --lower_case_table_names=1 - --server-id=1 - --log-bin=master-bin - --binlog-format=ROW mysql-m2: image: mysql:5.7 ports: - "3308:3306" environment: MYSQL_ROOT_PASSWORD: "123456" MYSQL_DATABASE: "db1" command: - --lower_case_table_names=1 - --server-id=2 - --log-bin=master-bin - --binlog-format=ROW mysql-s1: image: mysql:5.7 ports: - "3309:3306" environment: MYSQL_ROOT_PASSWORD: "123456" MYSQL_DATABASE: "db1" command: - --lower_case_table_names=1 - --server-id=3 mysql-s2: image: mysql:5.7 ports: - "3310:3306" environment: MYSQL_ROOT_PASSWORD: "123456" MYSQL_DATABASE: "db1" command: - --lower_case_table_names=1 - --server-id=4

启动所有服务:

docker-compose up -d

注意:首次启动时,MyCat容器可能会因为等待MySQL就绪而重启几次,这属于正常现象。可以通过docker logs -f mycat查看启动日志。

2. MyCat 2核心配置解析

MyCat 2的配置文件主要存放在conf目录下,采用JSON格式,相比旧版的XML配置更加简洁易读。以下是关键配置文件说明:

2.1 用户认证配置

users/root.user.json定义了连接MyCat的用户信息:

{ "dialect": "mysql", "ip": null, "password": "123456", "transactionType": "proxy", "username": "root", "isolation": 3 }

2.2 数据源配置

datasources/prototypeDs.datasource.json定义了默认数据源:

{ "dbType": "mysql", "name": "prototypeDs", "url": "jdbc:mysql://mysql-m1:3306?useUnicode=true&serverTimezone=Asia/Shanghai", "user": "root", "password": "123456", "type": "JDBC", "maxCon": 1000, "minCon": 1 }

2.3 逻辑库配置

schemas/db1.schema.json定义了逻辑库映射:

{ "customTables": {}, "globalTables": {}, "normalTables": {}, "schemaName": "db1", "shardingTables": {}, "targetName": "prototypeDs" }

3. 双主双从集群搭建实战

3.1 MySQL主从配置

首先在主库M1上创建复制账号:

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;

查看主库状态,记录File和Position:

SHOW MASTER STATUS;

在从库S1上配置主从复制:

CHANGE MASTER TO MASTER_HOST='mysql-m1', MASTER_USER='repl', MASTER_PASSWORD='repl123', MASTER_PORT=3306, MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=154; START SLAVE;

验证从库状态:

SHOW SLAVE STATUS \G;

3.2 MyCat集群配置

通过MyCat管理端口(9066)配置集群:

/*! mycat:createCluster{ "clusterType":"MASTER_SLAVE", "heartbeat":{ "heartbeatTimeout":1000, "maxRetry":3 }, "masters":["m1","m2"], "name":"mycluster", "readBalanceType":"BALANCE_ALL", "replicas":["s1","s2"], "switchType":"SWITCH" } */;

读写分离验证表:

操作类型执行节点验证方法
写操作主节点观察binlog是否更新
读操作从节点多次查询看结果是否轮询
事务操作主节点检查事务隔离级别

4. 分库分表深度实践

4.1 水平分表实战

创建分片表:

CREATE TABLE orders ( id BIGINT PRIMARY KEY, order_no VARCHAR(32), user_id INT, amount DECIMAL(10,2), create_time DATETIME ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 dbpartition BY MOD_HASH(user_id) dbpartitions 2 tbpartition BY MOD_HASH(user_id) tbpartitions 4;

分片算法对比:

算法类型适用场景优点缺点
MOD_HASH数值型ID均匀分布扩容困难
RANGE_HASH范围查询支持区间查询可能存在热点
UNI_HASH需要均匀分布数据均衡计算复杂
YYYYDD时间序列按时间归档只适用于日期字段

4.2 全局序列方案

MyCat 2提供多种全局ID生成方式:

  1. 本地文件方式(简单但不适合集群)
  2. 数据库方式(通用但性能一般)
  3. 时间戳方式(可读性好但可能重复)
  4. 雪花算法(推荐方案)

配置雪花算法:

{ "sequence": { "type": "snowflake", "workerId": 123 } }

5. 性能优化与避坑指南

5.1 常见问题解决方案

问题1:主从同步延迟

  • 优化方案:调整sync_binlog参数
  • 监控命令:SHOW SLAVE STATUS中的Seconds_Behind_Master

问题2:分片键选择不当

  • 推荐选择:用户ID、订单ID等离散度高的字段
  • 避免选择:状态字段、布尔值等低离散度字段

问题3:跨分片查询性能差

  • 解决方案:
    • 使用冗余表
    • 建立全局索引表
    • 考虑使用Elasticsearch辅助查询

5.2 性能调优参数

关键JVM参数:

JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

MySQL优化建议:

-- 主库配置 SET GLOBAL sync_binlog=1; SET GLOBAL innodb_flush_log_at_trx_commit=1; -- 从库配置 SET GLOBAL innodb_flush_log_at_trx_commit=2; SET GLOBAL sync_binlog=0;

6. 生产环境最佳实践

在实际项目中部署MyCat 2时,建议遵循以下原则:

  1. 渐进式迁移:先拆分非核心业务,再处理核心业务
  2. 监控全覆盖:对连接数、QPS、响应时间等关键指标监控
  3. 定期维护:每周检查数据节点状态,每月进行数据均衡
  4. 容灾演练:模拟节点故障,验证高可用机制

推荐监控指标:

指标类别具体指标报警阈值
连接数活跃连接数> 最大连接数80%
性能平均响应时间> 500ms
资源CPU使用率> 70%持续5分钟
存储磁盘使用率> 85%

在电商项目中,我们采用128分库×1024分表的架构设计,通过用户ID取模分片,配合Elasticsearch实现多维度查询。实际运行中,单表数据量控制在800万条以内,查询响应时间保持在200ms以下。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询