利用Mycat中间件实现MySQL的读写分离

实验环境

node Master Slave Mycat
linux CentOS7.9 CentOS7.9 CentOS7.9
mysql 5.7 5.7 5.7
IP 192.168.18.131 192.168.18.133 192.168.18.135

192.168.18.131、192.168.18.133搭建成MySQL主从同步环境

192.168.18.135主机部署mycat (注:内存需要2G以上,否则mycat服务起不来)

 

所有主机关闭SELinux和防火墙

systemctl stop firewalld
setenforce 0
时间同步

 

 

安装环境准备

  • 1、jdk:要求jdk必须是1.7及以上版本

  • 2、Mysql:推荐mysql是5.5以上版本

安装MyCat

1.下载mycat

[root@centos7 soft]# wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz

2.解压到/apps目录下

[root@mycat soft]# mkdir /apps

[root@mycat soft]# tar -xvf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /apps

[root@mycat conf]# echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh

[root@mycat conf]# source /etc/profile.d/mycat.sh

[root@mycat conf]# netstat -lnp |grep :8066 tcp6 0 0 :::8066 :::* LISTEN 67184/java

#用默认密码123456来连接mycat

[root@mycat conf]# mysql -uroot -p123456 -h 192.168.18.135 -P8066

 mysql> show databases;
 +----------+
 | DATABASE |
 +----------+
 | TESTDB   |
 +----------+
 

 

在mycat 服务器上修改server.xml文件配置Mycat的连接信息

[root@mycat conf]# vim /apps/mycat/conf/server.xml

 110 <user name="root" defaultAccount="true">            #连接Mycat的用户名
 111         <property name="password">123456</property> #连接Mycat的密码,默认密码为123456
 112         <property name="schemas">TESTDB</property> #数据库名要和schema.xml相对应

 

 

修改schema.xml实现读写分离策略

 1 [root@mycat ~]#vim /app/mycat/conf/schema.xml                                       
 2  <?xml version="1.0"?>
 3  <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 4  <mycat:schema xmlns:mycat="http://io.mycat/">
 5  ​
 6          <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" randomDataNode="dn1" dataNode="dn1">
 7          </schema>
 8          <dataNode name="dn1" dataHost="localhost1" database="mycat" />
 9          <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
10                            writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
11                  <heartbeat>select user()</heartbeat>
12                  <!-- can have multi write hosts -->
13                  <writeHost host="hostM1" url="192.168.18.131:3306" user="root"
14                                     password="123456">
15                  <readHost host="hostS1" url="192.168.18.133:3306" user="root"
16                                     password="123456" />
17          </dataHost>
18  </mycat:schema>
19  ​
20  #以上***部分表示原配置文件中需要修改的内容
21  #重新启动mycat
22  [root@mycat ~]#mycat restart

 

上面配置中,balance改为1,表示读写分离。以上配置达到的效果就是192.168.18.131为主库,192.168.18.133为从库

注意:要保证192.168.18.131和192.168.18.133机器能使用root/123456权限成功登录mysql数据库。同时,也一定要授权mycat机器能使用root/123456权限成功登录这两台机器的mysql数据库!!这很重要,否则会导致登录mycat后,对库和表操作失败!

 

在后端主服务器创建用户并对mycat授权

 [root@master ~]#mysql -uroot -p
 mysql> create database mycat;
 Query OK, 1 row affected (0.04 sec)
 ​
 mysql> GRANT ALL ON *.* TO 'root'@'192.168.18.135' IDENTIFIED BY '123456' ; 
 mysql> flush privileges;

 

 

通过通用日志确认实现读写分离

在主和从服务器分别启用通用日志,查看读写分离

[root@master ~]#vim /etc/my.cnf
 [mysqld]
 ...
 general_log=ON
 general_log_file='master-general.log'
 ...
 [root@master ~]#systemctl restart mysqld
 [root@master ~]#tail -f /data/mysql/master-general.log
 ​
 [root@slave ~]#vim /etc/my.cnf
 [mysqld]
 ...
 general_log=ON
 general_log_file='slave-general.log'
 ...
 [root@slave ~]#systemctl restart mysqld
 [root@slave ~]#tail -f /data/mysql/slave-general.log
在mysql中查看通用日志

 show variables like 'general_log';  #查看日志是否开启
 show variables like 'general_log_file'; #查看日志文件保存位置

 

 

在Mycat服务器上执行读写操作,进行读写分离的测试

[root@mycat ~]#mysql -uroot -p123456 -h127.0.0.1 -P8066
 mysql> show databases;
 +----------+
 | DATABASE |
 +----------+
 | TESTDB   |    //只能看一个虚拟数据库
 +----------+
 mysql> create table test1 (id int,name varchar(10));
 mysql> insert into test1 values(111,'quhongzhi');
 mysql> select * from test1;
 mysql> select @@server_id;
 +-------------+
 | @@server_id |
 +-------------+
 |           2 |
 +-------------+
 1 row in set (0.00 sec)

 

在主从节点上分别查看通用日志

Mycat实现读写分离_centos

Mycat实现读写分离_mysql_02

 

 可以看到写操作被转发到了Master节点,读操作被转发到了Slave节点。

 

 

停止从节点,MyCAT自动调度读请求至主节点

 [root@slave ~]#systemctl stop mysqld
 ​
 [root@mycat ~]#mysql -uroot -p123456 -h192.168.100.10 -P8066
 mysql> select @@server_id;
 +-------------+
 | @@server_id |
 +-------------+
 |           1 |
 +-------------+
 1 row in set (0.00 sec)