一、前言
mycat跟proxysql一样都是实现mysql主从架构的读写分离,提高mysql性能,也是具备主从读写的故障切换和读写分离功能,不过跟proxysql有区别的是,mycat用的是虚拟库映射后端真实数据库的用法
二、部署
部署mysql,需要mysql高可用架构才能实现mycat的主从读写故障切换功能,使用一主两从架构是不会使用到mycat的主从读写故障切换功能
在部署mycat前需要部署jdk环境
参考:jdk1.8环境配置_jdk1.8的配置-CSDN博客
在github上下载mycat安装包
参考:Releases · MyCATApache/Mycat-Server · GitHub
我这边用的是 1.6.7.5版本
创建mycat存放目录
mkdir /opt/mycat && cd /opt/mycat
tar -zxvf Mycat-server-1.6.7.5-release-20200422133810-linux.tar.gz
配置环境
vi /etc/profile
#mycat
export MYCAT_HOME=/opt/mycat/mycat
export PATH=$MYCAT_HOME/bin:$PATH:$JAVA_HOME/bin
#java
export JAVA_HOME=/opt/java/jdk1.8.0_391
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
使环境配置生效
source /etc/profile
编辑mycat配置文件
vi /opt/mycat/mycat/conf/server.xml
<user name="root" defaultAccount="true"> #mycat默认使用连接后端mysql的用户,必须要在mysql里有权限
<property name="password">12345678</property> #mysql用户密码
<property name="schemas">xn_nacos</property> #配置mycat虚拟库,我这里是一个真实库对应一个虚拟库
<property name="schemas">xn_demeter_field</property> #配置mycat虚拟库,我这里是一个真实库对应一个虚拟库
<property name="schemas">xn_demeter_foundation</property> #配置mycat虚拟库,我这里是一个真实库对应一个虚拟库
<property name="schemas">xn_demeter_report</property> #配置mycat虚拟库,我这里是一个真实库对应一个虚拟库
<property name="defaultSchema">xn_demeter_field</property> #mycat默认使用的虚拟库
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user"> #配置的只读用户,也可以注释掉不用
<property name="password">user</property>
<property name="schemas">xn_nacos</property>
<property name="schemas">xn_demeter_field</property>
<property name="schemas">xn_demeter_foundation</property>
<property name="schemas">xn_demeter_report</property>
<property name="readOnly">true</property>
<property name="defaultSchema">xn_demeter_field</property>
</user>
vi /opt/mycat/mycat/conf/schema.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
#虚拟库的配置,对应后端的真实库,每个虚拟库对应一个后端真实库,其实也可以一个虚拟库对应后端所有真实库,但是性能有影响,datanode就是配置对应的后端真实库,schemaname也要和前面的server配置文件中的schemename对应
<schema name="xn_nacos" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" >
</schema>
<schema name="xn_demeter_report" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2" > </schema>
<schema name="xn_demeter_field" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3" > </schema>
<schema name="xn_demeter_foundation" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn4" > </schema>
#配置后端的真实库,datanodename就是提供给虚拟库调用的名称,datahost就是下面配置的后端mysql信息已经读写分离配置信息,database就是mysql真实库的名称
<dataNode name="dn1" dataHost="localhost1" database="nacos" />
<dataNode name="dn2" dataHost="localhost1" database="demeter_report" />
<dataNode name="dn3" dataHost="localhost1" database="demeter_field" />
<dataNode name="dn4" dataHost="localhost1" database="demeter_foundation" />
#配置后端mysql的信息,通过writehost和readhost标签实现读写分离,readhost标签在writehost标签的里面
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
#心跳检测命令
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="10.1.60.115:3306" user="root"
password="12345678">
<readHost host="hostS1" url="10.1.60.114:3306" user="root" password="12345678"> </readHost>
</writeHost>
</dataHost>
</mycat:schema>
maxCon:每个读写实例连接池的最大连接数
minCon:每个读写实例连接池的最小连接数,初始化连接池的大小
balance:指定读写分离的负载均衡模式有四种模式
0:不开启读写分离,所有读操作都发送到当前可用的writehost上
1:全部的readHost与Stand by writeHost都参与select语句的负载均衡,即在两主两从的情况下,有一个主也参与到读的负载均衡中
2:所有的读操作都随机在writeHost,readHost上分发
3:所有的读请求都随机分配到writeHost对应的readHost上执行,writeHost不负担读压力
writeType:负载均衡模式有三种模式
0:所有写操作都发送到可用的writeHost上
1:所有写操作都随机的发送到readHost
2:所有写操作都随机的在writeHost、readhost分上发
dbType:指定后端连接的数据库类型,支持的类型有mysql、mongodb等
dbDriver:指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。其他类型的数据库则需要使用JDBC驱动来支持
switchType:主从故障切换模式
-1:主从发生故障时不自动切换
0:默认值,主从发生故障时自动切换
1:基于MySQL主从同步状态决定是否切换,必须将心跳检测语句改为 show slave status
2:基于mysql galary cluster的切换机制,必须将心跳语句改为show status like “%esrep%”;
需要在后端的mysql节点上创建mycat配置的对应的用户才可以使用
mysql -u root -p
grant all on *.* to 'root'@'%' identified by '12345678';
flush privileges;
后台启动mycat服务
cd /opt/mycat/mycat
./bin/mycat start
命令行启动mycat服务,所有信息都会输出到命令行中
cd /opt/mycat/mycat
./bin/mycat console
停止mycat服务
cd /opt/mycat/mycat
./bin/mycat stop
验证mycat是否实现读写分离
调用mycat服务进行数据库的读写操作
mysql -u root -p -h10.1.60.115 -P8066 -e 'select * from mysql.user';
在mysql上开启查询日志收集的功能
调用mycat服务执行查询后,再查看主从节点是否有查询日志即可验证
mycat默认数据库连接端口为8066,管理端口为9066
至此mycat搭建完成,如需高可用mycat,则可以再部署一个mycat使用keepalived搭建高可用