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:停止从库复制,制造主从不一致

在 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;

七、配置参数说明

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值