该篇主要是解释MyCat那几个主要的配置文件的作用,以及用法。

附上如何启动Mycat:spring boot+JPA+MyCat实现Mysql的读写分离(启动篇)

Mycat一共有三个十分重要的配置文件(conf目录下)。

   分别是: schema.xml (用于配置逻辑库表逻辑表以及数据节点,还有数据源等配置信息的。最重要的

                  rule.xml(配置表的分片规则)

                  server.xml(配置服务器权限的)

 

schema.xml:

<!--schema定义逻辑库,table定义逻辑表。逻辑表是依赖于逻辑库的。-->
 <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:实际物理库的数据库名<!--定义了数据节点的物理数据源,一个真实的物理数据库实例,-->
 <dataHost name="host1" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
        balance:该属性表示有几个从数据库
       <heartbeat>select user()</heartbeat>        //mysql心跳检测命令
        <writeHost host="hostM1" url="localhost:3306" user="root" password="xxx" />        //实际物理库的配置信息
 </dataHost>

rule.xml:

<tableRule name="">
                 <rule>
                 </rule>
 </tableRule>  //定义表使用的分片规则 <function name=""> </function>      //定义表的分片算法

server.xml

<system></system>        //定义了一些系统配置,比如端口号啊、内存大小啊、timeOut时间等。
<user name="mycat">
         <property name="password">mycat</property>
         <property name="schemas">mycats</property>        //schemas:逻辑库名称,具体配置在scheme.xml中
 </user>      //定义了连接Mycat的用户,如账号、密码等。只有在定义了的用户才能连接Mycat

配置解释完了,看具体操作:

直接上配置文件:


rule.xml

<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

<user name="mycat">
        <property name="password">mycat</property>
        <property name="schemas">mycats</property>
</user>

schema.xml 

<schema name="mycats" checkSQLschema="false" sqlMaxLimit="100">
                <table name="user" dataNode="dn1,dn2" rule="mod-long" />
        </schema>

        <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
                /> -->
        <dataNode name="dn1" dataHost="localhost1" database="demo2" />
        <dataNode name="dn2" dataHost="localhost1" database="demo3" />

        <dataHost name="localhost1" maxCon="100" minCon="1" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM1" url="换成数据库ip:3306" user="root"  password="123456">
                        <!-- can have multi read hosts -->
                </writeHost>
        </dataHost>

准备2个数据库,数据库的表结构一模一样,然后数据库名、表明就和schema.xml配置的对应起来。

mysql分库分表后分页查询怎么实现 mysql分表分库技术 实现_mysql分库分表后分页查询怎么实现


使用Navicat连接上Mycat(账号密码就是server.xml中配置的):

mysql分库分表后分页查询怎么实现 mysql分表分库技术 实现_mycat_02


测试:

执行10条insert语句:

mysql分库分表后分页查询怎么实现 mysql分表分库技术 实现_mycat_03

查看那两个库中的表:

mysql分库分表后分页查询怎么实现 mysql分表分库技术 实现_分库分表_04

可以发现,是根据id对2取余来进行分库策略的。分库策略是在rule.xml中的function标签的class中指定的。


再来测试查询:

mysql分库分表后分页查询怎么实现 mysql分表分库技术 实现_mycat_05

可以发现,id并不是按照插入顺序来查询的,而是首先查第一张表,在查询第二张表,查询顺序是schema.xml 文件中定义的<dataNode>标签决定的。这就是分库分表中面临的一个问题。这时候id就不能再使用自增长了,而需要换成其他的,如uuid。