ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MyCat实现mysql读写分离

MyCat实现mysql读写分离

一、环境准备

1.1 确认当前环境

角色IP用途
Master192.168.10.110
Slave1192.168.10.111
Slave2192.168.10.112
MyCat192.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:停止从库复制,制造主从不一致

Slave1Slave2上分别执行:

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;

七、配置参数说明

参数含义
balance1读请求在 readHost 间轮询,writeHost 不负担读
writeType0只写第一个 writeHost(master)
switchType-1不自动切换主库
sqlMaxLimit100查询默认返回最大行数
返回列表