Mycat 是阿里巴巴开源的一款数据库中间件。
一. Mycat的前世今生
二. Mycat的主要作用
1. Mycat实现了MySQL通信协议的一个分布式数据库系统中间层。
数据库中间层的作用:数据库读写分离、读负载均衡、数据库连接池(控制数据库的连接数量)、屏蔽后端数据库的变更,对关系型数据库、非关系型数据库进行操作。
2. 实现数据库的读写分离,Mycat支持读负载均衡,多出现在一主多从的架构上,读操作可以在多个从服务器上进行均衡。Mycat还支持后端MySQL主从复制集群高可用。
这里的高可用:指的是可以在配置的时候,除了主节点之外,在指定一台从节点也可以支持写的功能,当主节点宕机之后,Mycat会把写的SQL路由到我们在配置文件中指定的从节点上,并且并不支持把其他的从节点设置为新的主节点进行主从同步的功能。
3. Mycat可以实现数据库的垂直拆分
数据库的垂直拆分:可以称之为纵向的拆分,把数据库中的表按照一定的规则来分摊到多个数据库实例中,比如一个电商系统可以将用户模块、订单模块、支付模块等相关涉及的表分别存放到用户库,订单库,支付库中。
数据库的水平拆分:也就是分库分表,在经过垂直拆分后,业务量持续发展,规模相当大。这时,拆分过后的用户库已经不能满足需求,这时需要通过一定的规则进行水平拆分
切蛋糕(从左向右水平分开)
将原来的一个用户库分成多个用户库,通过一定的规则进行切分(拆分之后,每个库中的表结构都一样),前端应用通过mycat和切分规则来对后端切分后的数据库进行访问
三. Mycat的场景应用
1. 需要进行读写分离的场景:在一台数据库服务器上进行读写混合操作时,感到数据库性能大幅下降,并且读负载明显高于写负载时可以使用。MYCAT支持多种后端的MySQL集群方案来进行读写分离:一主一从,一主多从,主主复制,PXC集群等。
2. 需要进行分库分表的场景:对数据库进行切分,MYCAT可以很好的支持超过千万的表进行分片,支持大规模的单表分片量级。
3. 多租户场景:这是一种软件架构,其主要目的是在多用户环境下使用共同的数据库系统组件,并且任然可以确保更多用户之间具有一定的数据的隔离性,每一个应用可以访问一个库,而应用程序只需要连接MYCAT,从而不用改变程序本身就可以实现多租户的场景,最常见的就是:云服务
4. 数据统计系统:对于MYCAT的分表能力,处理大规模报表的系统的统计可以并发的对后端数据库中的数据进行汇总,然后进行合并
5. 作为HBASE的一种替代方案:HBASE是一个分布式列存储数据库,而一般的关系型数据库是采用行存储的,我们可以利用MYCAT的水平和垂直切分的能力来实现对数据库的分布式存储
6. 需要使用同样的方式查询多种数据库的场景:MYCAT除了支持MySQL之外,它还可以通过JDBC来连接其他多种关系型数据库以及像MongoDB这样的非关系型数据库,这样对应前端应用来说就可以隐藏后端数据库的种类,而通过同样的方式来使用我们的多种数据库。
四. 使用Mycat的优势
1. 基于阿里的Cobar系统开发(拼爹的时代:Mycat有一个好爹)
2. 开发社区活跃
3. 完全开源可以自定义开发
4. 支持多种关系型及NOSQL数据库
5. 使用JAVA开发,可以部署在多种系统上
五. Mycat中的逻辑库与逻辑表
1. 逻辑库
Mycat中的逻辑库,位于中间层,它屏蔽了分库、分表后,数据库操作的复杂性。前端应用可以像使用一个未分库、分表的数据库一样来使用分库、分表的数据库(数据库路由等都是由中间件实现)。
User_DB是逻辑数据库(虚拟)
db01、db02、db03是物理数据库(真实)
mycat中只保存逻辑库的定义,不保存数据,具体的数据存储在物理数据库中。
2. 逻辑表
Mycat中的逻辑表:前端应用通过Mycat所看到的表就是逻辑表,一个逻辑表可能对应后端的多个物理数据库中的表,比如User_DB逻辑库中有一张user_info逻辑表,而实际上user_info表中的数据是存储在db01,db02,db03物理库中的物理user_info表中。
六. Mycat的关键特性
1. 支持sql92标准:sql92标准是大多数关系型数据库都支持的一个SQL标准,这个标准中定义了SQL语句的一些功能和标准的一些事务的特性,比如说隔离级别等。
2. 支持MYSQL集群:一主多从,一主一从,多主多从等。
3. 支持JDBC连接数据库:可以通过JDBC来连接除了MySQL之外的其他关系型数据库,比如Oracle,MSSQL,SqlServer,PgSQL等
4. 支持NOSQL数据库: 比如MongoDB。
5. 支持自动故障切换,高可用性
6. 支持读写分离
7. 支持全局表:全局部就是一些比较小的字典表,这些表一般都很小,并且经常与其他数据表进行关联使用。MYCAT可以把同样的数据自动的存储到多个分片节点上,这样可以有效提高表之间的关联效率。
8. 支持独有的基于ER关系的分片策略:ER关系就是实体关系模型,是关系型数据库的基础。ER关系的分片策略是基于ER关系模型来实现的,这种分片策略可以把子表记录与所关联的附表存放到同一个数据分片上。也就是说子表可以依赖于附表来进行存储,这样就保证了在子表与附表关联的时候不会跨分片跨库来进行操作。
9. 支持一致性HASH分片
10. 基于Java开发,支持多平台运行与部署
11. 支持全局序列号:全局序列号保证Id全局唯一
七. 在windows环境下安装Mycat
Mycat官网:http://www.mycat.io/
Mycat下载:http://dl.mycat.io/
1. 在安装Mycat之前,你要确保已经安装了Java环境(Java jdk的安装与配置)在此不再多说,请自行百度!
2. 下载到windows中进行解压,解压后目录结构如下:
bin目录:Mycat的可运行文件
conf目录:Mycat的配置文件
lib目录:Mycat的依赖包文件
logs目录:Mycat日志文件
3. mycat的关键配置文件
(1)schema.xml:用于配置逻辑库表及数据节点
a. <schema><table></table></schema>定义逻辑库表
schema:定义逻辑库
table:定义逻辑库下的逻辑表
通过这组标签可以知道:逻辑表依赖于逻辑库而存在的,如果数据库不需要分片,只需要读写分离,那么就可以不配置逻辑表(table),只需保留schema标签就可以了
b. <dataNode></dateNode>定义数据节点
dateNode:定义分片节点
一个数据节点代表一个独立的数据分片,这个标签中定义的内容包括:节点名字、物理数据库的名字
c. <dataHost></dataHost>定义数据节点的物理数据源
dataHost:定义物理数据源的信息(物理数据库实例),它定义了一组主机节点,这组节点是一个真实的物理数据库实例。一个dataHost所指定的主机就是一组真实的MySQL集群,除此之外还包括定义读写分离的配置和心跳语句的配置。
(2)rule.xml:用于配置表的分片规则
<tableRule name=""></tableRule>定义表使用的分片规则
<function name=""></function>定义分片算法
(3)server.xml:用于配置服务器权限
a. <system><property name=""></property></system>用于定义系统配置,比如系统的端口号,系统的内存大小,超时时间等
b. <user></user>用于定义连接MyCAT的用户,比如用户名,密码等.
4. Mycat的配置(conf目录)
(1)server.xml配置:
默认如上图,有一个逻辑库,名字为TESTDB, 有两个用户,root和user,默认即可
(2)schema.xml配置:
将writeHost标签中信息中修改为本地Mysql数据库信息,包括url、用户名、密码,因为只是在本地服务器上进行测试,所以将下面的<readHost>和<writeHost>进行了注释。
5. 启动Mycat(bin目录)
6. 通过Navicat工具连接Mycat
8066是Mycat的默认端口,用户名和密码是你在server.xml配置的。
测试连接成功之后,打开MyCat-Test连接,可以看到如下信息:
TESTDB中的表是打不开的,会报错,此时你需要查看schema.xml的配置。
这时我们现在本地创建三个数据库db1,db2,db3,让创建一张goods表,
CREATE TABLE `goods` ( `id` int(11) NOT NULL, `good_name` varchar(255) COLLATE utf8mb4_croatian_ci DEFAULT NULL COMMENT '商品名', `good_price` decimal(10,2) DEFAULT NULL COMMENT '商品价格', `good_source` varchar(255) COLLATE utf8mb4_croatian_ci DEFAULT NULL COMMENT '商品来源', `good_num` int(10) DEFAULT NULL COMMENT '商品数量', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_croatian_ci;
然后再次连接MyCat-Test就能打开goods表了
要打开其他表也是同理,关键在于你的Mycat配置。
到此Mycat入门就说到这里。
发文不易,感谢你的关注与阅读,喜欢的话点个赞!