背景介绍:为什么需要 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 服务器做主从复制,步骤详见:
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.8 | 172.24.221.34 |
| 2 | 下载并解压 MyCAT | 172.24.221.34 |
| 3 | 在 MySQL 主库创建用户 | <你的主库 IP> |
| 4 | 配置 schema.xml | 172.24.221.34 |
| 5 | 配置 server.xml | 172.24.221.34 |
| 6 | 启动 MyCAT | 172.24.221.34 |
| 7 | 客户端连接测试 | 任意客户端 |
| 8 | 查看后端状态 | 任意客户端 |
MyCAT 默认端口说明
| 端口 | 用途 | 协议 |
|---|---|---|
| 8066 | SQL 接入端口(给应用连接) | MySQL 协议 |
| 9066 | 管理端口(查看状态、切换等) | MySQL 协议 |
367

被折叠的 条评论
为什么被折叠?



