Mycat的配置-schema.xml

schema.xml管理mycat的逻辑库、表、分片规则、DataNode以及DataSource。

整体结构

示例图

schema.xml内容结构

思维导图

schema.xml标签和属性

示例代码

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
                <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
                <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
                <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
                           rule="mod-long" />
                <table name="employee" primaryKey="ID" dataNode="dn1,dn2"
                           rule="sharding-by-intfile" />
                <table name="customer" primaryKey="ID" dataNode="dn1,dn2"
                           rule="sharding-by-intfile">
                        <childTable name="orders" primaryKey="ID" joinKey="customer_id"
                                                parentKey="id">
                                <childTable name="order_items" joinKey="order_id"
                                                        parentKey="id" />
                        </childTable>
                        <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
                                                parentKey="id" />
                </table>
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost1" database="db2" />
        <dataNode name="dn3" dataHost="localhost1" database="db3" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM1" url="localhost:3306" user="root"
                                   password="123456">
                        <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
                </writeHost>
                <writeHost host="hostS1" url="localhost:3316" user="root"
                                   password="123456" />
        </dataHost>
</mycat:schema>

schema 标签

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"></schema
定义mycat实例中的逻辑库,mycat可以有多个逻辑库。使用schema划分不同的逻辑库

# 第一个逻辑库 名称是TESTDB 其中包括travelrecord表

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    <!-- auto sharding by id (long) -->
    <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
# 第二个逻辑库  名称是USERDB 其中包括company表
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100">
    <table name="company" dataNode="dn10,dn11,dn12" rule="auto-sharding-long" ></table>
</schema>

dataNode

用于绑定逻辑库到某个具体的database上,1.3版本如果配置了dataNode,就不能配置分片表,1.4可以配置默认分片。

  • 1.3
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
    <!—里面不能配置任何表-->
</schema>
  • 1.4
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
<!—配置需要分片的表-->
    <table name=“tuser” dataNode=”dn1”/>
</schema>

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

设置limit的值,自动给每个语句添加上limit。
在SQL语句中也可以显示指定limit值,不受该属性的限制。
该属性对非拆分库不生效。

table标签

<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" ></table>
table标签定义了mycat中的逻辑表,所有需要拆分的表都需要在这个标签中定义

name属性

定义逻辑表的表名

dataNode属性

定义这个逻辑表所属的dataNode,需要和dataNode标签中的name属性的值相互对应
如果dn过多,可以使用简化方法配置

    <table name="travelrecord" dataNode="multipleDn$0-99,multipleDn2$100-199" rule="auto-sharding-long" ></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>

rule属性

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

RuleRequired属性

用于指定表是否绑定分片规则

primaryKey属性

逻辑表对应真实表的主键。
当分片规则是使用非主键进行分配时,在使用主键查询时,会发送查询语句到所有的DN上,如果使用该值配置真实表的主键,mycat会缓存主键与具体DN的信息,再次使用非主键查询时就不会进行广播式的查询。但是,即使配置了该属性,但是缓存没有命中,还是会发送语句给具体的DN来获得数据

type属性

逻辑表的类型,目前只有全局表和普通表两种类型
global表示全局表,不指定值为global表示普通标

autoincrement属性

执行表有使用自增长主键,默认是禁用的

subTables属性

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

needAddLimit属性

是否自动在语句后面加上limit限制(limit限制数量在schema标签中的sqlMaxLimit中设置),默认添加。

childTable标签

用于定义E-R分片的子表

name属性

定义子表的表名

joinKey属性

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

parentKey属性

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

primaryKey属性

主键值

needAddLimit属性

是否自动在语句后面加上limit限制

dataNode标签

<dataNode name="dn1" dataHost="lch3307" database="db1" ></dataNode>
dataNode标签定义了mycat中的数据节点,也就是通常说的数据分片。一个dataNode标签就是一个独立的数据分片

name属性

定义数据节点的名字,这个名字需要是唯一的,在table标签上应用这个名字,来建立表于分片的对应关系

dataHost属性

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

database属性

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

dataHost标签

定义了具体的数据库实例、读写分离配置和心跳语句。

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
 <!-- can have multi write hosts -->
 <writeHost host="hostM1" url="localhost:3306" user="root"  password="123456">
 <!-- can have multi read hosts -->
 <!-- <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="3"在1.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",所有读请求随机分发到writeHost对应的readHost上执行,writeHost不负担读压力

writeType属性

负载均衡类型

  • writeType="0",所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties
  • writeType="1",所有的写操作都随机的发送到WriteHost(1.5以后废弃不推荐)

dbType

指定后端连接的数据库类型
支持二进制的MySQL协议,还有其他使用jdbc连接的数据库,例如mongodb、oracle、spark等

dbDriver属性

指定连接后端数据库使用的Driver,目前可选native和JDBC。
如果使用 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的切换机制
    心跳语句为show status like 'wsrep%'

tempReadHostAvailable属性

如果配置了这个属性,当writeHost挂掉,下面的readHost仍旧可用,默认值0

heartbeat标签

指明用于和后端数据库进行心跳检查的语句

writehost标签/readHost标签

指定后端数据库的相关配置给mycat,用于实例化后端连接池,writeHost指定写实例,readHost指定读实例
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有ReadHost都将不可用。并且,系统会自动检测到宕机,切换到备用的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-server-1.4.1-dev.jar 为 mycat download 下载目录的 jar
# 1:host:user:password 中 1 为 db 端加密标志,host 为 dataHost 的 host 名称
java -cp Mycat-server-1.4.1-dev.jar io.mycat.util.DecryptUtil 1:host:user:password
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容