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 2 | 1.21 | 8066 | 管理端口9066 |
| MySQL | 5.7 | 3306-3309 | 建议使用5.7版本 |
| JDK | 1.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生成方式:
- 本地文件方式(简单但不适合集群)
- 数据库方式(通用但性能一般)
- 时间戳方式(可读性好但可能重复)
- 雪花算法(推荐方案)
配置雪花算法:
{ "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时,建议遵循以下原则:
- 渐进式迁移:先拆分非核心业务,再处理核心业务
- 监控全覆盖:对连接数、QPS、响应时间等关键指标监控
- 定期维护:每周检查数据节点状态,每月进行数据均衡
- 容灾演练:模拟节点故障,验证高可用机制
推荐监控指标:
| 指标类别 | 具体指标 | 报警阈值 |
|---|---|---|
| 连接数 | 活跃连接数 | > 最大连接数80% |
| 性能 | 平均响应时间 | > 500ms |
| 资源 | CPU使用率 | > 70%持续5分钟 |
| 存储 | 磁盘使用率 | > 85% |
在电商项目中,我们采用128分库×1024分表的架构设计,通过用户ID取模分片,配合Elasticsearch实现多维度查询。实际运行中,单表数据量控制在800万条以内,查询响应时间保持在200ms以下。