MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。
我们的应用只需要一台数据库服务器的时候我们并不需要Mycat,而如果你需要分库甚至分表,这时候应用要面对很多个数据库的时候,这个时候就需要对数据库层做一个抽象,来管理这些数据库,而最上面的应用只需要面对一个数据库层的抽象或者说数据库中间件就好了,这就是Mycat的核心作用。
总结:Mycat是一个广受好评的数据库中间件,为了减轻单数据库的压力,可以实现主从、热备、分表分库,从而实现数据库的分布式架构。 |
参考博客:https://blog.csdn.net/nxw_tsp/article/details/56277430
Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
上述图片里,应用程序不再直接访问数据库,而是访问Mycat,由Mycat与数据库交互,数据库数据返回给Mycat,Mycat再返回给应用程序。三个Database才是真正的数据库,又称为三个节点,也称为三个分片。
总结:Mycat作为一个中间件,应用程序直接访问它,不用 再去管真实的数据库,而由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社区,聚集100个CXO级别的精英,众筹建设亲亲山庄,Mycat社区+亲亲山庄=中国最大IT O2O社区
参考:https://www.cnblogs.com/andy6/p/6622324.html
收录于:Mycat权威指南,感谢作者
下载:去Mycat官网下载,我这里下载的是1.6版本的,Windows系统的 |
Mycat官方网站:http://www.mycat.io/
安装:下载后解压,以管理员身份运行cmd,进入bin目录,这里有几个操作命令 |
mycat install
启动:
mycat start
停止:
mycat stop
重启:
mycat restart
安装以后,我们就可以直接去服务里面启动与停止了,不用再使用命令 |
参考:https://blog.csdn.net/smilefyx/article/details/72810531
需求:我在云服务器与本机都安装有Myql,现在我要使用这两个Mysql共同来给我的应用程序提供服务,主要涉及到的是MAVEN_SSM数据下面的user表,下面分别给出sql:
本机Mysql执行的sql为:
drop database if exists MAVEN_SSM;
create database MAVEN_SSM;
use MAVEN_SSM;
create table user(
id int not null auto_increment,
username char(20) not null,
password char(33) not null,
address char(8) not null,
birthday date,
department_id int not null,
primary key (id)
);
insert into user(id,username,password,address,birthday,department_id) values(1,'小余','123456','四川成都','2018-06-01',2);
insert into user(id,username,password,address,birthday,department_id) values(2,'小余','982352','成都大学','2015-04-03',3);
云服务器上执行的sql为:
drop database if exists MAVEN_SSM;
create database MAVEN_SSM;
use MAVEN_SSM;
create table user(
id int not null auto_increment,
username char(20) not null,
password char(33) not null,
address char(8) not null,
birthday date,
department_id int not null,
primary key (id)
);
insert into user(id,username,password,address,birthday,department_id) values(3,'小王','982352','四川绵阳','1996-08-26',2);
Mycat的默认端口是:8066,对于应用程序来说,数据库名为Mycat的中间件逻辑数据库名,不再是某个真实的数据库名 |
Mycat的配置文件,在conf目录下面有:server.xml、schema、rule.xml,以及ehcache.xml、log4j2.xml,我们主要使用前三个 |
首先配置:server.xml,将默认的该配置文件下的user全都删掉,新建了一个用户peng: |
用户名:peng
其密码为:123456
其逻辑数据库名为:MYCAT_DB
是否为只读数据库:否
由于Mycat安装在本机,则需要更换驱动的url为本机的Mycat中间件 |
jdbc:mysql://localhost:3306/MAVEN_SSM
改为
jdbc:mysql://localhost:8806/MYCAT_DB
其次配置schema.xml,配置数据库的表结构,配置分片 |
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="MYCAT_DB" checkSQLschema="false" sqlMaxLimit="100">
<table name="user" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long"/>
schema>
<dataNode name="dn1" dataHost="localhost" database="MAVEN_SSM"/>
<dataNode name="dn2" dataHost="remotehost" database="MAVEN_SSM"/>
<dataHost name="localhost" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">writeHost>
dataHost>
<dataHost name="remotehost" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="hostM1" url="47.55.478.991:3306" user="root" password="123456">writeHost>
dataHost>
mycat:schema>
当然这里的云服务47.55.478.991:3306,是我个人的,我用完就处理了,你们是用不了的,需要使用自己的服务器 |
最后配置rule.xml,我们在schema.xml中使用了mod-long规则,由于是两个节点来提供服务,这里我就将其设置为均分:比如插入时,一个一库,轮流进行 |
更多的配置规则与详情,请查看Mycat的官方文档,官网可以找到 |
测试:为了方便我这里使用的是Navicat,读者也可以使用其他数据库连接工具 |
查看云服务器Mysql:
查询操作:
插入操作1:
insert into user(id,username,password,address,birthday,department_id) values(4,'帅哥1','123456','四川成都','2018-06-01',2);
插入操作2:
insert into user(id,username,password,address,birthday,department_id) values(5,'帅哥2','123456','四川成都','2018-06-01',2);
这时候本机与云服务器的数据库,各插了一条,均匀分配。再次进入Mysql进行验证:
云服务器Mysql:
再次查询:
可以看到这里顺序是有问题的,我们需要使用order by |
现在顺序正常了,不过我们可以发现,我们以前的理所当然的sql语句可能出现很多不适用,比如上面出现的顺序问题,就需要依照Mycat的要求来写sql了 |
我们在案例中实现了分表分库,那么读写分离等,九幽读者自行实现了,其实也很简单 |
参考博客:https://blog.csdn.net/gaobudong1234/article/details/79581846
谢谢大家的观看!