MySQL中间件是指在MySQL数据库服务器和应用程序之间增加一个中间层,用于实现负载均衡、故障转移、自动分片等功能。常见的MySQL中间件有MySQL Proxy、MySQL Router、MaxScale、ProxySQL、Mycat等。

Mycat

Mycat是一款开源的MySQL中间件,可以实现数据分片和读写分离等功能。它提供了类似于MySQL的协议接口,客户端可以像连接MySQL数据库一样来连接和使用Mycat。

Mycat的主要特点包括:

  • 数据分片:支持水平分片和垂直分片,可以将数据分散到多个数据库中,实现分布式存储和处理。
  • 读写分离:支持主从复制和多主复制等模式,实现读写分离,提高系统的并发性能和可用性。
  • 高可用性:支持多节点部署和自动故障转移,可以保证系统的高可用性和容错性。
  • 负载均衡:支持多种负载均衡算法,可以根据负载情况自动调整请求的路由,实现负载均衡。
  • SQL解析:支持SQL解析和转换,可以将SQL语句转换为对应的分片SQL,实现对分片数据的查询和更新操作。

Mycat的优点包括:

  • 可扩展性好:可以通过数据分片和读写分离等方式实现可扩展性,支持水平扩展和垂直扩展。
  • 性能高:采用异步网络通信和高效的数据处理方式,可以实现高性能和低延迟。
  • 易用性好:提供了简单易用的管理工具和Web控制台,可以方便地管理和监控Mycat实例。
  • 兼容性好:支持MySQL协议和语法,可以与现有的MySQL应用无缝集成。

Mycat的缺点包括:

  • 学习成本高:Mycat有一定的学习曲线,需要掌握一定的分布式系统和数据库知识。
  • 部署和维护复杂:Mycat需要部署在单独的服务器上,需要进行配置和维护,对运维人员的要求较高。
  • 安全性风险:Mycat作为中间件,可能会增加安全性风险,需要进行安全评估和加固。

Mycat适用于分库分表的场景,但也有一些场景不适合使用Mycat:

  • 数据库访问量较小的应用场景,Mycat的性能优势体现在高并发的场景下,如果应用场景的数据库访问量较小,使用Mycat反而会增加额外的负担。
  • 对事务一致性要求较高的场景,因为Mycat是通过分片来实现读写分离和负载均衡的,数据可能会被分到不同的库中,事务的一致性需要由应用程序自己保证。
  • 对SQL语句的复杂度有较高要求的场景,Mycat在执行一些复杂的SQL语句时可能会存在性能问题,因为Mycat的查询优化器相对较简单,无法对复杂的SQL语句进行优化。
  • 对数据安全性有较高要求的场景,因为Mycat需要对数据库进行分片,因此需要将数据分散存储在不同的数据库中,数据的安全性可能会受到影响,需要考虑如何加强数据的安全性保护。

MyCat的高可用性

  • Keepalived+Mycat+Mysql
  • Keepalived+LVS+Mycat+Mysql
  • Keepalived+Haproxy+Mycat+Mysql
Mycat安装目录结构

mycat安装目录结构:

bin mycat命令,启动、重启、停止等

catlet catlet为Mycat的一个扩展功能

conf Mycat 配置信息,重点关注

lib Mycat引用的jar包,Mycat是java开发的

logs 日志文件,包括Mycat启动的日志和运行的日志

version.txt mycat版本说明

logs目录:

wrapper.log mycat启动日志

mycat.log mycat详细工作日

Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:

server.xml Mycat软件本身相关的配置文件,设置账号、参数等

schema.xml Mycat对应的物理数据库和数据库表的配置,读写分离、高可用、分布式策略定制、

节点控制

rule.xml Mycat分片(分库分表)规则配置文件,记录分片规则列表、使用方法等

Mycat主要配置文件说明

server.xml  存放Mycat软件本身相关的配置文件,比如:连接Mycat的用户,密码,数据库名称等

server.xml文件中配置的参数解释说明:

参数 说明
user 用户配置节点
name 客户端登录MyCAT的用户名,也就是客户端用来连接Mycat的用户名。
password 客户端登录MyCAT的密码
schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如:db1,db2
privileges 配置用户针对表的增删改查的权限
readOnly mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false

注意:
server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息
逻辑库名(如上面的TESTDB,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!
这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库

schema.xml

是最主要的配置项,此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文件中配置的.MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的

参数 说明
schema 数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应
dataNode 分片信息,也就是分库相关配置
dataHost 物理数据库,真正存储数据的数据库
Mycat实现数据库读写分离

1、创建主从库,此处不做介绍,参考前文博客

2、安装mycat;

#安装java
yum install java
#下载mycat
wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
#安装解压缩
tar -xf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /data/mycat

3、配置环境变量

echo 'PATH=/data/mycat/mycat/bin:$PATH' > /etc/profile.d/mycat.sh

25、Mysql中间件实现mysql读写分离-MYCAT_Mycat

4、启动mycat

mycat star

25、Mysql中间件实现mysql读写分离-MYCAT_读写分离_02

25、Mysql中间件实现mysql读写分离-MYCAT_MySQL_03

6、默认密码链接mycat

25、Mysql中间件实现mysql读写分离-MYCAT_Mycat_04

25、Mysql中间件实现mysql读写分离-MYCAT_Mycat_05

7、修改mycat配置文件实现读写分离

修改server.xml配置文件

25、Mysql中间件实现mysql读写分离-MYCAT_Mycat_06

<user name="root"> #连接Mycat的用户名
<property name="password">1234.com</property> #连接Mycat的密码
<property name="schemas">TESTDB</property> #数据库名要和schema.xml相对应

修改schema.xml配置文件

上面配置中,balance改为1,表示读写分离。以上配置达到的效果就是10.0.7.200为主库,10.0.7.205为从库
注意:要保证10.0.7.200和10.0.7.205机器能使用root/1234.com权限成功登录mysql数据库。同时,也一定要授权mycat机器能使用root/123456权限成功登录这两台机器的mysql数据库!!这很
重要,否则会导致登录mycat后,对库和表操作失败
上面配置中,balance改为1,表示读写分离。以上配置达到的效果就是10.0.7.200为主库,10.0.7.205为从库
注意:要保证10.0.7.200和10.0.7.205机器能使用root/1234.com权限成功登录mysql数据库。同时,也一定要授权mycat机器能使用root/123456权限成功登录这两台机器的mysql数据库!!这很
重要,否则会导致登录mycat后,对库和表操作失败

25、Mysql中间件实现mysql读写分离-MYCAT_MySQL_07

出现报错:Caused by: io.mycat.config.util.ConfigException: schema TESTDB didn't config tables,so you must set dataNode property!

解决:将schema中的randomdatanode改为datanode

8、重启mycat

9、测试读写分离

25、Mysql中间件实现mysql读写分离-MYCAT_Mycat_08

25、Mysql中间件实现mysql读写分离-MYCAT_读写分离_09

25、Mysql中间件实现mysql读写分离-MYCAT_MySQL_10