mycat读写分离部署

2023-12-20 21:52:16

一、前言

? ? ? mycat跟proxysql一样都是实现mysql主从架构的读写分离,提高mysql性能,也是具备主从读写的故障切换和读写分离功能,不过跟proxysql有区别的是,mycat用的是虚拟库映射后端真实数据库的用法

二、部署

? ? 部署mysql,需要mysql高可用架构才能实现mycat的主从读写故障切换功能,使用一主两从架构是不会使用到mycat的主从读写故障切换功能

? ? 参考:mysql mha高可用-CSDN博客

? ? 在部署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上开启查询日志收集的功能

参考:mysql开启查询日志-CSDN博客

调用mycat服务执行查询后,再查看主从节点是否有查询日志即可验证

mycat默认数据库连接端口为8066,管理端口为9066

至此mycat搭建完成,如需高可用mycat,则可以再部署一个mycat使用keepalived搭建高可用

文章来源:https://blog.csdn.net/ApexPredator/article/details/135068928
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。