Mycat 系列之 schema.xml 配置文件介绍

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 标签的相关属性

属性描述
dataNodeString绑定逻辑库到某个具体的 database 上。
checkSQLschemaBoolean当该值为 true 时,执行语句"select * from TESTDB.travelrecord" ,MyCat 会把语句修改为"select * from travelrecord;"。即把表示 schema 的字符去掉,避免发送到后端数据库执行时报错:“ERROR 1146 (42S02): Table ‘testdb.travelrecord’ doesn’t exist”。
建议: SQL 语句最好是不带这个字段。
sqlMaxLimitInteger当设置为某个数值时,每条 SQL 语句,如果没有加上 limit,MyCat 会自动的加上所对应的值。
如果未设置,MyCat 默认会把查询到的信息全部都展示出来,造成过多的输出。
注意: 如果运行的 schema 为非拆分库,那么该属性不会生效,需要手动添加 limit。

·

table 标签

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

Table 标签定义了 MyCat 中的逻辑表。所有需要拆分的表都需要在这个标签中定义。

·

table 标签的相关属性

属性描述
nameString定义逻辑表的表名,一个 schema 标签中定义的表名必须唯一。
dataNodeString定义逻辑表所属的 dataNode。可以使用 “multipleDn$0-99” 配置连续的多个dn(datanode)。
ruleString指定逻辑表要使用的分片规则。规则名字在 rule.xml 中定义。
ruleRequiredboolean指定表是否绑定分片规则。如果配置为 true,但没有配置具体 rule 的话 ,程序会报错。
primaryKeyString该逻辑表对应真实表的主键。
typeString定义逻辑表的类型。目前逻辑表只有“全局表”和”普通表”两种类型。设置为 global,表示全局表;未设置表示为普通表。
autoIncrementboolean是否开启 mycat 的自增长主键功能。需要在对应的 mysql 中定义 auto_increment。
subTablesString\
needAddLimitboolean指定表是否需要自动的在每个语句后面加上 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 标签的相关属性

属性描述
nameString定义子表的表名。
joinKeyString定义子表中与父表关联的字段(列)。
parentKeyString定义父表中与子表关联的字段(列)。程序首先获取 joinkey 的值,再通过 parentKey 属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上,从而确定子表存储的位置。
primaryKeyString该逻辑表对应真实表的主键。
needAddLimitboolean指定表是否需要自动的在每个语句后面加上 limit 限制。默认为 true。

·

dataNode 标签

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

dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个 dataNode 标签就是一个独立的数据分片。

·

dataNode 标签的相关属性

属性描述
nameString定义数据节点的名字。
dataHostString定义该分片属于哪个数据库实例。
databaseString定义该分片属于哪个具体数据库实例上的具体库。

·

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 标签的相关属性

属性描述
nameString唯一标识 dataHost 标签,供上层的标签使用。
maxConInteger指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的 writeHost、readHost 标签都会使用这个属性的值来实例化出连接池的最大连接数。
minConInteger指定每个读写实例连接池的最小连接,初始化连接池的大小。
balanceInteger负载均衡类型,目前的取值有 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 及其以后版本有)。
writeTypeIntegerwriteType=“0”:所有写操作发送到配置的第一个 writeHost,第一个挂了切到第二个 writeHost,重新启动后不会晋升。切换记录在 dnindex.properties 中。
writeType=“1”:所有写操作都随机的发送到配置的 writeHost(1.5 以后废弃不推荐)。
switchTypeIntegerwrite 节点(master)故障时的切换规则。
-1:不自动切换
1:自动切换(默认值)
2:基于 MySQL 主从同步的状态决定是否切换(心跳语句:show slave status)
3:基于 MySQL galary cluster 的切换机制(心跳语句:show status like ‘wsrep%’)
slaveThresholdIntegerswitchType=“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 时则表示主从同步,可以安全切换,否则不会切换。
dbTypeString指定后端连接的数据库类型。
目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、oracle、spark 等。
dbDriverString指定连接后端数据库使用的 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 标签的相关属性

属性描述
hostString用于标识不同实例.一般 writeHost 我们使用 “*M1”,readHost 我们用 “*S1”。
urlString后端实例连接地址。用 native 的 dbDriver,则一般为 address:port 这种形式。当使用 JDBC 时则可以这么写:jdbc:mysql://localhost:3306/。
passwordString后端存储实例需要的密码。
userString后端存储实例需要的用户名字。
weightString权重。配置在 readhost 中作为读节点的权重(1.4 以后)。
usingDecryptString是否对密码加密。默认 0,如需要开启配置 1。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值