一、环境准备
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 80666.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 | 查询默认返回最大行数 |