搭建 MyCAT 实现 MySQL 读写分离

背景介绍:为什么需要 MyCAT 读写分离?

在高并发数据库场景中,单台 MySQL 服务器难以同时承载大量读写请求,会出现性能瓶颈。MyCAT 作为数据库中间件,可实现读写分离:

  • 写操作(INSERT/UPDATE/DELETE)定向到 MySQL 主库,保证数据一致性;
  • 读操作(SELECT)分散到 MySQL 从库,分担主库压力;
  • 对应用层透明,无需修改代码即可提升数据库并发处理能力,是高流量系统的常用优化方案。

核心关键词解释

  • MyCAT:开源分布式数据库中间件,支持读写分离、分库分表、负载均衡,兼容 MySQL 协议;
  • 读写分离:将数据库写请求路由到主库,读请求路由到从库的架构设计,提升并发能力;
  • schema.xml:MyCAT 核心配置文件,定义逻辑数据库、数据节点、主从关系及读写规则;
  • server.xml:MyCAT 用户配置文件,管理访问中间件的用户、密码及权限;
  • balance:MyCAT 读请求分发策略参数,控制读请求如何分配到主从库;
  • writeHost/readHost:MyCAT 配置中主库(写节点)和从库(读节点)的标识;
  • 逻辑数据库:MyCAT 对外提供的虚拟数据库,映射到后端真实物理数据库。

环境说明(请替换为你的真实 IP)

角色主机 IP说明
MyCAT 服务器172.24.221.34你当前操作的机器(已确认)
MySQL 主库<你的主库 IP>例如 172.24.221.35(处理写请求)
MySQL 从库<你的从库 IP>例如 172.24.221.36(处理读请求)

⚠️ 重要:以下配置中的 <你的主库 IP> 和 <你的从库 IP> 必须替换为你实际的 MySQL 主从 IP。如何获取?在主库的服务器和从库的服务器上执行:

bash

ip addr
  • 若为云服务器,需区分公网 IP 和私网 IP:同一分区通信可用私网 IP,跨分区或外部访问需用公网 IP;
  • 若为虚拟机,通常分配局域网私网 IP(如 192.168.x.x),可通过 ip addr 直接查看;
  • 若虚拟机绑定弹性公网 IP,ip addr 可能显示公网 IP(如 203.0.113.x)。

⚠️ 重要:在搭建读写分离前需要对 master 和 slave 服务器做主从复制,步骤详见:

手动搭建基于 GTID 的 MySQL 主从复制https://blog.youkuaiyun.com/yifengyiyufjq/article/details/154988699?sharetype=blogdetail&sharerId=154988699&sharerefer=PC&sharesource=yifengyiyufjq&spm=1011.2480.3001.8118

1. 在 MyCAT 服务器(172.24.221.34)上安装 JDK

MyCAT 是 Java 程序,必须先装 JDK 1.8执行主机:172.24.221.34

bash

# 1. 检查是否已安装 Java
java -version

# 如果提示 command not found 或版本不是 1.8,则继续安装

# 2. 安装 OpenJDK 1.8(使用 yum)
sudo yum install -y java-1.8.0-openjdk

# 3. 验证安装结果
java -version

✅ 正确输出应类似:

plaintext

openjdk version "1.8.0_392"
OpenJDK Runtime Environment (build 1.8.0_392-b08)
OpenJDK 64-Bit Server VM (build 25.392-b08, mixed mode)

❌ 如果显示 openjdk version "11.0.x" 或更高,请卸载并只保留 JDK 8,否则 MyCAT 1.6 无法启动。

2. 在 MyCAT 服务器(172.24.221.34)上下载并安装 MyCAT

执行主机:172.24.221.34

bash

# 1. 进入 root 家目录
cd /root

# 2. 下载 MyCAT 1.6.5(官方 GitHub Release)
# 注意:这是你当前使用的版本(根据你的日志:mycat-1.6.5-release-20180122220033)
wget https://github.com/MyCATApache/Mycat-download/releases/download/1.6.5-release/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

# 如果 wget 报错或下载慢,可尝试以下方法:
# 方法 A:使用 curl
# curl -LO https://github.com/MyCATApache/Mycat-download/releases/download/1.6.5-release/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

# 方法 B:从本地电脑上传(如果你有 Windows/Mac)
# scp Mycat-server-1.6.5-release-20180122220033-linux.tar.gz root@172.24.221.34:/root/

# 3. 解压文件
tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

# 4. 重命名目录为 mycat(便于管理)
mv Mycat-server-1.6.5-release-20180122220033 mycat

# 5. 查看目录结构
ls -l /root/mycat/

✅ 正常输出应包含以下关键目录和文件:

plaintext

bin/        # 启动脚本(mycat)
conf/       # 配置文件目录(server.xml, schema.xml, rule.xml 等)
lib/        # Java 依赖 jar 包
logs/       # 日志目录(wrapper.log, mycat.log)
version.txt # 版本信息

💡 MyCAT 是绿色软件,无需编译,解压即用。

3. 在 MySQL 主库上创建 MyCAT 连接用户

执行主机:<你的主库 IP>(例如 172.24.221.35)

bash

# 1. 登录 MySQL 主库
mysql -u root -p

# 2. 执行以下 SQL(密码必须与后续 MyCAT 配置一致)
CREATE USER 'mycat'@'%' IDENTIFIED BY 'Aa123456.';

-- 授予 ds_shop 数据库的 DML 权限(按需调整)
GRANT SELECT, INSERT, UPDATE, DELETE ON ds_shop.* TO 'mycat'@'%';

-- 刷新权限
FLUSH PRIVILEGES;

-- 退出
EXIT;

✅ 从库会自动同步该用户(前提是主从复制正常)。若不确定,可在从库手动执行相同语句。

4. 在 MyCAT 服务器(172.24.221.34)上配置 schema.xml

执行主机:172.24.221.34

bash

# 编辑 schema.xml
vi /root/mycat/conf/schema.xml

文件完整内容(请将 <你的主库 IP> 和 <你的从库 IP> 替换为真实 IP):

xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

  <!-- 定义逻辑数据库 ds_shop -->
  <schema name="ds_shop" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    <!-- 此处可定义分片表(非必需) -->
  </schema>

  <!-- 定义数据节点:指向物理数据库 -->
  <dataNode name="dn1" dataHost="dh1" database="ds_shop" />

  <!-- 定义数据主机:配置主从读写分离 -->
  <dataHost name="dh1" maxCon="1000" minCon="10" balance="1"
            writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">

    <!-- 心跳检测 SQL -->
    <heartbeat>select user()</heartbeat>

    <!-- 主库(写节点) -->
    <writeHost host="hostM1" url="<你的主库IP>:3306" user="mycat" password="Aa123456.">
      <!-- 从库(读节点) -->
      <readHost host="hostS1" url="<你的从库IP>:3306" user="mycat" password="Aa123456." />
    </writeHost>

  </dataHost>

</mycat:schema>

参数说明:

  • balance="1":读请求仅发送到 readHost(从库)
  • writeType="0":写请求仅发送到第一个 writeHost(主库)
  • slaveThreshold="100":从库延迟超过 100 秒则不参与读

5. 在 MyCAT 服务器(172.24.221.34)上配置 server.xml

执行主机:172.24.221.34

bash

vi /root/mycat/conf/server.xml

在 mycat:server 标签内添加(或修改)以下用户:

xml

<user name="mycat" defaultAccount="true">
    <property name="password">Aa123456.</property>
    <property name="schemas">ds_shop</property>
</user>

<user name="user">
    <property name="password">user</property>
    <property name="schemas">ds_shop</property>
    <property name="readOnly">true</property>
</user>

✅ mycat 用户用于读写,user 用户用于只读(可选)。

6. 在 MyCAT 服务器(172.24.221.34)上启动 MyCAT

执行主机:172.24.221.34

bash

# 1. 启动 MyCAT
/root/mycat/bin/mycat start

# 2. 检查进程是否运行
ps -ef | grep mycat

# 3. 查看启动日志(关键!)
tail -f /root/mycat/logs/wrapper.log

✅ 成功标志:日志中出现

plaintext

MyCat Server startup successfully. see logs in logs/mycat.log

❌ 如果报错(如 Cannot find schema.xml),请检查配置文件是否存在、语法是否正确。

7. 在客户端测试读写分离

执行主机:任意能访问 172.24.221.34:8066 的机器(如 172.24.221.34 本身)

bash

# 1. 连接 MyCAT(交互式输入密码,避免特殊字符问题)
mysql -h 172.24.221.34 -P 8066 -u mycat -p

# 输入密码:Aa123456.

# 2. 使用数据库
USE ds_shop;

# 3. 插入数据(应写入主库)
INSERT INTO your_table (name) VALUES ('test_write');

# 4. 查询数据(应从从库读取)
SELECT * FROM your_table WHERE name = 'test_write';

验证读写分离(高级):在 MySQL 从库 上临时开启通用日志:

sql

SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/tmp/general.log';

然后在客户端执行 SELECT,查看 /tmp/general.log 是否记录该语句。

8.(可选)通过管理端口查看后端状态

执行主机:任意能访问 172.24.221.34:9066 的机器

bash

mysql -h 172.24.221.34 -P 9066 -u root -p123456 -e "show @@datasource"

输出示例:

plaintext

+----------+--------+-------+----------------+------+--------+
| DATANODE | NAME   | TYPE  | HOST           | PORT | RS_CODE|
+----------+--------+-------+----------------+------+--------+
| dn1      | hostM1 | MASTER| <你的主库IP>   | 3306 | 1      |
| dn1      | hostS1 | SLAVE | <你的从库IP>   | 3306 | 1      |
+----------+--------+-------+----------------+------+--------+

RS_CODE=1 表示连接正常

最终总结:操作主机对照表

步骤编号操作内容执行主机
1安装 JDK 1.8172.24.221.34
2下载并解压 MyCAT172.24.221.34
3在 MySQL 主库创建用户<你的主库 IP>
4配置 schema.xml172.24.221.34
5配置 server.xml172.24.221.34
6启动 MyCAT172.24.221.34
7客户端连接测试任意客户端
8查看后端状态任意客户端

MyCAT 默认端口说明

端口用途协议
8066SQL 接入端口(给应用连接)MySQL 协议
9066管理端口(查看状态、切换等)MySQL 协议
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值