Mycat1.6.7.6对Mysql分表配置

2022-10-31 16:17:39 浏览数 (1)

环境

  • 操作系统: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>

配置解释

  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的数据库

  1. 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表关系

0 人点赞