SUSE12SP3-Mycat(2)Schema.xml配置详解

简介

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

schema 标签

schema 标签用于定义 MyCat 实例中的逻辑库,如:java

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"></schema>

name属性

配置逻辑库的名字(即数据库实例名);node

dataNode属性

用于配置该逻辑库默认的分片。没有经过table标签配置的表,就会走到默认的分片上。这里注意没有配置在table标签的表,用工具查看是没法显示的,可是能够正常使用。mysql

若是没有配置dataNode属性,则没有配置在table标签的表,是没法使用的。注意,dual表在mycat中,也被视为一个表。
另外,经过mycat建表,而该表并无提早配置table标签,则mycat会找到默认的dataNode,并把表建在默认的dataNode上。若是没有配置默认dataNode,则mycat会报错。
而若是该表有配置table标签,则表会分别在table标签指定的dataNode上建表。sql

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
语句的最好是不带这个字段。mongodb

false:会报错数据库

sqlMaxLimit属性

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

table 标签

<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" ></table>

name 属性

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

dataNode 属性

定义这个逻辑表所属的 dataNode, 该属性的值须要和 dataNode 标签中 name 属性的值相互对应。若是需
要定义的 dn 过多 可使用以下的方法减小配置:
```xml
<table name="travelrecord" dataNode="multipleDn$0-99,multipleDn2$100-199" rule="auto-shardinglong" ></table>

<dataNode name="multipleDn$0-99" dataHost="localhost1" database="db$0-99" ></dataNode>

<dataNode name="multipleDn2$100-199" dataHost="localhost1" database=" db$100-199" ></dataNode>

```
这里须要注意的是 database 属性所指定的真实 database name 须要在后面添加一个,例如上面的例子中,
我须要在真实的 mysql 上创建名称为 dbs0 到 dbs99 的 database。

rule 属性

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

ruleRequired 属性

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

primaryKey 属性

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

type 属性

该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型。对应的配置:

全局表:global。

普通表:不指定该值为 globla 的全部表。

autoIncrement 属性

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

subTables

使用方式添加 subTables="t_order$1-2,t_order3"。
目前分表 1.6 之后开始支持 而且 dataNode 在分表条件下只能配置一个,分表条件下不支持各类条件的join 语句。缓存

needAddLimit 属性

指定表是否须要自动的在每一个语句后面加上 limit 限制。因为使用了分库分表,数据量有时会特别巨大。这时候执行查询语句,若是恰巧又忘记了加上数量限制的话。那么查询全部的数据出来,也够等上一小会儿的。
因此,mycat 就自动的为咱们加上 LIMIT 100。固然,若是语句中有 limit,就不会在次添加了。这个属性默认为 true,你也能够设置成 false`禁用掉默认行为。session

childTable 标签

childTable 标签用于定义 E-R 分片的子表。经过标签上的属性与父表进行关联。
childTable 标签的相关属性:

属性名 数量限制
name String (1)
joinKey String (1)
parentKey String (1)
primaryKey String (0..1)
needAddLimit boolean (0..1)

name 属性

定义子表的表名。

joinKey 属性

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

parentKey 属性

属性指定的值通常为与父表创建关联关系的列名。程序首先获取 joinkey 的值,再经过 parentKey 属性指定的列名产生查询语句,经过执行该语句获得父表存储在哪一个分片上。从而肯定子表存储的位置。

primaryKey 属性

同 table 标签所描述的。

needAddLimit 属性

同 table 标签所描述的。

dataNode 标签

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

dataNode 标签订义了 MyCat 中的数据节点,也就是咱们一般说所的数据分片。一个 dataNode 标签就是
一个独立的数据分片。
例子中所表述的意思为:使用名字为 lch3307 数据库实例上的 db1 物理数据库,这就组成一个数据分片,最后,咱们使用名字 dn1 标识这个分片。
dataNode 标签的相关属性:

属性 数量限制
name String (1)
dataHost String (1)
database String (1)

name 属性

定义数据节点的名字,这个名字须要是惟一的,咱们须要在 table 标签上应用这个名字,来创建表与分片对应的关系。

dataHost 属性

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

database 属性

该属性用于定义该分片属性哪一个具体数据库实例上的具体库,由于这里使用两个纬度来定义分片,就是:实 例+具体的库。由于每一个库上创建的表和表结构是同样的。因此这样作就能够轻松的对表进行水平拆分。

dataHost 标签

做为 Schema.xml 中最后的一个标签,该标签在 mycat 逻辑库中也是做为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。如今咱们就解析下这个标签。

dataHost 标签的相关属性:

属性名 数量限制
name String (1)
maxCon Integer (1)
minCon Integer (1)
balance Integer (1)
writeType Integer (1)
dbType String (1)
dbDriver String (1)

name 属性

惟一标识 dataHost 标签,供上层的标签使用。

maxCon 属性

指定每一个读写实例链接池的最大链接。也就是说,标签内嵌套的 writeHost、readHost 标签都会使用这个属性的值来实例化出链接池的最大链接数。

minCon 属性

指定每一个读写实例链接池的最小链接,初始化链接池的大小。

balance 属 性

负载均衡类型,目前的取值有 3 种:

  • 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 不负担读压力,注意 balance=3 只在 1.4 及其之后版本有,1.3 没有。

writeType 属性

负载均衡类型,目前的取值有 3 种:

writeType="0", 全部写操做发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,从新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .

writeType="1",全部写操做都随机的发送到配置的 writeHost,1.5 之后废弃不推荐。

switchType 属性

  • -1 表示不自动切换。
  • 1 默认值,自动切换。
  • 2 基于 MySQL 主从同步的状态决定是否切换。

dbType 属性

指定后端链接的数据库类型,目前支持二进制的 mysql 协议,还有其余使用 JDBC 链接的数据库。例如:
mongodb、oracle、spark 等。

dbDriver 属性

指定链接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,由于这个值执行的是二进制的 mysql 协议,因此可使用 mysql 和 maridb。其余类型的数据库则须要使用 JDBC 驱动来支持。
从 1.6 版本开始支持 postgresql 的 native 原始协议。
若是使用 JDBC 的话须要将符合 JDBC 4 标准的驱动 JAR 包放到 MYCAT\lib 目录下,并检查驱动 JAR 包中包括以下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:
com.mysql.jdbc.Driver。

switchType 属性

-1 表示不自动切换
1 默认值,自动切换
2 基于 MySQL 主从同步的状态决定是否切换心跳语句为 show slave status
3 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1) 心跳语句为 show status like ‘wsrep%’

tempReadHostAvailable 属性

若是配置了这个属性 writeHost 下面的 readHost 仍旧可用,默认 0 可配置(0、1)。

heartbeat 标签

这个标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL 可使用 select user(),Oracle 可使用 select 1 from dual 等。
这个标签还有一个 connectionInitSql 属性,主要是当使用 Oracla 数据库时,须要执行的初始化 SQL 语句就这个放到这里面来。例如:alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'
1.4 主从切换的语句必须是:show slave status

writeHost 标签、readHost 标签

这两个标签都指定后端数据库的相关配置给 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 中做为读节点的权重(1.4 之后)。

usingDecrypt 属性

是否对密码加密默认 0 否 如须要开启配置 1,同时使用加密程序对密码加密,加密命令为: 执行 mycat jar 程序(1.4.1 之后):


http://www.mycat.io/document/mycat-definitive-guide.pdf

http://www.javashuo.com/article/p-zjvcdowv-nr.html

相关文章
相关标签/搜索