一.基础配置
1.配置mycat/conf/schema.xml文件如下所示:

<?xml version="1.0"?>
 <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 <mycat:schema xmlns:mycat="http://io.mycat/">
         <!-- 定义一个mycat模式,逻辑数据库名为test_db -->
         <!-- “checkSQLschema”:指定当前连接是否检测数据库模式 -->
         <!-- “sqlMaxLimit”:指定返回数据的最大行数 -->
         <!-- “dataNode="dn1"”:指定使用的数据节点名称,这里为dn1 -->
         <schema name="db_test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
         <!-- 定义数据节点 -->
         <!-- “dataHost="localhost1"”:指定数据主机名称 -->
         <!-- “database="db_test"”:指定数据主机使用的数据库名称 -->
         <dataNode name="dn1" dataHost="localhost1" database="db_test" />
         <!-- 定义数据主机 -->
         <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
             <!-- 定义mycat与后端mysql间的心跳 -->
             <heartbeat>select user()</heartbeat>
             <!-- 定义后端mysql的连接路径 -->
             <writeHost host="hostM1" url="10.1.1.11:3306" user="root" password="123456"></writeHost>
         </dataHost>
 </mycat:schema>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.


--注:
1)balance:指定读负载均衡类型,可用值如下:
0:不开启读写分离,所有读操作都发送到当前可用writeHost。
1:所有readHost和stand by writeHost参与读操作的负载均衡。
2:所有读操作随机分发到writeHost、readHost。
3:所有读操作随机分发到writeHost对应的readHost,writeHost不负担读压力。
2)writeType:指定写负载均衡类型,可用值如下:
0:所有写操作发送到配置的第一个writeHost,当第一个writeHost宕机时,切换到第二个writeHost,重新启动后以切换后的为准,切换记录于配置文件dnindex.properties。
1:所有写操作随发送到配置的writeHost。
2:尚未实现
3)switchType:指定切换方式,可用值如下:
-1:不自动切换。
1:自动切换(默认)。
2:根据mysql主从同步状态决定是否切换。

二.读写分离
1.配置mycat/conf/schema.xml文件如下所示:

<?xml version="1.0"?>
 <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 <mycat:schema xmlns:mycat="http://io.mycat/">
         <!-- 定义一个mycat模式,逻辑数据库名为test_db -->
         <!-- “checkSQLschema”:指定当前连接是否检测数据库模式 -->
         <!-- “sqlMaxLimit”:指定返回数据的最大行数 -->
         <!-- “dataNode="dn1"”:指定使用的数据节点名称,这里为dn1 -->
         <schema name="db_test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
         <!-- 定义数据节点,该节点用于库表分离 -->
         <!-- “dataHost="localhost1"”:指定数据主机名称 -->
         <!-- “database="db_test"”:指定数据主机使用的数据库名称 -->
         <dataNode name="dn1" dataHost="localhost1" database="db_test" />
         <!-- 定义数据主机 -->
         <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
             <!-- 定义mycat与后端mysql间的心跳 -->
             <heartbeat>select user()</heartbeat>
             <!-- 定义后端mysql的连接路径 -->
             <writeHost host="hostM1" url="10.1.1.11:3306" user="root" password="123456">
                 <readHost host="hostS1" url="10.1.1.12:3306" user="root" password="123456"/>
             </writeHost>
         </dataHost>
 </mycat:schema>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.


--注:
1)设置dataHost属性balance=3,实现读写分离;如设置balance=2,则writeHost与ReadHost共同分担读负载。
2)通过命令启动mycat:/usr/local/mycat/bin/mycat console

三.垂直分片(分库)
垂直分片就是将多张表分别存储于不同的mysql实例中进行管理和使用,其具体实现方法和步骤如下所示:
1.在多个不同mysql实例(10.1.1.13:3306:test_db1和10.1.1.14:3306:test_db2)中创建多张表。
2.配置/mycat/conf/schema.xml文件如下所示:

<?xml version="1.0"?>
 <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 <mycat:schema xmlns:mycat="http://io.mycat/">
         <schema name="db_test1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
         <schema name="db_test2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"/>
         <dataNode name="dn1" dataHost="localhost1" database="db_test1" />
         <dataNode name="dn2" dataHost="localhost2" database="db_test2" />
         <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM1" url="10.1.1.13:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM2" url="10.1.1.14:3306" user="root" password="123456"/>
         </dataHost>
 </mycat:schema>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.


3.配置mycat/conf/server.xml文件如下所示:
<property name="schemas">test_db1,test_db2</property>
4.通过如下命令启动mycat:/usr/local/mycat/bin/mycat console

四.全局表
全局表可用作数据字典表,其在所有mysql实例数据库中存在,但mycat中,只是一个逻辑数据库的数据表,当对mycat中该表进行变更操作时,该表相应所有mysql实例数据库中的表都会发生相应变更,其具体实现方法和步骤如下所示:
1.在多个mysql实例中分别建立相同的数据字典表。
2.配置mycat/conf/schema.xml文件如下所示:

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 <mycat:schema xmlns:mycat="http://io.mycat/">
         <schema name="db_test" checkSQLschema="false" sqlMaxLimit="100">
                 <table name="t_test" primaryKey="id" type="global" dataNode="dn1,dn2"/>
         </schema>
         <schema name="db_test1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
         <schema name="db_test2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"/>
         <dataNode name="dn1" dataHost="localhost1" database="db_test1" />
         <dataNode name="dn2" dataHost="localhost2" database="db_test2" />
         <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM1" url="10.1.1.15:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM2" url="10.1.1.16:3306" user="root" password="123456"/>
         </dataHost>
 </mycat:schema>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.


4.配置mycat/conf/server.xml文件如下所示:
<property name="schemas">db_test1,db_test2,db_test</property>
5.通过如下命令启动mycat:/usr/local/mycat/bin/mycat console
6.此时只要对mycat中db_test库中的表t_test进行更新,其对应所有mysql实例数据库中的t_test表都会更新,相应地,mycat其他数据库(db_test1,db_test2)中的t_test表也都会更新。

五.水平分片(分库)
1.常用水平分片
水平分片是将一个数据量庞大的数据表通过水平拆分,分别将部分数据存储于不同mysql实例数据库,mycat分片规则配置文件为/usr/local/mycat/conf/rule.xml,目前常用分片规则有:
1)求模分库:mod-long。
2)范围分库:auto-sharding-long。
3)Hash分库:hash-int。
4)月分库:sharding-by-month。
5)ER模型分库:childTable。
6)自定义分库:CustomRule(该规则需自己实现分库算法)。
2.分片规则
编辑配置分片规则文件mycat/conf/rule.xml。
3.求模分片(分库)
1)配置rule.xml文件如下所示:

<tableRule name="my-mod-long">
         <rule>
                 <columns>id</columns>
                 <algorithm>mod-long</algorithm>
         </rule>
 </tableRule>
 <function name="my-mod-long" class="io.mycat.route.function.PartitionByMod">
         <property name="count">3</property><!--求模的余数-->
 </function>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.


2)配置schema.xml文件如下所示:

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 <mycat:schema xmlns:mycat="http://io.mycat/">
         <schema name="db_test" checkSQLschema="false" sqlMaxLimit="100">
                 <table name="t_test1" primaryKey="id" dataNode="dn1,dn2,dn3" rule="my-mod-long"/>
         </schema>
         <dataNode name="dn1" dataHost="localhost1" database="db_test1" />
         <dataNode name="dn2" dataHost="localhost2" database="db_test2" />
         <dataNode name="dn3" dataHost="localhost3" database="db_test3" />
         <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM1" url="10.1.1.17:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM2" url="10.1.1.18:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM3" url="10.1.1.19:3306" user="root" password="123456"/>
         </dataHost>
 </mycat:schema>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.


3)配置server.xml文件如下所示:
<property name="schemas">TESTDB</property>
4)通过如下命令启动mycat服务:/usr/local/mycat/bin/mycat console
5)通过如下命令连接mycat:mysql -uroot -p123456 -h10.1.1.10 -P8066 -Ddb_test
6)序列配置在usr/local/mycat/conf/sequence_conf.properties文件中,还需配置server.xml文件如下所示:
<property name="sequenceHandlerType">0</property>
此外,SQL中用next value for mycat_seq1表示序列增长,例如:
insert into t_test(c1,c2) values(next value for mycat_seq1,'test');
4.范围分片(分库)
1)配置rule.xml文件如下所示:

<tableRule name="my-auto-sharding-long">
         <rule>
                 <columns>id</columns>
                 <algorithm>my-auto-sharding-long</algorithm>
         </rule>
 </tableRule>
 <function name="my-auto-sharding-long" class="io.mycat.route.function.AutoPartitionByLong">
         <property name="mapFile">partition-long.txt</property><!--范围规则文件-->
 </function>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.


2)定义范围分库规则文件/usr/local/mycat/conf/partition-long.txt如下所示:
0-10000=0
10001-20000=1
20001-30000=2

3)配置schema.xml文件如下所示:
<table name="data" primaryKey="id" dataNode="dn1,dn2,dn3" rule="my-auto-sharding-long"/>
5.Hash分片(分库)
1)配置rule.xml文件如下所示:

<tableRule name="my-by-intfile">
         <rule>
                 <columns>title</columns>
                 <algorithm>my-hash-int</algorithm>
         </rule>
 </tableRule>
 <function name="my-hash-int" class="io.mycat.route.function.PartitionByFileMap">
                 < property name="type">1</property><!--0表示数字型分片,1表示字符串分片-->
         <property name="mapFile">partition-hash-int.txt</property><!--Hash规则文件-->
 </function>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.


2)定义hash分库规则文件/usr/local/mycat/conf/partition-hash-int.txt如下所示:

10000=0
 10010=1
 DEFAULT_NODE=1
  • 1.
  • 2.
  • 3.


3)配置schema.xml文件如下所示:
<table name="t_test1" primaryKey="id" dataNode="dn1,dn2,dn3" rule="my-by-intfile"/>
5.按月分片(分库)
1)配置rule.xml文件如下所示:

<tableRule name="my-by-month">
         <rule>
                 <columns>saledate</columns>
                 <algorithm>my-partbymonth</algorithm>
         </rule>
 </tableRule>
 <function name="my-partbymonth" class="io.mycat.route.function.PartitionByMonth">
                 < property name="dateFormat">yyyy-MM-dd</property>
         <property name="sBeginDate">2017-01-01</property>
 </function>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.


2)配置schema.xml文件如下所示:

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 <mycat:schema xmlns:mycat="http://io.mycat/">
         <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                 <!--使用$表示通配符-->
                 <table name="t_test12" primaryKey="id" dataNode="dn$1-12" rule="my-by-month"/>
         </schema>
         <dataNode name="dn1" dataHost="localhost1" database="db_test1" />
         <dataNode name="dn2" dataHost="localhost2" database="db_test2" />
         <dataNode name="dn3" dataHost="localhost3" database="db_test3" />
         <dataNode name="dn4" dataHost="localhost4" database="db_test4" />
         <dataNode name="dn5" dataHost="localhost5" database="db_test5" />
         <dataNode name="dn6" dataHost="localhost6" database="db_test6" />
         <dataNode name="dn7" dataHost="localhost7" database="db_test7" />
         <dataNode name="dn8" dataHost="localhost8" database="db_test8" />
         <dataNode name="dn9" dataHost="localhost9" database="db_test9" />
         <dataNode name="dn10" dataHost="localhost10" database="db_test10" />
         <dataNode name="dn11" dataHost="localhost11" database="db_test11" />
         <dataNode name="dn12" dataHost="localhost12" database="db_test12" />
         <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM1" url="10.1.1.21:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM2" url="10.1.1.22:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM3" url="10.1.1.23:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost4" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM4" url="10.1.1.24:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost5" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM5" url="10.1.1.25:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost6" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM6" url="10.1.1.26:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost7" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM7" url="10.1.1.27:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost8" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM8" url="10.1.1.28:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost9" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM9" url="10.1.1.29:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost10" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM10" url="10.1.1.30:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost11" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM11" url="10.1.1.31:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost12" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM12" url="10.1.1.32:3306" user="root" password="123456"/>
         </dataHost>
 </mycat:schema>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.


6.E-R模型分片(分库)
所谓E-R模型分片,就是根据数据库E-R模型对多表进行父子关联分库存储和管理。
1)配置schema.xml文件如下所示:

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 <mycat:schema xmlns:mycat="http://io.mycat/">
         <schema name="db_test" checkSQLschema="false" sqlMaxLimit="100">
                 <!--定义父表与子表间的关联关系-->
                 <table name="t_orders" primaryKey="id" dataNode="dn$1-3" rule="my-mod-long">
                         <childTable name="t_details" joinKey="id" primaryKey="did" parentKey="id"/>
                 </table>
         </schema>
         <dataNode name="dn1" dataHost="localhost1" database="db_test1" />
         <dataNode name="dn2" dataHost="localhost2" database="db_test2" />
         <dataNode name="dn3" dataHost="localhost3" database="db_test3" />
         <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM1" url="10.1.1.40:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM2" url="10.1.1.41:3306" user="root" password="123456"/>
         </dataHost>
         <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                 <heartbeat>select user()</heartbeat>
                 <writeHost host="hostM3" url="10.1.1.42:3306" user="root" password="123456"/>
         </dataHost>
 </mycat:schema>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.