文章目录
一、Mycat概述
1、什么是MyCat?
- MyCat是一款数据库中间件、用于链接Java应用程序和数据库、例Tomcat web中间件。
2、为什么用Mycat?
- Java与数据库紧密耦合。
- 高访问量高并发对于数据库的压力。
- 读写请求不一致。
3、MyCat可以做什么
-
读写分离
-
数据分片
- 垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)
- 垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)
4、MyCat原理
- MyCat的原理中最重要的一个动词是“拦截”、它拦截用户发过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将SQL发往真实的后端数据库,并将返回的结果做适当的处理,最终返回给用户。
二、MyCat环境搭建
- 上传资源并解压
#解压资源
tar -zxvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /opt/module/
#切换目录
cd /opt/module/mycat/ && ll
- 配置环境变量
#编辑系统配置
vim /etc/profile
#MYCAT_HOME
export MYCAT_HOME=/opt/module/mycat
export PATH=$PATH:$MYCAT_HOME/bin
#使配置生效
source /etc/profile
#相关启动命令
mycat console | start | stop | restart | status | dump
- Mycat主要配置文件解释
- schema.xml 定义逻辑库、表、分片节点等内容
- rule.xml 定义分片规则
- server.xml 定义系统相关变量、如端口等。
三、MyCat读写分离配置
-
配置MyCat的连接信息
#切换目录
cd /opt/module/mycat/conf
#编辑 约100行
vim server.xml
-
配置MYSQL Schema信息
- 编辑schema.xml配置
<mycat:schema xmlns:mycat="http://io.mycat/"> <!--模板配置 --> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <!--数据节点 --> <dataNode name="dn1" dataHost="host_1" database="task_db" /> <!-- 数据主机配置 --> <dataHost name="host_1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <!--心跳检测 --> <heartbeat>select user()</heartbeat> <!-- 写主机配置 --> <writeHost host="hostM1" url="192.168.44.191:3306" user="root" password="SYS_666_admin"> <!-- can have multi read hosts --> <readHost host="hostS1" url="192.168.44.193:3306" user="root" password="SYS_666_admin" /> </writeHost> <!-- 写主机配置 --> <writeHost host="hostM2" url="192.168.44.191:3306" user="root" password="SYS_666_admin"> <!-- can have multi read hosts --> <readHost host="hostS2" url="192.168.44.193:3306" user="root" password="SYS_666_admin" /> </writeHost> </dataHost> </mycat:schema>
-
balance 属性解释:
- balance=“0”:不开启读写分离机制、所有读请求都发送到可用的writeHost上。
- balance=“1”:全部的readHost与 stand by writeHost参与Select的负载均衡,简单来说,当双主双从模式(m1->s1,m2->s2,并且m1和m2互为主备),则m2、s1、s2都将参与select语句的负载均衡。
- balance=“2”:都有的读操作都随机在writeHost、readHost上分发。
- balance=“3”:所有的读请求随机分发到readHost执行,writeHost不负担压力。
- balance=“0”:不开启读写分离机制、所有读请求都发送到可用的writeHost上。
-
writeType 属性解释:
- writeType=“0”:所有的写操作发送到配置的第一个writeHost,第一个挂了切换到第二个。切换记录在文件dnindex.properties
- writeType=“0”:所有的写操作都随机的发送到配置的writeHost,1.5以后版本废弃不推荐。
-
switchType 属性解释:
- switchType=“1”:自动切换。
- switchType=“1”:-1手动切换。
- switchType=“2”:基于MYSQL 主从状态决定。
-
启动MyCat
#链接 服务端 8066端口
mysql -h 192.168.44.191 -P 8066 -u mycat_m -p123456;
#链接 服务端 9066
mysql -h 192.168.44.191 -P 9066 -u mycat_m -p123456;
#查看所有Mycat服务命令
show @@help;
- 测试
三、MyCat 垂直拆分(分库配置)
-
Mycat分库概述及规则
- 概述:一个数据库由很多表构成,每个表对应着不同的业务,垂直拆分是指按照业务将表进行分类,分布到不同的数据库上面,以此分担压力,如下图:
- 分库规则:将有紧密关联关系的表应该在同一个库里,相互没有关联关系的表分到不同库里,且两台主机上两个数据库中的表【不可关联查询】。
-
编辑schema.xml分库配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--模板配置 -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<!-- 数据库表配置 -->
<table name="tb_customer" dataNode="dn2"></table>
</schema>
<!--数据节点 -->
<dataNode name="dn1" dataHost="host_1" database="task_order_db" />
<dataNode