一. schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 定义一个MyCat的模式,逻辑数据库名称TestDB -->
<!-- “checkSQLschema”:描述的是当前的连接是否需要检测数据库的模式 -->
<!-- “sqlMaxLimit”:表示返回的最大的数据量的行数 -->
<!-- “dataNode="dn1"”:该操作使用的数据节点是dn1的逻辑名称 -->
<schema name="mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
<!-- 定义数据的操作节点 -->
<!-- “dataHost="localhost1"”:定义数据节点的逻辑名称 -->
<!-- “database="mldn"”:定义数据节点要使用的数据库名称 -->
<dataNode name="dn1" dataHost="localhost1" database="mldn" />
<!-- 定义数据节点,包括了各种逻辑项的配置 -->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 配置真实MySQL与MyCat的心跳 -->
<heartbeat>select user()</heartbeat>
<!-- 配置真实的MySQL的连接路径 -->
<writeHost host="hostM1" url="192.168.1.128:3306" user="root" password="123456"></writeHost>
</dataHost>
</mycat:schema>
二. dataHost标签上属性释义
balance:负载均衡类型
0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
1:全部的readHost与stand by writeHost参与select语句的负载均衡,
2:所有读操作都随机在writeHost、readHost上分发
3:所有读请求随机分发到writeHost对应的readHost执行,writeHost不负担读压力
writeType:负载均衡类型
0:所有写操作发送到配置的第一个writeHost,当第一个writeHost宕机时,切换到第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件:dnindex.properties中
1:所有写操作都随发送到配置的writeHost
2:尚未实现
switchType:切换方式
-1:不自动切换
1:自动切换(默认)
2:基于MySql主从同步的状态来决定是否切换
三. server.xml
添加如下配置:相当于建立了一个叫做mycat用户,对应密码为mycat,该用户管理了mycats这个逻辑库。当然了,也可以为用户添加管理多个逻辑库,以,(英文逗号)分隔开即可
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">mycats</property><!--schemas:逻辑库名称,具体配置在scheme.xml中-->
</user>
四. schema.xml
可以说是最重要的配置文件,管理着 MyCat 的逻辑库、表、分片规则、DataNode 以及 DataSource
schema是实际逻辑库的配置,多个schema代表多个逻辑库
dataNode是逻辑库对应的分片,如果配置多个分片则需要添加多个dataNode即可
dataHost是实际的物理库配置,可以根据业务需要配置多主、主从等其他配置,多个dataHost代表分片对应的物理库地址,下面的writeHost、readHost代表该分片是否配置多写,主从,读写分离等高级特性
添加如下配置:水平切分,数据按Id取模均匀划分到两个数据库中
<schema name="mycats" checkSQLschema="false" sqlMaxLimit="100">
<!-- 逻辑表配置 -->
<table name="tb_user" dataNode="dn1,dn2" rule="mod-long" /><!--name:实际物理库的数据表名;dataNode:表对应的分片;rule:分片规则名称,具体配置在rule.xml中-->
</schema>
<dataNode name="dn1" dataHost="host1" database="mycat1" /><!--name:分片名称;database:实际物理库的数据库名-->
<dataNode name="dn2" dataHost="host1" database="mycat2" />
<dataHost name="host1" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat><!--mysql心跳检测命令-->
<writeHost host="hostM1" url="localhost:3306" user="root" password="xxx" /><!--实际物理库的配置信息-->
</dataHost>
五. rule.xml
定义了表拆分所涉及到的规则定义。根据业务可以灵活的对表使用不同的分片算法(目前已实现十余种不同的分片规则,对应所在源码包为:io.mycat.route.function),或者对表使用相同的算法但具体的参数不同。
添加如下配置:水平切分,数据按Id取模均匀划分到两个数据库中
<tableRule name="mod-long">
<!-- 对应表的分片规则 -->
<rule>
<columns>id</columns><!-- 对应数据表要取模的字段名称 -->
<algorithm>mod-long</algorithm><!-- 对应function的名称 -->
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- name:对应tableRule的名称;class:切分规则对应的切分类 -->
<!-- scheme.xml中有多少个dataNode就改成多少个 -->
<property name="count">2</property>
</function>
六. server.xml
server.xml中的内容,简要来说,主要有<system>、<user>和<firewall>这三部分。
<system> SystemConfig DBLE服务器配置,例如服务端口、管理端口等
<user> UserConfig 访问DBLE的用户配置,例如用户名、密码、允许访问哪些库or表等
<firewall> FirewallConfig 访问权限配置,例如基于用户的机器IP来允许/禁止访问
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property> # 如果授予多个库访问权限,用逗号隔开即可:
<!-- 表级 DML 权限设置 -->
<!--
# 默认对imooc_db库有update、select权限,对其中的tb01表无权限,对tb02表四个权限都有)
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
# 对用户授予表权限的示例:instsert,update,select,delete
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
操作 | DML权限示例 | 说明 |
insert,update,select,delete | 0000 | 禁止增加、更新、查询和删除 |
insert,update,select,delete | 0010 | 禁止增加、更新和删除,可以查询 |
insert,update,select,delete | 1110 | 禁止删除,可以创建、更新和查询 |
如果设置了 schema 的 DML,而没有设置 table 的 DML,则自动继承 schema 的 DML 属性