mycat的所有配置文件在mycat/conf目录下,主要包括schema.xml、server.xml、rule.xml等配置文件。
schema.xml为MyCat重要的配置文件,其管理mycat的逻辑库、表、分片规则、DataNode以及Datahost等,掌握这些是正确使用mycat的前提。下面,我们就逐层详解schema.xml文件的配置内容。
1.schema标签
schema标签定义mycat中的逻辑库,mycat中可以有多个逻辑库,每个逻辑库都有自己的相关配置。使用schema标签来划分这些不同的逻辑库。如果不配置schema标签,mycat中的所有表,都属于同一个默认的逻辑库。例如:
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" ></table>
</schema>
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="company" dataNode="dn10,dn11,dn12" rule="auto-sharding-long" ></table>
</schema>
1)dataNode
该属性用于将逻辑库绑定到具体的databases,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>
2)checkSQLschema
该属性值为true时,如果我们执行语句”select * from TESTDB.travelrecord;“,则mycat会把语句修改为“select * from travelrecord;”。即把表示schema的字符“TESTDB”去掉,避免发送到后端数据库执行时报(ERROR
1146 (42S02): Table ‘testdb.travelrecord’ doesn’t exist)。
即使该属性值为true ,如果语句中指定的并非schema标签指定的名字,例如:”select * from db1.travelrecord;“, 那么,mycat并不会去掉”db1“ ,如果没有定义该逻辑库的话则会报错,因此,SQL语句中最好不要指定该限定字符串。
3)sqlMaxLimit
该属性值设置为某个数值时,如果每条执行的 SQL 语句中没有limit关键字,则mycat会自动附加上该属性对应的值。例如:如果该属性值为 100,执行”select * from TESTDB.travelrecord;“和执行”select * from
TESTDB.travelrecord limit 100;“效果是一样的。
如果没设置该属性值,mycat默认会把查询数据全部输出。所以,建议使用时尽量设置该属性值。
此外,如果运行的schema为非拆分库,则该属性不会生效,需要手动添加limit。
2.table标签
table标签定义mycat中的逻辑表,所有的拆分表都需要在这个标签中定义。
1)name
该属性指定逻辑表的名字,同一schema标签中定义表的名字必须唯一。
2)dataNode
该属性指定逻辑表所属的dataNode,该属性的值需要和dataNode标签中name属性的值相对应。如果需要定义的dn过多,可以使用如下方法减少配置:
<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>
--说明:
1)multipleDn$0-99:表示multipleDn0,multipleDn1,...,multipleDn99等100个dataNode。
2)multipleDn2$100-199:表示multipleDn2100,multipleDn2101,...,multipleDn2199等100个dataNode。
3)db$0-99:表示db0,db1,...,db99等100个database。
4)db$100-199:表示db100,db101,...,db199等100个database。
3)rule
该属性用于指定逻辑表要使用的规则名字,必须与rule.xml中tableRule标签的name属性值相对应。
4)ruleRequired
该属性用于指定逻辑表是否绑定分片规则,如果其值为true,但没有配置具体rule的话,程序将会报错。
5)primaryKey
该属性指定逻辑表对应真实表的主键。如果分片规则使用非主键字段进行分片,那么,使用主键查询的时候,就会将SQL发送到所有配置的dataNode上。如果使用该属性配置真实表的主键,那么,mycat就会缓存
主键与具体dataNode的信息,再次使用非分片字段进行查询的时候就不会进行广播式的SQL分发,而是直接将SQL发送给具体的dataNode,但尽管配置该属性,如果缓存并没有命中的话,还是会将SQL发送给具体dataNode来获得数据。
6)type
该属性指定逻辑表的类型,目前逻辑表只有“全局表” 和” 普通表” 两种类型:
a)全局表:global。
b)普通表:不指定为global的所有表。
7)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” 来禁用这个功能,当然,你也可以直接删除掉这个属性,默认就是禁用的。
8)subTables
该属性定义表的各个分表,1.6版本后开始支持分表,并且分表情况下只能配置一个dataNode,分表情况不支持各种条件的join语句。例如:
<table name="travelrecord" subTables="travelrecord$1-3" dataNode="dn1" rule="mod-long" />
9)needAddLimit
该属性指定表是否自动为每个SQL附加limit限制。如果该属性值为true,mycat就会自动为SQL附加limit 100。当然,如果语句中已有limit就不会再次添加了。该属性默认为true,也可设置成false禁用默认行为。
3.childTable标签
该标签用于定义E-R分片的子表,其通过标签的属性与父表进行关联。
1)name
该属性定义子表的名字。
2)joinKey
该属性指定向子表插入数据时用于查找父表数据节点的列名。
3)parentKey
该属性指定与父表建立关联关系的附表的列名。程序首先获取joinkey的值,再通过parentKey指定的列名产生查询SQL,通过执行该SQL得到父表所在的分片,从而进一步确定子表的需要存储的位置。
4)primaryKey
该属性指定逻辑表对应真实表的主键。如果分片规则使用非主键字段进行分片,那么,使用主键查询的时候,就会将SQL发送到所有配置的dataNode上。如果使用该属性配置真实表的主键,那么,mycat就会缓存
主键与具体dataNode的信息,再次使用非分片字段进行查询的时候就不会进行广播式的SQL分发,而是直接将SQL发送给具体的dataNode,但尽管配置该属性,如果缓存并没有命中的话,还是会将SQL发送给具体dataNode来获得数据。
5)needAddLimit
该属性指定表是否自动为每个SQL附加limit限制。如果该属性值为true,mycat就会自动为SQL附加limit 100。当然,如果语句中已有limit就不会再次添加了。该属性默认为true,也可设置成false禁用默认行为。
4.dataNode标签
dataNode标签定义了mycat中的数据节点,也就是我们通常说的数据分片,一个dataNode标签就是一个独立的数据分片。例如:
<dataNode name="dn1" dataHost="lch3307" database="db1" ></dataNode>
1)name
该属性指定数据节点的名字,该名字必须是唯一的,table标签需要应用这个名字,以建立表与分片的对应关系。
2)dataHost
该属性指定该分片所属于的数据库实例,其属性值引用dataHost标签定义的name属性。
3)database
该属性指定该分片所属于具体数据库实例的具体库,这里使用两个纬度来定义分片,即实例+具体库。因为每个库上建立的表是一样的,这样做就可以容易的对表进行水平拆分。
5.dataHost标签
作为Schema.xml中最后一个标签,该标签在mycat逻辑库中也是作为最底层的标签存在,其属性定义了具体的数据库实例、读写分离配置和心跳语句。
1)name
该属性唯一标识dataHost标签,供上层标签使用。
2)maxCon
该属性指定每个读写实例连接池的最大连接数。也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性值来实例化连接池的最大连接数。
3)minCon
该属性指定每个读写实例连接池的最小连接数,其为初始化连接池的大小。
4)balance
该属性指定读负载均衡类型,目前的可用值如下:
a)balance="0",禁用读写分离机制,所有读操作都发送到当前可用的writeHost。
b)balance="1",所有readHost与stand by writeHost参与select语句的负载均衡,具体说,双主双从模式(M1->S1, M2->S2,并且 M1 与 M2 互为主备)下,M2,S1,S2 都参与select语句的负载均衡。
c)balance="2",所有读操作随机分发给writeHost、readhost。
d)balance="3",所有读操作随机分发到wiriterHost对应的readhost,writerHost不负担读压力,注意balance=3仅在1.4及其以后版本有。
5)writeType
该属性指定写负载均衡类型,目前可用值如下:
a)writeType="0",所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件dnindex.properties中。
b)writeType="1",所有写操作随机发送到配置的writeHost,1.5 以后废弃不推荐。
6)dbType
该属性指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用JDBC连接的数据库。 例如:mongodb、 oracle、 spark 等。
7)dbDriver
该属性指定连接后端数据库使用的Driver,目前可用值有native和JDBC。使用native的话,因为该值执行二进制mysql协议,所以,可以使用mysql和maridb。其他类型的数据库则需要使用JDBC驱动来支持。
从1.6版本开始支持postgresql的native原始协议。
如果使用JDBC,需要将符合JDBC4标准的驱动JAR包放到 MYCAT\lib目录下,并检查驱动JAR包包括如下目录结构的文件:META-INF\services\java.sql.Driver。并在该文件中填写具体的Driver 类名,例如:com.mysql.jdbc.Driver。
8)switchType
该属性指定主从切换类型,目前可用值如下:
a)-1:表示不自动切换。
b)1:默认值,表示自动切换。
c)2:基于mysql主从同步的状态决定是否切换,心跳语句为 show slave status。
d)3:基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%。
9)tempReadHostAvailable
该属性指定如果writeHost失联后,其下配置的readHost是否仍旧可用,1为可用,0为不可用,默认为0。
6.heartbeat标签
该标签指定用于对后端数据库进行心跳检查的语句。例如:mysql可用“select user()”,Oracle可用“select 1 from dual”等。mycat1.4版本中,主从切换心跳检测的语句必须是:show slave status。
该标签还有一个connectionInitSql属性,用于指定Oracle数据库的初始化SQL语句,例如:alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'。
7.writeHost标签和readHost标签
该两个标签都为mycat指定后端数据库的相关配置,用于实例化后端连接池。唯一不同的是,writeHost指定写实例,readHost 指定读实例。
一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,则这个writeHost绑定的所有readHost都将不可用。另一方面,由于系统会自动的检测到这个writeHost宕机,并
切换到备用的writeHost上去。该两个标签属性相同,再次一并介绍。
1)host
该属性用于标识不同实例,一般writeHost我们使用M1,readHost我们用S1。
2)url
该属性指定后端实例连接地址,如果使用native的dbDriver,则一般为address:port这种形式。用JDBC或其他的dbDriver,则需要特殊指定。当使用JDBC时则可以这么写:jdbc:mysql://localhost:3306/。
3)user
该属性指定后端数据库实例的用户名。
4)password
该属性指定后端数据库实例指定用户的密码。
5)weight
该属性用于指定readhost作为读节点的权重(1.4版本后)。
6)usingDecrypt
该属性指定是否对密码加密,默认为0(禁用), 如需开启,配置为1,同时使用加密程序对密码加密:
java -cp Mycat-server-1.4.1-dev.jar io.mycat.util.DecryptUtil 1:host:user:password
--说明:
1)Mycat-server-1.4.1-dev.jar为mycat download下载目录的jar。
2)1:host:user:password 中, 1为db端加密标志,host为dataHost的host名称。