前面的文章,我们介绍了关于 mycat 基本机构以及一些配置文件的作用,从本章开始,讲述有关于配置文件的内容。本文讲的是有关于 schema.xml 的相关配置。
schema.xml 中,是以
<mycat:schema xmlns:mycat="http://io.mycat/">
......
mycat:schema>
所包围的。
而最先被包围的是
标签,故而我们先说明一下schema标签
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
....
schema>
....
mycat:schema>
在schema.xml中,结构就如上所示。schema标签总的来说,属性是由这一行所定义的。
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">schema>
这个配置说明了三点
- name属性,说明了mycat中,会有一个逻辑库,该库的名字是TESTDB;
- checkSQLschema为false,说明当执行
select * from TESTDB.travelrecord
语句的时候,mycat不会把表示的schema(该处是TESTDB)给去掉。该处被去掉的schema(即TESTDB)是由schema标签所定义的。- sqlMaxLimit说明了在每条执行的SQL 语句,如果没有加上limit 语句,MyCat 也会自动的加上所对应limit 100数值。
schema 标签用于定义 MyCat 实例中的逻辑库, MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分这些不同的逻辑库。
1.6版本,如果你没有随便更改设置的话,只有一个 schema (逻辑库),而且命名为 TESTDB 。
如果不配置schema标签,所有的表配置,会属于同一个默认的逻辑库。
如果配置了不同的两个逻辑库,那么逻辑库的基本意思,其实和mysql中所讲述的Database是一致的。而需要注意的是在查询这两个不同的逻辑库中表的时候需要切换到该逻辑库下才可以查询到所需要的表
我们需要创建一个表。我们之前的安装(前面文章所安装)已经有一个TESTDB逻辑库。
我们输入下列命令:
mysql -u root -p ## 登录mysql
create schema db4 ## 创建database
use db4 ## 使用该database
创建 people 表
CREATE TABLE `people` ( `people_id` varchar(64) NOT NULL DEFAULT '0', `people_name` varchar(64) DEFAULT NULL, PRIMARY KEY (`people_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我们可以在schema.xml配置增加一行:
....
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="people" dataNode="dn4" >table>
schema>
....
<dataNode name="dn4" dataHost="localhost1" database="db4" />
datahost(name为localhost1),USERDB和TESTDB使用同一个
我们还需要修改server.xml,去修改用户的权限
<property name="schemas">TESTDB,USERDBproperty>
然后重启 mycat 服务
测试
show databases;
use USERDB
show tables;
属性名 | 值 | 数量限制 |
---|---|---|
dataNode | 任意String | (0..1) |
checkSQLschema | Boolean | (1) |
sqlMaxLimit | Integer | (1) |
以下面举例
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
<!—配置需要分片的表-->
<table name="tuser" dataNode="dn1"/>
schema>
tuser就绑定到dn1所配置的具体database上,可以直接访问这个database,没有配置的表则会走默认节点dn2
没有配置在分片里面的表工具查看无法显示,但是可以正常使用
checkSQLschema属性
该属性用于绑定逻辑库到某个具体的 database 上
select * from db1.travelrecord;
,若 db1 不是 schema 指定,则mycat不会删除 db1 .select * from TESTDB.travelrecord;
,若 TESTDB 是 schema 指定,则 mycat 会修改为select * from travelrecord;
即把表示schema 的字符去掉select * from TESTDB.travelrecord;
的效果为和执行select * from TESTDB.travelrecord limit 100;
相同。当然SQL 语句中也显式的指定limit 的大小,不受该属性的约束。需要注意的是,如果运行的schema 为非拆分库的,那么该属性不会生效。需要手动添加limit 语句。
这是一个有关 table 的例子:
<table name="hotnews" primaryKey="hotnews_id" autoIncrement="true" dataNode="dn1,dn2,dn3"rule="mod-long" />
该例子中,table 标签定义了MyCat 中的逻辑表,所有需要拆分的表都需要在这个标签中定义。那么我们可以从上诉例子看出什么信息?
该例子中,定义了一个hotnews表,其主键定义为“hostnews_id”,设置为可自增,而且其分片规则是mod-long,其数据分片分在了dn1,dn2,dn3三个分片节点上。
属性名 | 值 | 数量限制 |
---|---|---|
name | String | (1) |
dataNode | String | (1..*) |
rule | String | (0..1) |
ruleRequired | boolean | (0..1) |
primaryKey | String | (1) |
type | String | (0..1) |
autoIncrement | boolean | (0..1) |
subTables | String | (1) |
needAddLimit | boolean | (0..1) |
name属性
定义逻辑表的表名。唯一字段。
dataNode属性
定义这个逻辑表所属的 dataNode , 该属性的值需要和 dataNode 标签中 name 属性的值相互对应。
如果需要定义的 dn 过多可以使用如下的方法减少配置:
<table
name="travelrecord"
dataNode="multipleDn$0-99,multipleDn2$100-199"
rule="auto-shardinglong">
table>
<dataNode
name="multipleDn"
dataHost="localhost1"
database="db$0-99" >
dataNode>
<dataNode
name="multipleDn2"
dataHost="localhost1"
database=" db$0-99" >
dataNode>
例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的DN 上,如果使用该属性配置真实表的主键。那么MyCat 会缓存主键与具体DN 的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的DN,但是尽管配置该属性,如果缓存并没有命中的话,还是会发送语句给具体的DN,来获得数据。
备注
该功能在1.6版本开启
本文为介绍配置文件schema.xml的第一部分,介绍了schema标签和table标签的相关属性。
希望各位期待下一篇文章的撰写。