MyCat 2保姆级配置指南:从Docker环境搭建到双主双从集群实战(附避坑清单)
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以下。
更多推荐
所有评论(0)