环境
- 操作系统:CentOS 7
- Mysql版本:Mysql8
- Mycat版本:Mycat1.6.7.6
需求
需要对用户表分片操作,要求分成3个分片
用户表结构
配置
涉及需要修改的配置文件,schema.xml、rule.xml
先看一下配置,下面解释
最简单的同一台机器,同一个数据库,分表配置示例
schema.xml配置文件
代码语言:javascript复制<?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配置文件
代码语言:javascript复制<?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>
配置解释
- 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的数据库
- rule.xml中部分标签 tableRule – name:分片规则名称 – columns:分片字段,该字段一般为表中的主键 – algorithm:使用那种分片算法对应的函数名 – function中需要注意一点,这里只说取模分片规则的,name=”count”对应的数值,需要和分片数量一直,比如本文subTables对应三个分片,这里的数值就要是3 其他标签解释参考:Mycat1.6.7.6安装与启动 中的标签解释
关于操作
开发者只需要通过操作Mycat服务去操作数据,不需要关心数据在哪个服务器哪个库中,比如你的后端你是Java,只需要将配置数据库的地方改为mycat的服务即可,CRUD和正常操作Mysql一样即可
比如
代码语言:javascript复制jdbc:mysql://127.0.0.1:8066/TESTDB...后面省略
- 8066:Mycat服务默认端口
- TESTDB:Mycat配置文件server.xml中配置的逻辑库名
操作的时候只需操作表名:t_user即可,比如查询
代码语言:javascript复制select * from t_user;
注意事项
如果使用Mycat1.x版本进行分库操作,需要注意跨库目前不支持JOIN操作,分表不分库Mycat1.6.7.6亲测默认支持JOIN操作,无须配置ER表关系