ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Mycat核心概念

2021-04-12 15:56:27  阅读:150  来源: 互联网

标签:核心 数据库 分片 Mycat 概念 标签 节点 属性


Mycat的核心概念如图
Mycat核心概念
(1)逻辑库(schema)
Mycat作为一个中间件,实现MySQL协议,对前端应用连接来说就是一个数据库,无须让开发人员知道
中间件存在,所以数据库中间件可以被当作一个或多个数据库集群构成的逻辑库。
(2)逻辑表(table)
有逻辑库,就会有逻辑表。在分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表可以
是数据切分后分布在一个或多个分片库中,也可以不做数据切分,不分片,只由一个表构成。
(3)分片表
分片表是指那些原有的拥有很多数据、需要切分到多个数据库的表。每个分片都有一部分数据,所有
分片构成了完整的数据。
(4)非分片表一个数据库中并不是所有的表都很大,某些表是可以不进行切分的。非分片表是相对分片表来说的,
就是那些不需要进行数据切分的表。
(5)ER表
关系型数据库是基于实体关系模型(Entity-Relationship Model)之上的,描述了真实世界中的事
物与关系。Mycat中的ER表就来源于此。根据这一思路,提出了基于E-R关系的数据分片策略,子表的记录
与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group)保证数
据join关联查询不会跨库操作。表分组(Table Group)是解决跨分片数据join关联查询的一种很好的解
决方法,也是数据切分规划很重要的一条原则。
(6)全局表
在业务系统中,往往存在大量类似字典表的表,基本上很少变动。字典表的特性是:变动不频繁;数
据量总体变化不大;数据规模不大,很少有超过数十万条记录的。当业务表因为数据量规模大而进行分片
以后,业务表与这些附属的字典表之间的关联就成了比较棘手的问题,所以Mycat中通过数据冗余来解决
这类表的join关联查询,即所有的分片都有一份数据的备份,所有将字典表或者符合字典表特性的一些表
定义为全局表。数据冗余是解决跨分片数据join关联查询的一种很好的解决方法,也是数据切分规划的另
外一条重要原则。
(7)分片节点(dataNode)
数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点。
(8)节点主机(dataHost)
数据切分后,每个分片节点不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一
个或多个分片节点所在的机器就是节点主机。为了规避单节点主机并发数限制,尽量将读写压力高的分片
节点均衡地放在不同的节点主机上。
(9)分片规则(rule)
前面讲了数据切分,一个大表会被分成若干个分片表。按照某种业务规则把数据分到某个分片的规则
就是分片规则。数据切分时选择合适的分片规则非常重要,将极大地避免后续数据处理的难度。
(10)全局序列号(sequence)
数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保
证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号。

Mycat配置文件详解
Mycat通常默认以本地加载XML的方式启动。在Mycat文件的目录中,conf目录存放关于Mycat的配置文
件,主要3个需要熟悉:server.xml是Mycat服务器参数调整和用户授权的配置文件;schema.xml是逻辑库
定义以及表和分片定义(如分片节点、分片主机等)的配置文件;rule.xml是分片规则的配置文件(分片
规则的一些具体参数信息单独存放为文件)。配置文件修改需要重启Mycat或者通过MySQL命令行登录9066
管理端口执行reload命令来更新。
1.schema标签
<schema name=A04-"TESTDB" checkSQLschema="false" sqlMaxLimit="10">
</schema>
schema标签用来定义Mycat实例中的逻辑库。Mycat可以有多个逻辑库,每个逻辑库都有自己的相关配
置,可以使用schema标签来划分这些不同的逻辑库。如果不配置schema标签,所有表的配置会属于同一个
默认的逻辑库。逻辑库的概念和MySQL中database的概念一样,在查询两个不同逻辑库中的表时,需要切
换到该逻辑库下进行。
(1)name="TESTDB"是逻辑数据库名,与server.xml配置文件中的schema对应。
(2)当checkSQLschema属性值为true时,Mycat会把schema字符去掉。例如,执行语句select
from TESTDB.company,Mycat会把SQL语句修改为select
from company,去掉TESTDB。(3)当sqlMaxLimit属性值设置为某个数值时,若每条执行的SQL语句没有加上limit语句,则Mycat
会自动在limit语句后面加上对应的数值。
2.table标签
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
(1)name属性定义的是逻辑表名。
(2)dataNode表示存储到哪些节点,多个节点用逗号分隔。节点与下文dataNode标签设置的name属
性值是对应的。
(3)primaryKey属性是逻辑表对应真实表的主键字。例如,分片的规则是使用非主键进行分片的,
那么在使用主键查询的时候就会发送查询语句到所有配置的DN上;如果使用该属性配置真实表的主键,那
么Mycat会缓存主键与具体DN的信息,再次使用非主键进行查询的时候就不会进行广播式的查询,而是直
接发送语句给具体的DN,但是尽管配置该属性,如果缓存并没有命中,还是会发送语句给具体的DN来获取
数据。
(4)rule属性定义逻辑表要使用的分片规则名,规则的名字在rule.xml中定义。
(5)type属性定义逻辑表的类型,目前逻辑表只有全局表和普通表。type的值是global时代表全局
表,不指定global的所有表都为普通表。
3.childTable标签
<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
<childTable name="c_a" primaryKey="ID" joinKey="customer_id" parentKey="id" />
</table>
childTable标签用于定义E-R分片的子表。通过标签上的属性与父表进行关联。
(1)name属性:定义子表的名称。
(2)joinKey属性:子表中字段的名称,插入子表时会使用这个值查找父表存储的数据节点。
(3)parentKey属性:父表中字段的名称。childTable的joinKey会按照父表的parentKey的策略一起
切分,当父表与子表进行连接且连接条件是childtable.joinKey=parenttable.parentKey时,不会进行跨
库的连接。
4.dataNode标签<dataNode name="dn1" dataHost="localhost1" database="db1" />
dataNode标签定义了Mycat中的数据节点,也就是我们所说的数据分片。一个dataNode标签就是一个
独立的数据分片。上述例子表述的意思是使用名字为localhost1数据库实例上的db1物理数据库,组成一
个数据分片,最后用dn1来标识这个分片。
(1)name属性定义数据节点的名字,唯一,在table标签上用来建立表与分片对应的关系。
(2)dataHost属性用于定义该分片属于哪个数据库实例,属性与dataHost标签上定义的name对应。
(3)database用于定义该分片属于数据库实例上的哪个具体库。
5.dataHost标签
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbD
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.1.100:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.1.101:3306" user="root" password="123456" />
</writeHost>
</dataHost>
这个标签直接定义了具体数据库实例、读写分离配置和心跳语句。
(1)name属性用来唯一标示dataHost标签,供上层使用。
(2)maxCon属性指定每个读写实例连接池的最大连接。
(3)minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小。
(4)balance属性为负载均衡类型。
balance="0":不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
balance="1":全部的readHost与stand by writeHost参与select语句的负载均衡。简单地说,在
双主双从模式(M1-S1,M2-S2并且M1 M2互为主备)正常的情况下,M2、S1、S2都参与select语句
的负载均衡。
balance="2":所有读操作都随机地在writeHost、readHost上分发。
balance="3" ( 1.4 之 后 版 本 有 ) : 所 有 读 请 求 随 机 地 分 发 到 writeHost 对 应 的 readHost 执 行 ,
writeHost不负担读写压力。
(5)writeType表示负载均衡类型。writeType="0":所有写操作发送到配置的第一个writeHost,第一个挂了切到生存着的第二个
writeHost,重新启动后以切换后的为准,切换记录在配置文件dnindex.properties中。
writeType="1":所有写操作都随机地发送到配置的writeHost中。1.5以后版本废弃,不推荐。
(6)switchType属性:是否自动切换。
-1:不自动切换。
1:默认值,自动切换。
2:基于MySQL主从同步的状态决定是否切换,心跳语句为show slave status。
3 : 基 于 MySQL galary cluster 的 切 换 机 制 ( 适 合 集 群 ) , 心 跳 语 句 为 show status like
'wsrep%'。
(7)dbType指定后端连接的数据库类型目前支持二进制的MySQL协议,还有其他使用JDBC连接的数据
库,例如MongoDB、Oracle、Spark等。
(8)dbDriver指定连接后端数据库使用的driver,目前可选的值有native和JDBC。使用native的
话,因为这个值执行的是二进制的MySQL协议,所以可以使用MySQL和maridb;其他类型的则需要使用JDBC
驱动来支持。使用JDBC的话,需要将符合JDBC4标准的驱动jar放到mycat\lib目录下。
(9)如果配置了tempReadHostAvailable属性,writeHost下面的readHost仍旧可用,默认为0,可配
置值为0、1。
6.heartbeat标签
这个标签内指明用于和后端数据库进行心跳检查的语句,例如MySQL可以使用select user()。
7.writeHost /readHost标签
这两个标签都指定后端数据库的相关配置,用于实例化后端连接池。唯一不同的是,writeHost指定
写实例、readHost指定读实例。在一个dataHost内可以定义多个writeHost和readHost。如果writeHost指
定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另外,一个writeHost宕机
后,系统会自动检测到,并会切换到备用的writeHost上去。
这两个标签的属性相同,下面一起介绍:
属性host:用于标识不同实例,一般writeHost使用M1、readHost使用S1。
属性url:后端实例连接地址,格式为“Native:地址:端口JDBC:jdbc的url”。
属性名password:后端存储实例需要的密码。
属性名user:后端存储实例需要的用户名字。
属性名weight:权重,配置在readhost中作为读节点的权重。
属性名usingDecrypt:是否对密码加密,默认为0。
13.4.2 server.xml
server.xml包含了Mycat的系统配置信息,是Mycat服务器参数调整和用户授权的配置文件。它有两个
重要的标签,分别是user、system。
1.user标签<user name="test">
<property name="password">test123</property>
<property name="schemas">TESTDB</property>
<property name="readonly">TESTDB</property>
<property name="benchmark">1000</property>
<property name="usingDecrypt">0</property>
</user>
user标签主要用于定义登录Mycat的用户和权限,如这里定义的登录的用户名为test,也就是连接
Mycat的用户名,连接Mycat的密码是test123,可以访问的schema只有TESTDB。要在schema.xml中定义逻
辑库TESTDB,则TESTDB必须先在server.xml中定义,否则该用户将无法访问TESTDB。这里用readonly的值
(true或false)来限制用户的读写权限;通过设置benchmark属性的值来限制前端的整体连接数量;通过
设置usingDecrypt属性的值来开启密码加密功能(默认值为0,表示不开启加密;值为1表示开启加密,同
时使用加密程序对密码加密)。
2.privileges标签
对用户的schema以及表进行精细化的DML权限控制:
<privileges check="false">
</privileges>
(1)check属性表示是否开启DML权限检查,默认是关闭。
(2)DML顺序说明:insert、update、select、delete。
<schema name="db1" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
其中,db1的权限是update、select,tb01的权限是什么都不能干,tb02的权限是insert、update、
select、delete,其他表默认是update、select。
3.system标签
这个标签内嵌套的所有property标签都与系统配置有关。
(1)charset属性<property name="charset">utf8</property>配置字符集,一定要保证Mycat字符集与数据库字符集
的一致性。
(2)processors属性
<property name="processors">1</property>设置处理线程数量,默认是CPU核心×每个核心运行线
程的数量。
(3)processorBufferChunk属性
<property name="processorBufferChunk">4096</property>表示每次读取流的数量,默认为4096。
(4)processorBufferPool属性
<property name="processorBufferPool">409600</property>表示创建共享buffer需要占用的总空间
大小。
(5)maxPacketSize属性
<property name="maxPacketSize">16M</property>指定MySQL协议可以携带的数据的最大长度,默认
为16MB。
(6)idleTimeout属性
<property name="idleTimeout">1800000</property>指定连接的空闲超时时间,默认为30分钟,单
位是毫秒。如果某连接在发起空闲检查下发现距离上次使用超过了空闲时间,那么这个连接会被回收,就
是被直接关闭掉。
(7)txIsolation属性
<property name="txIsolation">3</property>设置前端连接的初始化事务隔离级别,只在初始化的
时候使用,后续会根据客户端传递过来的属性对后端数据库连接进行同步,默认为REPEATED_READ,设置
值为数字时默认为3。
READ_UNCOMMITTED=1;
READ_COMMITTED=2;
REPEATED_READ=3;
SERIALIZABLE=4;
(8)sqlExecuteTimeout属性
<property name="sqlExecuteTimeout">300</property> 定 义 SQL 执 行 超 时 的 时 间 , 默 认 时 间 为 300
秒,单位为秒。Mycat会检查连接上最后一次执行SQL的时间,若超过这个时间则会直接关闭连接。
(9)serverPort属性<property name="serverPort">8066</property>定义Mycat的使用端口,默认值为8066。
(10)managerPort属性
<property name="managerPort">9066</property>定义Mycat的管理端口,默认值为9066。
以上列举的属性仅仅是一部分,可以配置的变量很多。system标签下的属性一般是在上线后根据实际
运行的情况分析调优时进行修改。
4.firewall标签
这个标签用于防火墙的设置,就是在网络层对请求的地址进行限制,主要是从安全角度来保证Mycat
不被匿名IP进行访问。
<firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
设置很简单,很容易理解:开启防火墙,只有白名单(设置了白名单)的连接才可以进行连接。
13.4.3 rule.xml
rule.xml是分片规则的配置文件,定义了对表进行拆分所涉及的规则定义。我们可以灵活地对表使用
不同的分片算法,或者对表使用相同的算法但具体的参数不同。包含的标签有function和tableRule。
1.function标签
<function name="rang-mod" class="org.opencloudb.route.function.PartitionByRangeMod">
<property name="mapFile">partition-hash-int.txt</property>
</function>
name属性指定算法的名字。
class属性对应具体的分片算法,需要指定算法具体的类名字。
property属性根据算法的要求指定,为具体算法需要用到的一些属性。
2.tableRule标签
这个标签定义表规则。<tableRule name="auto-sharding-rang-mod">
<rule>
<columns>id</columns><algorithm>rang-mod</algorithm>
</rule>
</tableRule>
name属性指定分片唯一算法的名称,用于标识不同的表规则。
内嵌的rule标签指定对物理表中的哪一列进行拆分和使用什么路由算法。
columns内指定要拆分的列名字。algorithm指定实现算法的名称,对应的是function标签中的name属
性。连接表规则和具体路由算法。多个表规则可以连接到同一个路由算法上。
3.分片策略
简单来说,我们可以将数据的水平切分理解为是按照数据行切分,就是将表中的某些行切分到一个数
据库、另外的某些行切分到其他数据库中。其中,选择合适的切分策略至关重要,因为它决定了后续数据
聚合的难易程度。典型的分片策略包括:按照用户主键ID求模,将数据分散到不同的数据库,具有相同数
据用户的数据都被分散到一个库中;按照日期将不同月甚至日的数据分散到不同的库中;按照某个特定的
字段求摸,或者根据特定范围段分散到不同的库中。
Mycat的分片策略很丰富,是超出预期的,也是Mycat的一大亮点。大体分片规则(还有一些其他分片
方式,这里不全部列举)如下:
(1)取模分片:mod-long,根据id进行十进制求模计算。
(2)分片枚举:sharding-by-intfile,通过在配置文件中配置可能的枚举id来指定数据分布到不同
物理节点上。
(3)范围分片:auto-sharding-long,适用于明确知道分片字段的某个范围属于哪个分片。
(4)范围求模算法:先进行范围分片,计算出分片组,组内再求模,综合了范围分片和求模分片的
优点。
(5)字符串hash解析算法:sharding-by-stringhash ,截取字符串中的int数值hash分片。
(6)按日期(天)分片:sharding-by-date,除了columns标识将要分片的表的字段,sBeginDate为
开始日期,sEndDate为结束日期。如果配置了sEndDate,则代表数据达到了这个日期的分片后会重复从开
始分片插入。
(7)按单月小时拆分:sharding-by-hour,表示单月内按照小时拆分,最小粒度是小时,一天最多
可以有24个分片,最少1个分片,下个月从头开始循环,每个月末需要手动清理数据。
(8)自然月分片:sharding-by-month,使用场景为按月份列分区,每个自然月一个分片。(9)日期范围hash算法:思想方法与范围求模一致,由于日期取模的方法会出现数据热点问题,因
此先根据日期分组再根据时间hash,使得短期内数据分布得更均匀。
4.分片策略使用示例
(1)分片策略使用示例一
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
定义分片策略rule1,该策略对分表的id进行mod2除法,对模2算法的结果进行分库。
(2)分片策略使用示例二
要求部门号为10的数据被分发到第一个节点中、部门号为20的数据被分发到第二个节点中、部门号为
30的数据被分发到第三个节点中,需定义3个值,分片规则均是在rule.xml中定义。
首先定义规则tableRule标签:
<tableRule name="sharding-by-intfile-TESTDB-employee">
<rule>
<columns>deptno</columns>
<algorithm>hash-int-TESTDB-employee</algorithm>
</rule>
</tableRule>
接着定义规则function标签:
<function name="hash-int-TESTDB-employee" class="org.opencloudb.route.function.PartitionByFileMap"
<property name="mapFile">partition-hash-int-TESTDB-employee.txt</property>
<property name="type">0</property>
<property name="defaultNode">0</property>
</function>这里type默认值为0(0表示Integer,非零表示String)。defaultNode表示默认节点,小于0时不设
置默认节点,大于等于0时设置默认节点。默认节点的作用是在枚举分片时碰到不识别的枚举值就路由到
默认节点。如果不配置默认节点,碰到不识别的枚举值就会报错。
最后创建规则文件partition-hash-int-TESTDB-employee.txt。在conf目录路径下创建该文件,定义
枚举的规则,内容如下:
10=0
20=1
30=2

标签:核心,数据库,分片,Mycat,概念,标签,节点,属性
来源: https://blog.51cto.com/u_13810716/2701502

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有