您的位置:首页 > 数据库 > MySQL

mysql+mycat读写分离

2017-12-04 21:42 232 查看
环境

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 myc
a61c
atlee (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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: