该篇主要是解释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配置的对应起来。
使用Navicat连接上Mycat(账号密码就是server.xml中配置的):
测试:
执行10条insert语句:
查看那两个库中的表:
可以发现,是根据id对2取余来进行分库策略的。分库策略是在rule.xml中的function标签的class中指定的。
再来测试查询:
可以发现,id并不是按照插入顺序来查询的,而是首先查第一张表,在查询第二张表,查询顺序是schema.xml 文件中定义的<dataNode>标签决定的。这就是分库分表中面临的一个问题。这时候id就不能再使用自增长了,而需要换成其他的,如uuid。