文章目录
  1. 1. Mycat安装
  2. 2. Mycat 配置说明
  3. 3. Mycat启动

按照上一章步骤搭建完mysql的集群,且验证主从复制没有问题,本篇来安装mycat

先理解下面几个概念:

  • 垂直分表:将一个表按照字段分成多表,每个表存储其中一部分字段。

  • 垂直分库:是指按照业务将表进行分类,分布到不同的数据库上面,每个库可以放在不同的服务器上,它的核心理念是专库专用。

  • 水平分库:是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。
  • 水平分表:是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中。

Mycat安装

下载安装包地址:http://dl.mycat.org.cn

下载完解压缩到:/usr/local/mycat 目录即可

Mycat 配置说明

  1. Schema.xml
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
Schema.xml 作为 MyCat中重要的配置文件之一,管理着 MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提。

schema 标签

该标签用于定义MyCat实例中的逻辑库,MyCat可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分这些不同的逻辑库。

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="tableName" primaryKey="id" dataNode="dn1,dn2" rule="rule1"/>
</schema>

相关属性
dataNode :字符串,分片节点名称,多个以","号分隔

checkSQLschema :布尔类型,当该值设置为 true 时,如果我们执行语句**select * from TESTDB.travelrecord;**则MyCat 会把语句修改为**select * from travelrecord;**。即把表示schema的字符去掉,避免发送到后端数据库执行时报**(ERROR 1146 (42S02): Table 'testdb.travelrecord' doesn't exist)。** 不过,即使设置该值为 true ,如果语句所带的是并非是schema指定的名字,例如:**select * from db1.travelrecord;** 那么MyCat并不会删除db1这个字段,如果没有定义该库的话则会报错,所以在提供SQL语句的最好是不带这个字段。

sqlMaxLimit :int 类型,表示每条执行的SQL语句,如果没有加上limit语句,MyCat也会自动的加上所对应的值。例如设置值为100,执行**select * from TESTDB.travelrecord;**的效果为和执行**select * from TESTDB.travelrecord limit 100;**相同。 设置该值的话,MyCat默认会把查询到的信息全部都展示出来,造成过多的输出。所以,在正常使用中,还是建议加上一个值,用于减少过多的数据返回。 当然SQL语句中也显式的指定limit的大小,不受该属性的约束。 需要注意的是,如果运行的 schema为非拆分库的,那么该属性不会生效。需要手动添加limit语句。

table 标签

该标签属于 schema 的子标签,用于定义了MyCat中的逻辑表,所有需要拆分的表都需要在这个标签中定义。

相关属性
name:定义逻辑表的表名,这个名字就如同我在数据库中执行create table命令指定的名字一样,同个schema标签中定义的名字必须唯一。

dataNode:定义这个逻辑表所属的dataNode, 该属性的值需要和dataNode标签中name 属性的值相互对应。

rule:该属性用于指定逻辑表要使用的规则名字,规则名字在rule.xml中定义,必须与tableRule标签中name属性属性值一一对应

ruleRequired :该属性用于指定表是否绑定分片规则,如果配置为true,但没有配置具体rule的话 ,程序会报错

type:该属性定义了逻辑表的类型,目前逻辑表只有"全局表"和"普通表"两种类型。对应的配置:
全局表:global
普通表:不指定该值为globla的所有表

needAddLimit :指定表是否需要自动的在每个语句后面加上limit限制,这个属性默认为 true

primaryKey :该逻辑表对应真实表的主键,例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的 DN上,如果使用该属性配置真实表的主键。难么MyCat会缓存主键与具体DN 的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的 DN,但是尽管配置该属性,如果缓存并没有命中的话,还是会发送语句给具体的 DN,来获得数据。

autoIncrement :mysql对非自增长主键,使用last_insert_id()是不会返回结果的,只会返回0。所以,只有定义了自增长主键的表才可以用last_insert_id()返回主键值。 mycat目前提供了自增长主键功能,但是如果对应的 mysql节点上数据表,没有定义auto_increment,那么在mycat层调用last_insert_id()也是不会返回结果的。 由于insert操作的时候没有带入分片键,mycat会先取下这个表对应的全局序列,然后赋值给分片键。这样才能正常的插入到数据库中,最后使用last_insert_id()才会返回插入的分片键值。 如果要使用这个功能最好配合使用数据库模式的全局序列。
使用autoIncrement="true" 指定这个表有使用自增长主键,这样mycat才会不抛出分片键找不到的异常。
使用 autoIncrement="false" 来禁用这个功能,当然你也可以直接删除掉这个属性。默认就是禁用的。

subTables :配置分表规则,并且在分表条件下,只能配置一个 dataNode,并且分表条件下不支持各种条件的 join 语句。配置实例如: subTables="t_order$1-2,t_order3" ,
分库模式下是:insert into table(xxx)values(1,name);
router:{
node1:insert into table(xxx)values(1,name) ,datanode1,
node2:insert into table(xxx)values(2,name) ,datanode2,
node3:insert into table(xxx)values(3,name) ,datanode3,
},
分表模式是: insert into table(xxx)values(1,name);
router:{
node1:insert into table1(xxx)values(1,name) ,datanode1,
node2:insert into table2(xxx)values(2,name) ,datanode1,
node3:insert into table3(xxx)values(3,name) ,datanode1,
},

childTable 标签

该标签属于 table 的子标签,该标签用于定义E-R分片的子表,通过标签上的属性与父表进行关联。

相关属性
name :定义子表的表名

joinKey :插入子表的时候会使用这个列的值查找父表存储的数据节点。

parentKey :属性指定的值一般为与父表建立关联关系的列名。

primaryKey :该逻辑表对应真实表的主键,例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的 DN上,如果使用该属性配置真实表的主键。难么MyCat会缓存主键与具体DN 的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的 DN,但是尽管配置该属性,如果缓存并没有命中的话,还是会发送语句给具体的 DN,来获得数据。

needAddLimit :指定表是否需要自动的在每个语句后面加上limit限制,这个属性默认为 true

dataNode 标签

dataNode 标签定义了 MyCat中的数据节点,也就是我们通常说所的数据分片。一个dataNode 标签就是一个独立的数据分片,比如我们要创建使用名字为lch3307数据库实例上的db1物理数据库,这就组成一个数据分片,最后,我们使用名字dn1标识这个分片,实例配置如下:

<dataNode name="dn1" dataHost="lch3307" database="db1"></dataNode>

相关属性
name :定义数据节点的名字,这个名字需要是唯一的,我们需要在 table标签上应用这个名字,来建立表与分片对应的关系。

dataHost :该属性用于定义该分片属于哪个数据库实例的,属性值是引用 dataHost标签上定义的name属性

database:该属性用于定义该分片属性哪个具体数据库实例上的具体库,因为这里使用两个纬度来定义分片,就是:实例+具体的库。因为每个库上建立的表和表结构是一样的。所以这样做就可以轻松的对表进行水平拆分。

dataHost标签

该标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语。

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- 可以有多个写入主机 -->
<!-- 第一个主机 -->
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<!-- balance=3 所有读请求使用该服务器执行,可以有多个读主机 -->
<readHost host="hostS1" url="localhost:3306" user="root" password="123456" />
</writeHost>
<!-- 第二个主机 -->
<writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/>
</dataHost>

相关属性
name :唯一标识dataHost 标签
maxCon:指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的 writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数
minCon :指定每个读写实例连接池的最小连接,初始化连接池的大小
balance:负载均衡类型,目前的取值有4 种:
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",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost 不负担读压力
dbType :指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用 JDBC连接的数据库。例如:mongodb、oracle、spark等。
dbDriver:指定连接后端数据库使用的Driver,目前可选的值有native和 JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql、maridb 和 postgresql(1.6版本),其他类型的数据库则需要使用 JDBC驱动来支持,如果使用JDBC的话需要将符合 JDBC 4标准的驱动JAR包放到 MYCAT\lib目录下,并检查驱动JAR包中包括如下目录结构的文件:META-INF\services\java.sql.Driver,在这个文件内写上具体的Driver 类名,例如:com.mysql.jdbc.Driver
switchType:主从数据库切换类型,目前的取值有4种:
-1 表示不自动切换
1 默认值,自动切换
2 基于MySQL主从同步的状态决定是否切换心跳语句为 show slave status
3 基于MySQL galary cluster的切换机制(适合集群)心跳语句为 show status like 'wsrep%'
tempReadHostAvailable:如果配置了这个属性writeHost 下面的readHost仍旧可用,默认0 可配置(0、1)

heartbeat标签

这个标签属于dataHost的子标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL可以使用select user(),Oracle可以使用select 1 from dual等。这个标签还有一个connectionInitSql 属性,主要是当使用Oracla数据库时,需要执行的初始化SQL语句就这个放到这里面来。例如:alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss' ,示例代码:
<heartbeat>select user()</heartbeat>

writeHost 和 readHost 标签

这两个标签都属于dataHost的子标签,用于指定后端数据库的相关配置给 mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。

相关属性
host:用于标识不同实例,一般writeHost我们使用*M1,readHost我们用*S1
url:后端实例连接地址,如果是使用native 的dbDriver,则一般为address:port 这种形式。用 JDBC或其他的
dbDriver,则需要特殊指定。当使用JDBC 时则可以这么写:jdbc:mysql://localhost:3306/

user:后端存储实例需要的用户名字
password :后端存储实例需要的密码
weight :权重,配置在readhost 中作为读节点的权重
usingDecrypt :是否对密码加密,默认否=0, 如需要开启配置=1,同时使用加密程序对密码加密,加密命令为:
# java -cp Mycat-server-1.6-RELEASE.jar io.mycat.util.DecryptUtil 1:host:user:password

其中 Mycat-server-1.6-RELEASE.jar 位于 mycat/lib 目录中,1:host:user:password,其中 1 表示 db端加密标识
  1. server.xml
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
server.xml 几乎保存了所有mycat需要的系统配置信息,包括 mycat 用户管理、DML权限管理等,其在代码内直接的映射类为SystemConfig 类。

user 标签

该标签主要用于定义登录 mycat的用户和权限。例如,我定义了一个用户,用户名为test、密码也为test,可访问的schema也只有TESTDB一个,示例代码如下:

<!-- 用户名称 -->
<user name="test">
<!-- 账户信息 -->
<!-- 用户密码 -->
<property name="password">test</property>
<!-- 逻辑数据库名称,存在多个则使用","号分隔 -->
<property name="schemas">TESTDB</property>
<!-- 只读 -->
<property name="readOnly">true</property>
<!-- 连接服务降级的基准连接数量 -->
<property name="benchmark">11111</property>
<!-- 是否对密码加密 -->
<property name="usingDecrypt">1</property>
<!-- 精细化DML权限控制 -->
<privileges check="false">
<schema name="TESTDB" dml="0010" showTables="custome/mysql">
<table name="tbl_user" dml="0110"></table>
<table name="tbl_dynamic" dml="1111"></table>
</schema>
</privileges>
</user>

相关属性
Benchmark:mycat 连接服务降级处理,当前端的整体 connection 数达到基准值时,对来自该账户的请求开始拒绝连接,0 或不设表示不限制
usingDecrypt:是否对密码加密默认0 否 如需要开启配置1,同时使用加密程序对密码加密,加密命令为:
# java -cp Mycat-server-1.6-RELEASE.jar io.mycat.util.DecryptUtil 0:user:password

其中 Mycat-server-1.6-RELEASE.jar 位于 mycat/lib 目录中,0:user:password,其中 0 表示 前端加密标识

privileges 标签

对用户的 schema 及 下级的 table 进行精细化的 DML 权限控制,privileges 节点中的 check 属性是用于标识是否开启 DML 权限检查, 默认false 标识不检查,当然 privileges 节点不配置,等同 check=false, 由于Mycat一个用户的schemas 属性可配置多个 schema ,所以 privileges 的下级节点 schema 节点同样可配置多个,对多库多表进行细粒度的DML 权限控制,在 schema 及 table 上设置 dml 字符串的规则时按照如下规则设置的,示例如下:

操作 DML权限示例 说明
insert,update,select,delete 0000 禁止增加、更新、查询和删除
insert,update,select,delete 0010 禁止增加、更新和删除,可以查询
insert,update,select,delete 1110 禁止删除,可以创建、更新和查询

如果设置了 schema 的 DML,而没有设置 table 的 DML,则自动继承 schema 的 DML 属性
  1. rule.xml
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
rule.xml 配置文件定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,

或者对表使用相同的算法但具体的参数不同。
tableRule 标签
该标签用于定义表的拆分规则,示例代码如下:

<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>

相关属性
name:指定唯一的表拆分规则的名称
columns:指定要拆分的列名字
algorithm:使用 function 标签中的 name 属性,用于连接表规则和具体的路由算法,多个表规则可以连接到一个路由算法。
function 标签

该标签用于定义具体的拆分路由算法,示例代码如下:

<function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>

相关属性
name:指定算法的名称,在文件中唯一
class:指定对应具体的分片算法的具体类
property:具体算法的必须参数
  1. Mycat 分片规则
    1)枚举分片
    2)范围分片
    3)取模分片
    4)ER关系表分片
    5)固定 hash 分片
    6)范围取模分片
    7)应用指定分片
    8)ASCII 取模范围分片
    9)取模范围分片
    10)自然月分片
    11)日期(天)分片
    12)单月小时分片
    13)日期范围 hash 分片
    14)一致性hash分片

详解参考地址:https://www.cnblogs.com/li3807/category/1165516.html

Mycat启动

1
2
3
./mycat console
或者
./mycat start
文章目录
  1. 1. Mycat安装
  2. 2. Mycat 配置说明
  3. 3. Mycat启动