环境

  • 操作系统:CentOS 7
  • Mysql版本:Mysql8
  • Mycat版本:Mycat1.6.7.6

需求

需要对用户表分片操作,要求分成3个分片 用户表结构

配置

涉及需要修改的配置文件,schema.xml、rule.xml 先看一下配置,下面解释

最简单的同一台机器,同一个数据库,分表配置示例

schema.xml配置文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1" dataNode="dn1">
<!-- 配置需要分片的表 -->
<table name="t_user" dataNode="dn1" subTables="t_user$1-3" rule="mod_rule"></table>
</schema>

<dataNode name="dn1" dataHost="localhost1" database="db1" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="jdbc:mysql://127.0.0.1:3306" user="root"
password="123456">
</writeHost>
</dataHost>

</mycat:schema>

rule.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

<tableRule name="mod_rule"> <!-- 分片规则名称,可随意填写,与schema.xml中rule="mod_rule"对应即可 -->
<rule>
<columns>user_id</columns> <!-- 对应真实数据表字段,一般是该表ID主键 -->
<algorithm>mod-long</algorithm> <!-- 使用哪个分片算法,要与下面函数名称对应 -->
</rule>
</tableRule>

<!-- 以下是官方提供的分片所涉及算法函数 -->
<!-- 暂时就是使用mod-long这一个函数 -->
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>

</mycat:rule>

配置解释

  1. schema.xml中部分标签 table

- name:如果进行分表操作了,该值为逻辑表表名,不需要存在对应的真实表 - dataNode:节点名称 - subTables:作用可以理解为包含哪些分片,对应的为真实表表名,例如本文章配置中subTables=”t_user$1-3”,也可以单独写,中间用英文逗号隔开,则需要在真实dn1节点对应的localhost1这台机器的db1数据库下创建t_user1、t_user2、t_user3三张表,表结构保持一致 本文示例: - rule:分片规则,值对应rule.xml中tableRule标签name值 dataNode - name:节点名称,可随意填写 - dataHost:对应dataHost标签中name值,保持一致即可 - database:对应dataHost中name值对应的dataHost那台机器中真实存在的数据库名称,比如像本文,需要提前创建好数据库库名为db1的数据库 2. rule.xml中部分标签 tableRule - name:分片规则名称 - columns:分片字段,该字段一般为表中的主键 - algorithm:使用那种分片算法对应的函数名 - function中需要注意一点,这里只说取模分片规则的,name=”count”对应的数值,需要和分片数量一直,比如本文subTables对应三个分片,这里的数值就要是3 其他标签解释参考:Mycat1.6.7.6安装与启动 中的标签解释

关于操作

开发者只需要通过操作Mycat服务去操作数据,不需要关心数据在哪个服务器哪个库中,比如你的后端你是Java,只需要将配置数据库的地方改为mycat的服务即可,CRUD和正常操作Mysql一样即可 比如

jdbc:mysql://127.0.0.1:8066/TESTDB...后面省略
  • 8066:Mycat服务默认端口
  • TESTDB:Mycat配置文件server.xml中配置的逻辑库名

操作的时候只需操作表名:t_user即可,比如查询

select * from t_user;

注意事项

如果使用Mycat1.x版本进行分库操作,需要注意跨库目前不支持JOIN操作,分表不分库Mycat1.6.7.6亲测默认支持JOIN操作,无须配置ER表关系