利用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)
在主从节点上分别查看通用日志
可以看到写操作被转发到了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)