- 环境
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