mysql+mycat读写分离

本文详细介绍了如何使用Mycat实现MySQL的读写分离,包括配置JDK环境,设置Mycat参数,数据库主从授权,以及通过调整balance参数进行读写测试,确保读写操作分别在主从库上执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 环境

192.168.2.118 mysql-master/mycat
192.168.2.119 mysql-slave

  • 配置jdk
tar  -zxf  jdk-8u151-linux-i586.tar.gz
mv jdk1.8.0_151 /usr/java/

配置环境变量并生效

vim /etc/profile
export JAVA_HOME=/usr/java/
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin
source /etc/profile

查看java版本,有内容则表示java安装成功

[root@leeclient java]# java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) Client VM (build 25.151-b12, mixed mode)
  • mycat部署
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mv mycat /usr/local/
  • mycat参数配置

1)在/usr/local/mycat/conf/server.xml下设置如下参数

<user name="lee1">
                <property name="password">123456</property>
                <property name="schemas">testdb</property>
</user>
<user name="lee2">
                <property name="password">123456</property>
                <property name="schemas">testdb</property>
                <property name="readOnly">true</property>
        </user>

lee1和lee2分别设置密码,用于连接mycat,lee1用于读写,lee2用于只读,testdb是逻辑库

2)在/usr/local/mycat/conf/schema.xml下(先备份cp schema.xml schema.xml.bak)

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="testdb" checkSQLschema="false" sqlMaxLimit="1000" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="ultrax" />
<dataHost name="localhost1" maxCon="2000" minCon="1" balance="0" writeType="1" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<heartbeat>select  user()</heartbeat>
<writeHost host="hostM1" url="192.168.2.118:3306" user="root"  password="123456">
<readHost host="hostS1" url="192.168.2.119:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>

其中
schema name名称需要与server.xml设定的库名testdb一致,设置数据节点dn1
dataHost即数据节点名称,database为真实数据库名称,即discuz的后台数据库ultrax

balance
0表示不开启读写分离,都在master上执行读写操作
1表示都参与select
2表示所有读请求随机在readhost和writehost分担
3表示所有读请求对应到readhost里去

writeType
0,所有写操作发送到配置的第一个writeHost
1,所有写操作都随机的发送到配置的writeHost
2,不执行写操作。

switchType
-1,不自动切换
1,默认值,自动切换
2,基于MySQL 主从同步的状态决定是否切换
3,基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%’

writeHost和readHost分别配置对应后台的mysql主从真实用户密码

3)在mysql主从服务器授权

主从:grant all on *.* to 'root'@'192.168.2.118' identified by'123456';
主:grant all on *.* to 'root'@'192.168.2.119' identified by'123456';
或者
主从:grant all on *.* to 'root'@'192.168.2.%' identified by'123456';

mycat服务启动并查看启动情况(注意数据库端口的映射)

/usr/local/mycat/bin/mycat start
tail -f /usr/local/mycat/logs/wrapper.log

这里写图片描述

tail -f /usr/local/mycat/logs/mycat.log

这里写图片描述

[root@mysqlm logs]# netstat -tunl | grep -E "8066|9066"
tcp        0      0 :::8066                     :::*                        LISTEN      
tcp        0      0 :::9066                     :::*                        LISTEN

其中
8066是管理端口,web连接mycat
9066是连接后端db的端口,默认是9066,登录该端口后直接用show @@datasource;语句即可查询主从库的读写状态
端口都是在server.xml里设置的,如果要修改则加入语句改对应的端口

<property name="serverPort">8066</property>
<property name="managerPort">9066</property>

登陆mycat的8066,此处是查看web连接mycat后的数据库等

mysql -h 192.168.2.118 -P8066 -ulee1 -p123456
mysql> show databases;
+----------+
| DATABASE |
+----------+
| testdb   |
+----------+
1 row in set (0.04 sec)

mysql>

上面的testdb就是mycat的逻辑库,对应的是真是数据库mysql里的ultrax库

  • mycat常用命令

进入9066连接端口

mysql -h 192.168.2.118 -P9066 -ulee1 -p123456

1)查看节点状态

show @@datanode;

这里写图片描述
name表示datanode名称,即dn1,
datahost数据节点名称
active表示活跃连接数量
idle表示空闲连接数
size表示连接总数量

2)查看心跳状态

show @@heartbeat;

这里写图片描述

3)查看前端连接状态,然后可以根据获得的id直接杀掉连接kill @@connection id,id

show @@connection\G;

这里写图片描述

4)查看后端连接状态

show @@backend\G;

这里写图片描述

5)查看数据库资源

show @@database;

这里写图片描述

其他相关指令包括

show @@help;
show @@version;
  • 测试mycat

1) 在上述的schema.xml设置balance=”0”
A.测试读
登陆mycat的9066端口查看数据库资源

mysql -h 192.168.2.118 –P9066 -ulee1 -p123456
show @@datasource;

这里写图片描述
可以看到read_load列是master在增加
登陆mycat的8066端口

mysql -h 192.168.2.118 -P8066 -ulee1 -p123456

然后做查询操作

use testdb;
select * from pre_common_member;

再登陆9066后可以看到read_load列,master一直在增,而slave一直为0
这里写图片描述

也就是说balance=”0”的情况下,读都在master上

B.测试写
接着上面的操作,登陆8066端口的mycat,在testdb下创建表

use testdb;
create table mycatlee (id int,name varchar(20));
insert into mycatlee values (1,'lee1');

然后登陆9066端口查看

show @@datasource;

这里写图片描述
可以看到write_load下master在增加
也就是说balance=”0”的情况下,写都在master上

2)在schema.xml设置balance=”1”
A.测试读
登陆9066查看数据库资源

show @@datasource;

这里写图片描述
登陆8066后读取数据

use testdb;
select * from pre_common_member;

这里写图片描述
可以看到都在slave上读操作
也就是说balance=”1”的情况下,读都在slave上

B.测试写
登陆8066端口插入数据

insert into mycatlee values(2,'lee2');
insert into mycatlee values(3,'lee3');

这里写图片描述

可以看到在master上写操作(注意:即使是因为类似语法问题导致的写操作失败,这里的write_load数值也会一直增加,比如insert之类,因为本身是在写操作,所以上面从0直接到了2,而不是1,因为语法错误操作了写一次)
也就是说balance=”1”的情况下,写都在master上

3)在创建表的时候,如果从库没有同步进来,则在118的mycat查询mycattest的时候会提示不存在,然后直接把从库的mysql服务停止,再重新查询就可以查询出来刚插入表的内容

通过上述测试,实现了读写分离功能

备注:
1)启动mycat时候,查看wrapper.log时可能会遇到因为jvm的问题导致mycat启动不了,需要在/usr/local/mycat/conf/wrapper.conf下把Xmx等值调低
如:wrapper.java.additional.10=-Xmx4G

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值