前言
系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了。下面就针对Mycat的基础知识和应用做一总结性梳理。
一、MyCat简单介绍
MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理(类似于Mysql Proxy),用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是哪种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。
Mycat可以简单概括为
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代MySQL的加强版数据库
- 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
Mycat关键特性
- 支持SQL92标准
- 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理
- 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群
- 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
- 基于Nio实现,有效管理线程,高并发问题
- 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页
- 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join
- 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询
- 支持多租户方案
- 支持分布式事务(弱xa)
- 支持全局序列号,解决分布式下的主键生成问题
- 分片规则丰富,插件化开发,易于扩展
- 强大的web,命令行监控
- 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉
- 支持密码加密
- 支持服务降级
- 支持IP白名单
- 支持SQL黑名单、sql注入攻击拦截
- 支持分表(1.6)
- 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)
二、为什么要用MyCat
这里要先搞清楚Mycat和MySQL的区别(Mycat的核心作用)。我们可以把上层看作是对下层的抽象,例如操作系统是对各类计算机硬件的抽象。那么我们什么时候需要抽象?假如只有一种硬件的时候,我们需要开发一个操作系统吗?再比如一个项目只需要一个人完成的时候不需要leader,但是当需要几十人完成时,就应该有一个管理者,发挥沟通协调等作用,而这个管理者对于他的上层来说就是对项目组的抽象。
同样的,当我们的应用只需要一台数据库服务器的时候我们并不需要Mycat,而如果你需要分库甚至分表,这时候应用要面对很多个数据库的时候,这个时候就需要对数据库层做一个抽象,来管理这些数据库,而最上面的应用只需要面对一个数据库层的抽象或者说数据库中间件就好了,这就是Mycat的核心作用。所以可以这样理解:数据库是对底层存储文件的抽象,而Mycat是对数据库的抽象。
三、Mycat工作原理
Mycat的原理并不复杂,复杂的是代码。Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分
片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
上述图片里,Orders表被分为三个分片datanode(简称dn),这三个分片是分布在两台MySQL Server上(DataHost),即datanode=database@datahost方式,因此你可以用一台到N台服务器来分片,分片规则为(sharding rule)典型的字符串枚举分片规则,一个规则的定义是分片字段(sharding column)+分片函数(rule function),这里的分片字段为prov而分片函数为字符串枚举方式。
当Mycat收到一个SQL时,会先解析这个SQL,查找涉及到的表,然后看此表的定义,如果有分片规则,则获取到SQL里分片字段的值,并匹配分片函数,得到该SQL对应的分片列表,然后将SQL发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。以select * from Orders where prov=?语句为例,查到prov=wuhan,按照分片函数,wuhan返回dn1,于是SQL就发给了MySQL1,去取DB1上的查询结果,并返回给用户。
如果上述SQL改为select * from Orders where prov in (‘wuhan’,‘beijing’),那么,SQL就会发给MySQL1与MySQL2去执行,然后结果集合并后输出给用户。但通常业务中我们的SQL会有Order By 以及Limit翻页语法,此时就涉及到结果集在Mycat端的二次处理,这部分的代码也比较复杂,而最复杂的则属两个表的Jion问题,为此,Mycat提出了创新性的ER分片、全局表、HBT(Human Brain Tech)人工智能的Catlet、以及结合Storm/Spark引擎等十八般武艺的解决办法,从而成为目前业界最强大的方案,这就是开源的力量!
四、Mycat应用场景
- Mycat发展到现在,适用的场景已经很丰富,而且不断有新用户给出新的创新性的方案,以下是几个典型的应用场景:
- 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换;
- 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;
- 多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;
- 报表系统,借助于Mycat的分表能力,处理大规模报表的统计;
- 替代Hbase,分析大数据;
- 作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择;
- Mycat长期路线图;
- 强化分布式数据库中间件的方面的功能,使之具备丰富的插件、强大的数据库智能优化功能、全面的系统监控能力、以及方便的数据运维工具,实现在线数据扩容、迁移等高级功能;
- 进一步挺进大数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的聚表关联、排序、分组聚合等 OLAP方向的能力,并集成一些热门常用的实时分析算法,让工程师以及DBA们更容易用Mycat实现一些高级数据分析处理功能。
- 不断强化Mycat开源社区的技术水平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache基金会,成为国内顶尖开源项目,最终能够让一部分志愿者成为专职的Mycat开发者,荣耀跟实力一起提升。
五、Mycat不适合的应用场景
- 设计使用Mycat时有非分片字段查询,请慎重使用Mycat,可以考虑放弃!
- 设计使用Mycat时有分页排序,请慎重使用Mycat,可以考虑放弃!
- 设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使用Mycat,可以考虑放弃!
- 设计使用Mycat时如果有分布式事务,得先看是否得保证事务得强一致性,否则请慎重使用Mycat,可以考虑放弃!
需要注意: 在生产环境中, Mycat节点最好使用双节点, 即双机热备环境, 防止Mycat这一层出现单点故障. 可以使用的高可用集群方式有: Keepalived+Mycat+Mysql, Keepalived+LVS+Mycat+Mysql, Keepalived+Haproxy+Mycat+Mysql
六:使用mycat配置mysql读写分离
1、准备工作
(1)mysql节点的及mycat节点的准备
(2)拓扑结构
2、配置主从同步
(1)配置主库
# 在主库上创建用于复制的用户mysql> CREATE USER 'repl'@'192.168.16.%' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.16.%'; # 配置主库的server-id及开启binglog,配置完成后需要重启mysql[mysqld]log-bin=mysql-bin server-id=1# mysql操作表时不区分大小写,不配置使用mycat时可能会报错lower_case_table_names=1 # 设置字符集及需要同步的库replicate-do-db=coursecharacter-set-server=utf8init_connect='SET AUTOCOMMIT=0;set names utf8'# 锁定所有的表,防止写入mysql> FLUSH TABLES WITH READ LOCK;# 获取当前日志信息mysql> SHOW MASTER STATUSG*************************** 1. row *************************** File: mysql-bin.000001 Position: 1594# 将主库上的数据导出并传到从库~]# mysqldump --all-databases --master-data -u root -p > dbdump.db~]# scp dbdump.db root@192.168.16.152:/data/mysql/data# 释放主库锁mysql> unlock tables;
(2)配置从库
# 配置从库的server-id并重启重库[mysqld]server-id=2# 设置字符集及需要同步的库replicate-do-db=coursecharacter-set-server=utf8init_connect='SET AUTOCOMMIT=0;set names utf8'# mysql操作表时不区分大小写,不配置使用mycat时可能会报错lower_case_table_names=1 # 在从库上导入主库导出的数据~]# mysql -uroot -p reset slave;mysql> CHANGE MASTER TO -> MASTER_HOST='192.168.16.151', -> MASTER_PORT=3306, -> MASTER_USER='repl', -> MASTER_PASSWORD='replication', -> MASTER_LOG_FILE='mysql-bin.000003', -> MASTER_LOG_POS=194;mysql> start slave;
3、配置mycat
(1)配置schema.xml文件
Schema.xml文件的配置内容如下
<?xml version="1.0"?> select user()
(2)配置server.xml
通过server.xml定义登录mycat的库以及登录用户,定义的逻辑库名与schema.xml中schema标签中的name字段定义的库名要相同。添加定义一个登录用户的配置文件如下:
dayi123 testdb
(3)使用mycat
由于没有使用分片功能所以不用配置rule.xml,配置完成后重启mycat后即可使用。
# 重启mycat]# ./mycat restart# 登录mycat[root@MYCAT bin]# mysql -h192.168.16.155 -uroot -p -P8066 # 通过mycat操作数据库mysql> use TESTDBDatabase changedmysql> show tables;+------------------+| Tables_in_course |+------------------+| course || dept || score || student |
七、管理mycat
Mycat安装完成后默认会监听两个端口,8066为数据端口,9066为管理端口登录方式同mysal登录方式类似。
# 登录mycat管理端口]# mysql -h127.0.0.1 -uuser -puser -P9066
Mycat的主要管理命令如下:
- show @@help; 查看所有的命令
- reload @@config_all; 该命令用于更新配置文件
- show @@database; 该命令用于显示MyCAT的数据库的列表,对应schema.xml配置文件的schema子节点。
- show @@datanode; 该命令用于显示MyCAT的数据节点的列表,对应schema.xml配置文件的dataNode节点
- show @@heartbeat:该命令用于报告心跳状态
- show @@connection:该命令用于获取Mycat的前端连接状态,即应用与mycat的连接
- kill @@connection id,id,id :用于杀掉连接。
- show @@cache; 查看mycat缓存;SQLRouteCache为sql路由缓存。 TableID2DataNodeCache为缓存表主键与分片对应关系。 ER_SQL2PARENTID :为缓存ER分片中子表与父表关系。
- show @@datasource; 查看数据源状态,如果配置了主从,或者多主可以切换。
- switch @@datasource name:index:切换数据源,name为schema中配置的dataHost 中name。index为schema中配置的dataHost 的writeHost index 位标(按照配置顺序从上到下的一次顺序,从0开始)。
以上就是小编整理的MyCat简介,只是个人的想法,有哪里不准确的地方,还请各位大佬多多指出,咱们共同学习进步~~~
感觉文章整理的对自己有帮助的朋友,请关注小编,你们的支持就是小编最大的动力~~~