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以下。

更多推荐