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
4、启动mycat
mycat star
6、默认密码链接mycat
7、修改mycat配置文件实现读写分离
修改server.xml配置文件
<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后,对库和表操作失败
出现报错: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、测试读写分离