Mycat 2 实现 MySQL 读写分离,并且实现 主从同步

一、环境准备

1. MySQL 主从复制配置

主库配置 (master.cnf):

bash 复制代码
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog-do-db = your_database
expire_logs_days = 7
max_binlog_size = 100M

从库配置 (slave.cnf):

bash 复制代码
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
read-only = 1
replicate-do-db = your_database

2. 建立主从复制

在主库执行:

sql 复制代码
-- 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

-- 查看主库状态
SHOW MASTER STATUS;
-- 记录 File 和 Position

在从库执行:

sql 复制代码
-- 配置主从复制
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;

-- 启动复制
START SLAVE;

-- 查看复制状态
SHOW SLAVE STATUS\G;

二、Mycat 2 配置

1. 安装 Mycat 2

bash 复制代码
# 下载 Mycat 2
wget https://github.com/MyCATApache/Mycat2/releases/download/{version}/mycat2-{version}.tar.gz

# 解压
tar -zxvf mycat2-{version}.tar.gz -C /usr/local/
cd /usr/local/mycat2

2. 配置数据源 (datasource.json)

bash 复制代码
{
  "dbType": "mysql",
  "idleTimeout": 60000,
  "initSqls": [],
  "initSqlsGetConnection": true,
  "instanceType": "READ_WRITE",
  "maxCon": 1000,
  "maxConnectTimeout": 3000,
  "maxRetryCount": 5,
  "minCon": 1,
  "name": "masterDataSource",
  "password": "password",
  "type": "JDBC",
  "url": "jdbc:mysql://master_ip:3306/your_database?useUnicode=true&characterEncoding=UTF-8",
  "user": "root",
  "weight": 0
},
{
  "dbType": "mysql",
  "idleTimeout": 60000,
  "initSqls": [],
  "initSqlsGetConnection": true,
  "instanceType": "READ",
  "maxCon": 1000,
  "maxConnectTimeout": 3000,
  "maxRetryCount": 5,
  "minCon": 1,
  "name": "slaveDataSource",
  "password": "password",
  "type": "JDBC",
  "url": "jdbc:mysql://slave_ip:3306/your_database?useUnicode=true&characterEncoding=UTF-8",
  "user": "root",
  "weight": 0
}

3. 配置集群 (cluster.json)

bash 复制代码
{
  "clusterType": "MASTER_SLAVE",
  "heartbeat": {
    "heartbeatTimeout": 10000,
    "maxRetryCount": 3,
    "minSwitchTimeInterval": 60000,
    "slaveThreshold": 0
  },
  "masters": [
    "masterDataSource"
  ],
  "maxCon": 200,
  "name": "mysqlCluster",
  "readBalanceType": "BALANCE_ALL",
  "readBalanceType": "BALANCE_ALL_READ",
  "slaves": [
    "slaveDataSource"
  ],
  "switchType": "SWITCH"
}

4. 配置逻辑库和表 (schema.json)

bash 复制代码
{
  "customTables": {},
  "globalTables": {},
  "normalProcedures": {},
  "normalTables": {
    "user": {
      "createTableSQL": "CREATE TABLE `user` (id INT PRIMARY KEY, name VARCHAR(50))",
      "locality": {
        "schemaName": "your_database",
        "tableName": "user",
        "tableUnit": "mysqlCluster"
      }
    }
  },
  "schemaName": "mycat_db",
  "shardingTables": {},
  "views": {}
}

5. 配置读写分离策略

mycat.yml 中配置:

XML 复制代码
interceptors:
  - className: io.mycat.plug.loadBalance.LoadBalanceStrategy
    name: loadBalance
    enabled: true
    properties:
      defaultLoadBalance: balanceAllRead
      writeCloudBalance: masterOnly
      readCloudBalance: slaveFirst
      
  - className: io.mycat.plug.sequence.SequenceHandler
    name: sequenceHandler
    enabled: true
    properties:
      sequenceHandlerType: distributed
    
  - className: io.mycat.plug.router.Router
    name: router
    enabled: true
    properties:
      routerStrategy: read_write_split

6. 配置分片规则(可选)

如果需要分片,配置 rule.json

XML 复制代码
{
  "function": {
    "partitionByLong": {
      "clazz": "io.mycat.router.function.PartitionByLong",
      "partitionCount": "2",
      "partitionLength": "256"
    }
  },
  "tableRules": {
    "user": {
      "ruleName": "user",
      "rules": [
        {
          "columns": [
            "id"
          ],
          "algorithm": "partitionByLong"
        }
      ]
    }
  }
}

三、读写分离策略详解

1. 负载均衡策略

mycat.yml 中配置:

XML 复制代码
loadBalance:
  defaultLoadBalance: balanceAll
  writeCloudBalance: masterOnly
  readCloudBalance: slaveFirst

可用策略:

  • balanceAll:所有读请求随机分配到所有从节点

  • balanceAllRead:所有读请求随机分配到所有读节点

  • balanceMasterSlave:优先主节点,主节点不可用才用从节点

  • balanceSlaveFirst:优先从节点,从节点不可用才用主节点

  • masterOnly:只使用主节点

2. SQL 路由规则

Mycat 2 默认的读写分离规则:

  • 写操作:INSERT、UPDATE、DELETE、CREATE、ALTER、DROP 等路由到主库

  • 读操作:SELECT 路由到从库

  • 事务中的读:自动路由到主库保证一致性

  • 强制读主/*+ mycat:db_type=master */ SELECT ...


四、启动和测试

1. 启动 Mycat 2

bash 复制代码
# 启动
./bin/mycat start

# 查看状态
./bin/mycat status

# 查看日志
tail -f logs/wrapper.log

2. 连接测试

sql 复制代码
# 连接 Mycat
mysql -umycat -p123456 -P8066 -h127.0.0.1

# 创建测试表
CREATE TABLE test (
  id INT PRIMARY KEY,
  name VARCHAR(50)
);

# 插入数据(会路由到主库)
INSERT INTO test VALUES (1, 'test');

# 查询数据(会路由到从库)
SELECT * FROM test;

3. 监控读写分离状态

在 Mycat 管理端查看:

sql 复制代码
-- 查看数据源状态
SHOW DATASOURCES;

-- 查看集群状态
SHOW CLUSTERS;

-- 查看连接信息
SHOW CONNECTIONS;

-- 查看SQL统计
SHOW SQL_STAT;

五、高级配置

1. 主从延迟处理

sql 复制代码
# 在 mycat.yml 中配置
heartbeat:
  slaveThreshold: 60  # 从库延迟超过60秒则跳过
  checkSlaveLag: true
  lagCheckInterval: 5000

2. 事务一致性保证

sql 复制代码
// 对于需要强一致性的读操作,使用Hint强制走主库
/*+ mycat:db_type=master */
SELECT * FROM account WHERE id = 1 FOR UPDATE;

3. 多从库负载均衡

sql 复制代码
{
  "clusterType": "MASTER_SLAVE",
  "masters": ["master1"],
  "slaves": ["slave1", "slave2", "slave3"],
  "readBalanceType": "WEIGHT_RANDOM",
  "weights": {
    "slave1": 1,
    "slave2": 2,
    "slave3": 1
  }
}

4. 故障转移配置

sql 复制代码
{
  "heartbeat": {
    "heartbeatTimeout": 5000,
    "maxRetryCount": 3,
    "slaveThreshold": 0,
    "switchType": "SWITCH"
  },
  "switch": {
    "errorRetryTimeout": 300000,
    "enableMasterSlaveSwitch": true,
    "slaveFailoverRetryDelay": 10000
  }
}

六、监控和维护

1. 监控脚本示例

bash 复制代码
#!/bin/bash
# 监控主从同步状态
mysql -h slave_ip -uroot -ppassword -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master"

# 监控Mycat连接数
mysql -umycat -p123456 -P8066 -h127.0.0.1 -e "SHOW @@CONNECTION"

2. 常见问题解决

  1. 主从延迟问题

    • 增加从库配置

    • 使用半同步复制

    • 业务端读主库

  2. 连接池问题

    bash 复制代码
    {
      "maxCon": 100,
      "minCon": 10,
      "maxConnectTimeout": 3000,
      "idleTimeout": 60000
    }
  3. 内存优化

    bash 复制代码
    server:
      bufferPool:
        pageSize: 8192
        chunks: 2048

七、完整部署架构

复制代码
应用程序
    ↓
Mycat 2 (负载均衡+SQL路由)
    ↓
MySQL 主库 (写) ←→ 主从复制
    ↓
MySQL 从库 (读)   MySQL 从库 (读)

这种架构提供了:

  1. 自动的读写分离

  2. 透明的故障转移

  3. 灵活的负载均衡策略

  4. 完善的监控机制

  5. 易于扩展的架构

建议在生产环境部署前,充分测试各种场景,确保数据一致性和系统稳定性。

相关推荐
我是人✓2 小时前
Spring IOC入门
java·数据库·spring
Hello.Reader2 小时前
PyFlink DataStream 程序骨架、常用 Source/Sink、状态(State)、与 Table/SQL 互转一篇搞定
数据库·sql·linq
三不原则2 小时前
故障案例:模型推理响应慢,排查 Redis 缓存集群问题
数据库·redis·缓存
Winston Wood2 小时前
Android图形与显示系统:从架构到协作的深度解析
android·图形系统·显示系统
alonewolf_992 小时前
MySQL Explain详解与索引优化实战
数据库·mysql·adb
lxysbly2 小时前
psx模拟器安卓版带金手指
android
それども2 小时前
MySQL 查询索引最左前缀原则,如果是(a,b)的联合索引,WHERE b = ? AND a = ?会走索引吗
数据库·mysql
それども2 小时前
MySQL EXPLAIN Impossible WHERE noticed after reading const tables
数据库·mysql
a程序小傲2 小时前
得物Java面试被问:边缘计算的数据同步和计算卸载
java·开发语言·数据库·后端·面试·golang·边缘计算