一、原理
MyCAT拦截用户发送的SQL语句,对SQL语句进行分片分析、路由分析、读写分离分析、缓存分析等,然后将SQL语句发往相应的数据分片,并对返回的结果做适当处理,最终再返回给用户。
二、server.xml配置
配置MyCAT的系统配置信息,如:用户名、密码、模式、权限、服务端口号(默认8066)、全局SQL防火墙设置等。
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
<property name="defaultSchema">TESTDB</property>
</user>
三、schema.xml配置
配置MyCAT的逻辑库、逻辑表、分片规则、DataNode以及DataSource。
属性 | 作用 |
---|---|
schema | 定义MyCAT实例中的逻辑库 |
table | 定义MyCAT的逻辑表,rule属性指定分片规则 |
dataNode | 定义MyCAT的数据节点(数据分片) |
dataHost | 定义实际的数据库实例、读写分离配置、心跳检查 |
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--
name:逻辑库名称,与server.xml中的<property name="schemas">TESTDB</property>对应;
checkSQLschema:自动检查逻辑库名称并拼接,设置为true时,会拼接为“逻辑库名.表名”;
sqlMaxLimit:查询保护,如果没有写limit条件,会自动拼接;
randomDataNode:指定非DQL(非select、update、delete、insert)语句由指定节点处理;
-->
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
<!--
name:逻辑表名称,与数据库的物理表名一致。可以用逗号分隔,即多张表均使用该配置;
primaryKey:逻辑表主键,与数据库物理表主键一致;
dataNode:物理表所在数据节点的名称,配置多个数据节点时需按索引顺序并使用逗号分隔,或指定一个索引范围:dn1$0-743。
***注意数据节点定义之后,顺序不能再发生改变,否则会导致数据混乱***;
rule:分片规则,对应rule.xml中tableRule节点的name属性;
autoIncrement:设置逻辑表主键是否是自增长的,与sequence_db_conf.properties文件结合使用;
-->
<table name="student" primaryKey="student_id" dataNode="dn1,dn2" rule="student_id" autoIncrement="true">
</table>
</schema>
<!--
name:数据节点名称,对应schema》table节点中的dataNode属性;
dataHost:指定分片所在的物理主机,与dataHost节点中的name属性对应;
database:物理数据库名;
-->
<dataNode name="dn1" dataHost="dh1" database="mycat01" />
<dataNode name="dn2" dataHost="dh1" database="mycat02" />
<!--
name:物理主机名称,与dataNode节点的dataHost属性对应;
maxCon、minCon:底层数据库的链接最大、小数;
balance:指定读写分离的负载均衡类型,值可以为0,1,2,3;
writeType:指定写实例的负载均衡类型,值可以为-1,0,1,2;
dbType:后端连接的数据库类型;
switchType:指定主从切换方式,值可以为-1,1,2,3;
slaveThreshold:定义主从复制延时阈值;
-->
<dataHost name="dh1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<!-- 心跳检查,MySQL可以使用select user(),Oracle可以使用select 1 from dual -->
<heartbeat>select user()</heartbeat>
<!--
host:标识不同实例名称,一般writeHost名称使用M1作为后缀,readHost则使用S1作为后缀;
url:数据库连接地址;
weight:配置某个数据库在 readhost 中作为读节点的权重;
-->
<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="root"
password="root">
<readHost host="hostS1" url="jdbc:mysql://localhost:3306" user="root"
password="root" weight="1"></readHost>
</writeHost>
</dataHost>
</mycat:schema>
四、rule.xml配置
配置分片规则。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<!--
name:与schema.xml中的schema》table节点中的rule属性对应;
algorithm:对应function节点;
-->
<tableRule name="student_id">
<rule>
<columns>student_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">1</property>
</function>
</mycat:rule>