一、环境准备
1.1 确认当前环境
| 角色 | IP | 用途 |
| Master | 192.168.10.110 | 写 |
| Slave1 | 192.168.10.111 | 读 |
| Slave2 | 192.168.10.112 | 读 |
| MyCat | 192.168.10.113 | 中间件 |
1.2 确保主从复制已配置好
在 Master 上创建测试库和表:
CREATE DATABASE ha;
USE ha;
CREATE TABLE test (
id INT,
name VARCHAR(20),
address VARCHAR(50)
);
INSERT INTO test VALUES(1, 'master', 'from_master');

在 Slave1/Slave2 上确认数据已同步:
USE ha;
SELECT * FROM test;
1.3 授权 MyCat 访问后端 MySQL
在所有 MySQL 服务器(Master、Slave1、Slave2)上执行:
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
二、安装 JDK(MyCat 依赖)
在 MyCat 服务器 192.168.10.113 上操作:
# 下载 JDK(如果已有 JDK 可跳过)
cd /opt
wget https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/java-1.8.0-openjdk-headless-1.8.0.262.b10-1.el7.x86_64.rpm
rpm -ivh java-1.8.0-openjdk-headless-1.8.0.262.b10-1.el7.x86_64.rpm
java -version

配置环境变量:
vim /etc/profile.d/java.sh
添加:
export JAVA_HOME=/usr/local/jdk1.8.0
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar

生效:
source /etc/profile.d/java.sh
java -version # 确认显示 1.8.x
三、下载安装 MyCat
cd /opt
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
cd /usr/local

创建 MyCat 用户:
useradd mycat
chown -R mycat:mycat /usr/local/mycat

配置 MyCat 环境变量:
vim /etc/profile.d/mycat.sh
添加:
export MYCAT_HOME=/usr/local/mycat
export PATH=$MYCAT_HOME/bin:$PATH

生效:
source /etc/profile.d/mycat.sh
四、配置 MyCat
4.1 配置 server.xml(用户认证)
vim /usr/local/mycat/conf/server.xml
找到 <user name="root"> 部分,替换或修改为:
<user name="mycat">
<property name="password">123456</property>
<property name="schemas">ha</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">ha</property>
<property name="readonly">true</property>
</user>
4.2 配置 schema.xml(读写分离核心)
先备份原文件:
mv /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak
创建新配置:
vim /usr/local/mycat/conf/schema.xml
写入以下内容:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 逻辑库 ha -->
<schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<!-- 数据节点 -->
<dataNode name="dn1" dataHost="dthost" database="ha" />
<!-- 数据主机 -->
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 主库(写) -->
<writeHost host="master" url="192.168.10.110:3306" user="mycat" password="123456">
<!-- 从库1(读) -->
<readHost host="slave1" url="192.168.10.111:3306" user="mycat" password="123456" />
<!-- 从库2(读) -->
<readHost host="slave2" url="192.168.10.112:3306" user="mycat" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
五、启动 MyCat
# 切换到 mycat 用户启动
su - mycat
/usr/local/mycat/bin/mycat start
exit

查看启动日志:
cat /usr/local/mycat/logs/wrapper.log
查看端口(MyCat 默认端口 8066):
netstat -antulp | grep 8066
六、验证读写分离
6.1 连接 MyCat
mysql -u mycat -p123456 -h 192.168.10.113 -P 8066
6.2 查看逻辑库和表
SHOW DATABASES;
USE ha;
SHOW TABLES;
SELECT * FROM test;
应该能看到 id=1, name=master, address=from_master。
6.3 验证读写分离
步骤1:停止从库复制,制造主从不一致
在 Slave1 和 Slave2 上分别执行:
STOP SLAVE;
步骤2:在从库插入标记数据
Slave1:
USE ha;
INSERT INTO test VALUES(10, 'slave1', 'from_slave1');
Slave2:
USE ha;
INSERT INTO test VALUES(20, 'slave2', 'from_slave2');
步骤3:通过 MyCat 多次查询
USE ha;
SELECT * FROM test;
执行 3-5 次,观察结果:
-
第1次可能看到
id=10, 1 -
第2次可能看到
id=20, 1 -
第3次可能看到
id=10, 1(轮询)
如果两次结果不同,说明 读写分离配置成功!

步骤4:验证写走主库
通过 MyCat 插入:
INSERT INTO test VALUES(88, 'write_test', 'from_mycat');
然后:
-
直接连 Master 查询 → 能看到
id=88 -
直接连 Slave1/Slave2 查询(
STOP SLAVE未恢复)→ 看不到id=88


步骤5:恢复主从同步
在 Slave1 和 Slave2 上:
START SLAVE;
七、配置参数说明
| 参数 | 值 | 含义 |
| balance | 1 | 读请求在 readHost 间轮询,writeHost 不负担读 |
| writeType | 0 | 只写第一个 writeHost(master) |
| switchType | -1 | 不自动切换主库 |
| sqlMaxLimit | 100 | 查询默认返回最大行数 |








2446

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



