schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库、表、分片规则、DataNode 以及 DataSource。
·
schema 标签
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"></schema>
schema 标签用于定义 MyCat 实例中的逻辑库。MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。如果不配置 schema 标签,所有的表配置,会属于同一个默认的逻辑库。如下所示:
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="company" dataNode="dn10,dn11,dn12" rule="auto-sharding-long" ></table>
</schema>
·
schema 标签的相关属性
属性 | 值 | 描述 |
---|---|---|
dataNode | String | 绑定逻辑库到某个具体的 database 上。 |
checkSQLschema | Boolean | 当该值为 true 时,执行语句"select * from TESTDB.travelrecord" ,MyCat 会把语句修改为"select * from travelrecord;"。即把表示 schema 的字符去掉,避免发送到后端数据库执行时报错:“ERROR 1146 (42S02): Table ‘testdb.travelrecord’ doesn’t exist”。 建议: SQL 语句最好是不带这个字段。 |
sqlMaxLimit | Integer | 当设置为某个数值时,每条 SQL 语句,如果没有加上 limit,MyCat 会自动的加上所对应的值。 如果未设置,MyCat 默认会把查询到的信息全部都展示出来,造成过多的输出。 注意: 如果运行的 schema 为非拆分库,那么该属性不会生效,需要手动添加 limit。 |
·
table 标签
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" ></table>
Table 标签定义了 MyCat 中的逻辑表。所有需要拆分的表都需要在这个标签中定义。
·
table 标签的相关属性
属性 | 值 | 描述 |
---|---|---|
name | String | 定义逻辑表的表名,一个 schema 标签中定义的表名必须唯一。 |
dataNode | String | 定义逻辑表所属的 dataNode。可以使用 “multipleDn$0-99” 配置连续的多个dn(datanode)。 |
rule | String | 指定逻辑表要使用的分片规则。规则名字在 rule.xml 中定义。 |
ruleRequired | boolean | 指定表是否绑定分片规则。如果配置为 true,但没有配置具体 rule 的话 ,程序会报错。 |
primaryKey | String | 该逻辑表对应真实表的主键。 |
type | String | 定义逻辑表的类型。目前逻辑表只有“全局表”和”普通表”两种类型。设置为 global,表示全局表;未设置表示为普通表。 |
autoIncrement | boolean | 是否开启 mycat 的自增长主键功能。需要在对应的 mysql 中定义 auto_increment。 |
subTables | String | \ |
needAddLimit | boolean | 指定表是否需要自动的在每个语句后面加上 limit 限制。默认为 true。 |
·
childTable 标签
<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>
childTable 标签用于定义 E-R 分片的子表。通过标签上的属性与父表进行关联。
·
childTable 标签的相关属性
属性 | 值 | 描述 |
---|---|---|
name | String | 定义子表的表名。 |
joinKey | String | 定义子表中与父表关联的字段(列)。 |
parentKey | String | 定义父表中与子表关联的字段(列)。程序首先获取 joinkey 的值,再通过 parentKey 属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上,从而确定子表存储的位置。 |
primaryKey | String | 该逻辑表对应真实表的主键。 |
needAddLimit | boolean | 指定表是否需要自动的在每个语句后面加上 limit 限制。默认为 true。 |
·
dataNode 标签
<dataNode name="dn1" dataHost="localhost1" database="db1" ></dataNode>
dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个 dataNode 标签就是一个独立的数据分片。
·
dataNode 标签的相关属性
属性 | 值 | 描述 |
---|---|---|
name | String | 定义数据节点的名字。 |
dataHost | String | 定义该分片属于哪个数据库实例。 |
database | String | 定义该分片属于哪个具体数据库实例上的具体库。 |
·
dataHost 标签
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="10.202.4.39:3306" user="root"
password="sf123456">
<!-- can have multi read hosts -->
<!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />-->
</writeHost>
</dataHost>
dataHost 标签在 mycat 逻辑库中是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。
·
dataHost 标签的相关属性
属性 | 值 | 描述 |
---|---|---|
name | String | 唯一标识 dataHost 标签,供上层的标签使用。 |
maxCon | Integer | 指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的 writeHost、readHost 标签都会使用这个属性的值来实例化出连接池的最大连接数。 |
minCon | Integer | 指定每个读写实例连接池的最小连接,初始化连接池的大小。 |
balance | Integer | 负载均衡类型,目前的取值有 4 种: 0:不开启读写分离机制,所有读操作都发送到可用的 writeHost 上。 1:全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡。简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。 2:所有读操作都随机的在 writeHost、readhost 上分发。 3:所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力。(只在 1.4 及其以后版本有)。 |
writeType | Integer | writeType=“0”:所有写操作发送到配置的第一个 writeHost,第一个挂了切到第二个 writeHost,重新启动后不会晋升。切换记录在 dnindex.properties 中。 writeType=“1”:所有写操作都随机的发送到配置的 writeHost(1.5 以后废弃不推荐)。 |
switchType | Integer | write 节点(master)故障时的切换规则。 -1:不自动切换 1:自动切换(默认值) 2:基于 MySQL 主从同步的状态决定是否切换(心跳语句:show slave status) 3:基于 MySQL galary cluster 的切换机制(心跳语句:show status like ‘wsrep%’) |
slaveThreshold | Integer | switchType=“2” 意味着开启 MySQL 主从复制状态绑定的读写分离与切换机制,Mycat 心跳机制通过检测 show slave status 中的 “Seconds_Behind_Master”, “Slave_IO_Running”,“Slave_SQL_Running” 三个字段来确定当前主从同步的状态以及 Seconds_Behind_Master 主从复制时延,当 Seconds_Behind_Master > slaveThreshold 时,读写分离筛选器会过滤掉此 Slave 机器,防止读到很久之前的旧数据,而当主节点宕机后,切换逻辑会检查 Slave 上的 Seconds_Behind_Master 是否为 0,为 0 时则表示主从同步,可以安全切换,否则不会切换。 |
dbType | String | 指定后端连接的数据库类型。 目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、oracle、spark 等。 |
dbDriver | String | 指定连接后端数据库使用的 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。 |
·
heartbeat 标签
<heartbeat>select user()</heartbeat>
这个标签内指明用于和后端数据库进行心跳检查的语句。
例如:MYSQL 可以使用 select user(),Oracle 可以使用 select 1 from dual 等。
这个标签还有一个 connectionInitSql 属性,主要是当使用 Oracla 数据库时,需要执行的初始化 SQL 语句就这个放到这里面来。例如:
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'
·
writeHost 标签和 readHost 标签
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="10.202.4.39:3306" user="root"
password="sf123456">
<!-- can have multi read hosts -->
<!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />-->
</writeHost>
</dataHost>
这两个标签都指定后端数据库的相关配置给 mycat,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例。
在一个 dataHost 内可以定义多个 writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。
另一方面,系统会自动的检测到这个 writeHost 宕机,并切换到备用的 writeHost 上去。
·
writeHost 标签和 readHost 标签的相关属性
属性 | 值 | 描述 |
---|---|---|
host | String | 用于标识不同实例.一般 writeHost 我们使用 “*M1”,readHost 我们用 “*S1”。 |
url | String | 后端实例连接地址。用 native 的 dbDriver,则一般为 address:port 这种形式。当使用 JDBC 时则可以这么写:jdbc:mysql://localhost:3306/。 |
password | String | 后端存储实例需要的密码。 |
user | String | 后端存储实例需要的用户名字。 |
weight | String | 权重。配置在 readhost 中作为读节点的权重(1.4 以后)。 |
usingDecrypt | String | 是否对密码加密。默认 0,如需要开启配置 1。 |