秒懂mycat

标签: 问题集锦 IDEA | 发表时间:2020-12-28 16:00 | 作者:
出处:http://www.arccode.net/

背景

阿里开源的一个数据库中间件,专门为大数据量的项目做分库分表用的。有如下特点:

  • 一个彻底开源的,面向企业应用开发的大数据库集群

  • 支持事务、ACID、可以替代MySQL的加强版数据库

  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

  • 一个新颖的数据库中间件产品

官网地址: http://www.mycat.org.cn/

mycat权威指南: http://www.mycat.org.cn/document/mycat-definitive-guide.pdf

mycat架构

话不多说,一张mycat架构图就能让你知道mycat的角色以及作用。

mycat1.6版本架构如下:

由图可知,mycat位于数据库和应用层(APP)之间,它的角色就是帮我们管理数据库集群,而提供应用统一访问数据库接口。

垂直分库

垂直分库通俗来说就是按照功能划分,将不同的数据放在不同的数据库中。

水平分表

水平分表通俗来说就是某表数据量太大了,那么我们很自然地想到是加多一个表来存储数据,这样查询速度才会更快。那么水平分表就是表结构是一样的,只不过存的数据不一样而已。

逻辑库和逻辑表

逻辑库:通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。

逻辑表:分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。

mycat基本配置

当我们数据量特别大的时候需要分库分表的时候,那么我们可以考虑使用mycat。那么mycat具体如何做到分库分表的呢?接下来就要学习mycat的三大配置文件进行灵活配置就可以实现分库分表啦啦啦。。。

mycat主要的三大配置文件: server.xml、schema.xml、rule.xml

这三个配置文件位于mycat的安装目录的conf目录中。

server.xml

该文件几乎包含了所有 mycat 需要的系统配置信息。其中包括对外(应用)访问端口,编码,连接超时时间,最大连接数,事务级别,用户密码以及逻辑库等信息。

详细可以阅读下面的配置:

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE mycat:server SYSTEM "server.dtd">     
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="serverPort">8066</property> <!-- mycat 服务端口-->
<property name="managerPort">9066</property><!-- mycat 管理端口-->
<property name="nonePasswordLogin">0</property>
<property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">2048</property>
<property name="charset">utf8</property><!-- 配置该属性的时候一定要保证mycat的字符集和mysql 的字符集是一致的 -->
<property name="txIsolation">2</property> <!-- 前端连接的初始化事务隔离级别,只在初始化的时候使用,后续会根据客户端传递过来的属性对后端[数据库](http://msd.misuland.com/pd/3148108429789238586)连接进行同步。默认为 REPEATED_READ,设置值为数字默认 3。 READ_UNCOMMITTED = 1; READ_COMMITTED = 2; REPEATED_READ = 3; SERIALIZABLE = 4;-->
<property name="processors">8</property><!-- 处理线程数量,默认是cpu数量-->
<property name="idleTimeout">1800000</property><!-- mycat访问mysql,多长时间无反应断开连接-->
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全局表一致性检测、0为关闭 -->
<property name="sqlExecuteTimeout">300</property><!-- SQL 执行超时的时间,Mycat 会检查连接上最后一次执行 SQL 的时间,若超过这个时间则会直接关闭这连接。默认时间为 300 秒,单位秒。-->
<property name="sequnceHandlerType">1</property> <!-- 用来指定Mycat全局序列类型,0为本地文件,1为数据库方式,2为时间戳列方式,默认使用本地文件方式,文件方式主要用于测试-->
<property name="defaultMaxLimit">100</property><!-- mycat 默认返回的结果集大小-->
<property name="maxPacketSize">104857600</property><!-- 指定 Mysql 协议可以携带的数据最大长度。默认 16M。-->
</system>
<!--表示mycat的登录用户名-->
<user name="root">
<!--表示mycat的登录密码,密码加密:java -cp Mycat-server-xxx.jar io.mycat.util.DecryptUtil 0:user:password <property name="usingDecrypt">1</property> -->
<property name="password">123456</property>
<!--表示mycat的逻辑数据库名称,可以自定义-->
<property name="schemas">shop_db</property>
</user>
</mycat:server>

更多关于server.xml的配置可参考以下文章:

http://suo.im/6lJTHF http://suo.im/6lJTK5 http://suo.im/6613kS

schema.xml

作为MyCat中重要的配置文件之一,它主要管理着MyCat的逻辑库、表、分片规则、DataNode以及DataHost。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。

标签解析:

  • schema:配置逻辑库,与server.xml中的逻辑库要对应。

  • table:配置逻辑表,包含主键,自增在,位于哪个节点等。

  • dataNode :配置逻辑库与物理库的对应关系

  • dataHost :配置连接数据库主机信息。

更多详细可以参考配置文件说明:

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">     
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 定义逻辑库,name属性是指逻辑库,sqlMaxLimit限制返回的行数,checkSQLschema默认是false,判断是否检查发给mycat的sql是否包含库名 -->
<schema name="shop_db" checkSQLschema="false" sqlMaxLimit="100">
<!-- 定义逻辑表,name属性定义逻辑表名称,dataNode表示数据所属逻辑节点,primaryKey定义逻辑表的主键,type表示逻辑表的类型,global为全局表,autoIncrement是指自动递增-->
<table name="region_info" dataNode="orddb,custdb,prodb" primaryKey="region_id" type="global"/>
<table name="order_cart" dataNode="orddb" primaryKey="cart_id"/>
<table name="order_customer_addr" dataNode="orddb" primaryKey="customer_addr_id"/>
<table name="order_detail" dataNode="orddb" primaryKey="order_detail_id"/>
<table name="order_master" dataNode="orddb01,orddb02,orddb03,orddb04" rule="order_master" primaryKey="order_id" autoIncrement="true"/>
<table name="customer_balance_log" dataNode="custdb" primaryKey="balance_id"/>
<table name="customer_inf" dataNode="custdb" primaryKey="customer_inf_id"/>
<table name="customer_level_inf" dataNode="custdb" primaryKey="customer_level"/>
<table name="customer_login" dataNode="custdb" primaryKey="customer_id"/>
<table name="customer_login_log" dataNode="custdb" primaryKey="login_id"/>
<table name="customer_point_log" dataNode="custdb" primaryKey="point_id"/>
<table name="product_brand_info" dataNode="prodb" primaryKey="brand_id"/>
<table name="product_category" dataNode="prodb" primaryKey="category_id"/>
<table name="product_comment" dataNode="prodb" primaryKey="comment_id"/>
<table name="product_info" dataNode="prodb" primaryKey="product_id"/>
<table name="product_supplier_info" dataNode="prodb" primaryKey="supplier_id"/>
</schema>
<!-- 定义数据存储的物理位置,dataHost指逻辑主机,database为物理数据库的名称-->
<dataNode name="orddb" dataHost="mysql10" database="order_db"/>
<dataNode name="custdb" dataHost="mysql11" database="customer_db"/>
<dataNode name="prodb" dataHost="mysql12" database="product_db"/>
<dataNode name="orddb01" dataHost="mysql10" database="orddb01"/>
<dataNode name="orddb02" dataHost="mysql10" database="orddb02"/>
<dataNode name="orddb03" dataHost="mysql11" database="orddb01"/>
<dataNode name="orddb04" dataHost="mysql12" database="orddb01"/>
<dataNode name="mycat" dataHost="mysql10" database="mycat"/>

<!-- 定义后端数据库主机信息;balance=3指所有的读操作都只发送到writeHost的readHost上;writeType=“0”, 所有写操作都发送到可用的writeHost上;switchType='1' 默认值,表示自动切换-->
<dataHost balance="3" maxCon="1000" minCon="10" name="mysql10" writeType="0" switchType="1" dbType="mysql" dbDriver="native">
<!--检查后端数据库是否可用 -->
<heartbeat>select user()</heartbeat>
<!-- writeHost指定写实例、readHost指定读实例-->
<writeHost host="192.168.56.10" url="192.168.56.10:3306" password="123456" user="im_mycat"/>
</dataHost>
<dataHost balance="3" maxCon="1000" minCon="10" name="mysql11" writeType="0" switchType="1" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.56.11" url="192.168.56.11:3306" password="123456" user="im_mycat"/>
</dataHost>
<dataHost balance="3" maxCon="1000" minCon="10" name="mysql12" writeType="0" switchType="1" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.56.12" url="192.168.56.12:3306" password="123456" user="im_mycat"/>
</dataHost>
</mycat:schema>

关于更多ER图关系配置和其他参数意义。可参考以下文件或者《mycat权威指南》

rule.xml

它的功能主要体现在以下两个方面:

  • 1、配置水平分片的分片规则

  • 2、配置分片规则所对应的分片函数

1     
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">     
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="order_master"> <!-- 与schema.xml的table标签中的rule对应关系-->
<rule>
<columns>customer_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">4</property>
</function>
</mycat:rule>

其中的function的name必须是唯一的,以上就是hash取模4的分片算法。

常见的分片算法:

  • 简单取模-PartitionByMod
  • 哈希取模-PartitionByHashMod
  • 分片枚举-PartitionByFileMap
  • 字符串范围取模分片

参考

声明

本文属于转载: 原文(一篇秒懂mycat)

相关 [mycat] 推荐:

MyCat集群部署(HAProxy + MyCat)

- - 行业应用 - ITeye博客
参考实战视频: http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53. 《高可用架构篇--第13节--MySQL源码编译安装(CentOS-6.6+MySQL-5.6)》. 《高可用架构篇--第14节--MySQL主从复制的配置(CentOS-6.6+MySQL-5.6)》.

Mycat 入门

- - 数据库 - ITeye博客
MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之. 于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显. 这篇文章主要是MyCAT的入门部署. 因Mycat是用java开发的,所以需要在实验环境下安装java,官方建议jdk1.7及以上版本.

秒懂mycat

- - arccode
阿里开源的一个数据库中间件,专门为大数据量的项目做分库分表用的. 一个彻底开源的,面向企业应用开发的大数据库集群. 支持事务、ACID、可以替代MySQL的加强版数据库. 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群. 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server.

Mycat之——Mycat集群部署(基于HAProxy + Mycat)

- - CSDN博客推荐文章
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/75331934. 操作系统:CentOS-6.5-x86_64. JDK版本:jdk1.7.0_80. HAProxy版本:haproxy-1.5.19.tar.gz. Mycat版本:Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz (自行下载源码编译).

mycat 数据库中间件

- - Oracle - 数据库 - ITeye博客
出处:http://blog.csdn.net/nxw_tsp/article/details/56277430. 实习的时候,在一个项目当中,项目经理要求把原先的MySQL数据连接基于mycat来进行改造. 当时就在想MyCat是什么东西. MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里.

MySQL HA Solution 2019(3)MyCat

- - 企业架构 - ITeye博客
0  . 0  .       .

MySQL分布式中间件:MyCAT

- - 标点符
随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上. 这时集中式数据库系统表现出它的不足:. 集中式处理,势必造成性能瓶颈;. 应用程序集中在一台计算机上运行,一旦该计算机发生故障,则整个系统受到影响,可靠性不高;. 集中式处理引起系统的规模和配置都不够灵活,系统的可扩充性差.

Mycat 设置全局序列号

- - 数据库 - ITeye博客
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一. 为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式. 原理:此方式MyCAT将sequence配置到文件中,当使用到sequence中的配置后,MyCAT会更下classpath中的sequence_conf.properties文件中sequence当前的值.

【Mycat 1.6 之路由与分发流程】

- - ITeye博客
一、Mycat 的路由与分发流程. 从原理上来看,可以把 mycat 看成一个 sql 转发器. mycat 接收到前端发来的 sql,然后转发到后台的 mysql 服务器上去执行. 但是后面有很多台 mysql 节点(如 dn1,dn2,dn3),该转发到哪些节点呢. 路由能保证 sql 转发到正确的节点.

MyCat 数据库实践注意事项

- - 掘金后端
最近两周研究了一下 MyCat ,下载了一份官方的实践指南,搜了几篇部署介绍,启动了三个虚拟机节点,然后就开始了验证过程. 毕竟不是专业 DBA,我的首要目标是弄清楚如何部署,产品从普通 MySQL 数据库迁移到 MyCat 需要注意的事项. 抓主要矛盾,了解关键技术点,解决关键疑惑,有一本书叫《关键20小时,快速学会任何技能》,跟它的核心思想类似.