MyCat
一、概述
1.1 读写分离
一般数据库操作,写操作(DML:insert update delete)都不会成为数据库的瓶颈,一般都是单表操作,并且很短时间都可以完成。但是读操作(DQL:select)往往非常浪费服务器资源,特别数据量大的多表联合查询,消耗服务器资源不亚于死循环,甚至导致数据库宕机。所以在企业中都会使用读写分离,让读操作多台服务器进行负载均衡,来缓解读压力。
使用数据库中间件技术(mycat),让数据的查询(select)和写操作(insert update delete)在不同的主机上数据库执行,这就读写分离。
1.2 数据库中间件
中间件:一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通。例子:Tomcat,web中间件。
数据库中间件:连接java应用程序和数据库
写:insert into a... -> 主机(192.168.190.128:3301)
读:select * from a -> 从机(192.168.190.128:3302)
二、Mycat
MyCAT是一款由阿里Cobar演变而来的用于支持数据库读写分离、分片的分布式中间件。MyCAT可不但支持Oracle、MSSQL、MYSQL、PG、DB2关系型数据库,同时也支持MongoDB等非关系型数据库。
2.1 为什么要用Mycat
Java与数据库紧耦合,Mycat 是数据库中间件,连接 Java 应用程序和数据库
高访问量高并发对数据库的压力。读写请求数据不一致
2.2 作用
2.2.1 读写分离
2.2.2 数据分片
垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)
2.2.3 多数据源整合
分布式项目中,实现多数据源整合
2.3 原理
Mycat 拦截了用户发送过来的 SQL 语句,首先对 SQL 语句进行特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将该 SQL 发送到真实的数据库,并处理返回的结果,再返回给用户。
这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用 Mycat 还是MySQL。
三、安装启动MyCat
3.1 安装MyCat
将准备好的MyCat安装包上传到服务器,解压后可使用(没有可以私我),上传位置例: /opt/mycate 需要创建个mycate文件夹
解压MyCat安装包
tar -zxvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
3.2 启动MyCat
-
控制台启动 :去 mycat/bin 目录下执行 ./mycat console
-
后台启动 :去 mycat/bin 目录下 ./mycat start
-
关闭:./mycat stop
控制台启动 这样就代表成功
./mycat console
启动MyCat
./mycat start
关闭MyCat
./mycat stop
四、配置读写分离
4.1 准备工作
配置好mysql双主双从详细配置看上章配置双主双从
架构图如下:
4.2 MyCat配置文件
MyCat的配置文件,位于conf路径下,主要配置文件有三个:
-
server.xml:定义mycat用户以及系统相关变量,如端口等
-
schema.xml:定义逻辑库,表、分片节点等内容
-
rule.xml:定义分片规则
4.3 读写分离配置配置
4.3.1 配置server.xml
server.xml 几乎保存了所有 mycat 需要的系统配置信息(全局配置)。<user>
标签,这个标签主要用于定义登录 mycat 的用户和权限。
-
user:用户信息
-
name:用户名
-
passowrd:密码
-
schemas:逻辑库(和schema.xml中定义的一致)
4.3.2 修改schema.xml
schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库、表、分片规则、DataNode 以及 DataSource。弄懂这些配置,是正确使用 MyCat 的前提。
配置说明:
-
schema标签用:于定义 MyCat 实例中的逻辑库,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配 置。
-
dataNode标签:定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。
-
dataHost标签:作为 schema.xml 中最后的一个标签,该标签在 mycat 逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句(show slave status)。
-
balance 属性:负载均衡类型,目前的取值有 3 种:
-
balance="0":不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
-
balance="1":全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
-
balance="2":所有读操作都随机的在 writeHost、readhost 上分发。
-
-
writeType属性:读写类型,目前的取值有 3 种
-
writeType="0":所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties
-
writeType="1":所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
-
-
switchType 属性:自动切换机制
-
-1 :表示不自动切换
-
1 :默认值,自动切换
-
2 :基于 MySQL 主从同步的状态决定是否切换,心跳语句为 show slave status
-
3 :基于 MySQL galary cluster 的切换机制(适合集群),心跳语句为 show status like ‘wsrep%’
-
-
配置:
1. 找到文件删除默认的schema配置
删除本来自带的所有内容
2. 添加配置
将我的配置复制进去 根据下方教程进行修改为自己的
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="A2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <!-- name:别名 dataHost:和dataHost选项一致 database:mysql的数据库 --> <dataNode name="dn1" dataHost="host1" database="a1" /> <!-- mycat逻辑库连接的mysql数据库具体配置 --> <!-- name:标签名 maxCon:最大连接数量 balance:读写分离机制 --> <dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- 负责写的服务器:主 host:名字 --> <writeHost host="M1" url="192.168.5.69:3306" user="root" password="root"> <!-- 负责读的服务器:从 --> <readHost host="S1" url="192.168.5.70:3306" user="root" password="root"></readHost> <readHost host="S2" url="192.168.5.99:3306" user="root" password="root"></readHost> </writeHost> <writeHost host="M2" url="192.168.5.70:3306" user="root" password="root"> <readHost host="S4" url="192.168.5.69:3306" user="root" password="root"></readHost> <readHost host="S3" url="192.168.5.96:3306" user="root" password="root"></readHost> </writeHost> </dataHost> </mycat:schema>
⚠️ 黄色框部分不要名字重复了
⚠️将ip地址改为自己配置的主从服务
⚠️user password 改为自己设置的数据库账号密码
4.3.3 连接mycat
启动mysql集群
启动mycat
./mycat start
使用navicat链接
测试
在数据库里创建一个表 添加两个内容在去主从服务的四个数据库中查看是否数据都添加进去了
在主从配置的四个数据库中查看,出现这个效果就说明MyCat配置已经完成了