欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL(19) Mycat分片(分库分表)配置

程序员文章站 2022-05-08 19:43:19
...

一、前言

MySQL(17) 通过Docker搭建主从同步
MySQL(18) 通过Docker搭建Mycat实现读写分离

本文将基于主从复制,读写分离的环境基础上进行一个简单的分片(分库分表)配置
MySQL(19) Mycat分片(分库分表)配置

二、Mycat分片配置

mycat分片主要在scheam.xmlrule.xml这2个表中配置

scheam.xml:配置逻辑表以及对应使用的分片规则

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 逻辑库:TESTDB     限制每一条sql最多访问100条数据     指定数据节点:dn1 -->
    <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
    	<!-- 对`t_user`表进行分片,主键id,自增,数据节点为dn1,dn2,dn3,分片规则为`auto-sharding-long` -->
    	<table name="t_user" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    </schema>
    <!-- 指定数据节点对应指定的数据主机以及后端真实物理数据库 -->
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />
    <!-- 定义最大连接数,最小连接数,是否对后端的多个从库进行负载均衡,数据库类型,驱动... -->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    	<!-- 定义如何监测后端数据库是否健康 -->
        <heartbeat>select user()</heartbeat>
        <!-- 写数据库 -->
        <writeHost host="www.zhengqingya.com" url="www.zhengqingya.com:3310" user="root" password="root">
        	<!-- 读数据库 -->
            <readHost host="www.zhengqingya.com" url="www.zhengqingya.com:3311" user="root" password="root" />
        </writeHost>
    </dataHost>
</mycat:schema>

这里小编主要对t_user表进行分片,使用的分片规则为auto-sharding-long(每个库下的表中保存500万条数据),也就是说:
分了3个库(db1,db2,db3),这3个库下的t_user表分别保存500万条数据

  1. db1 : 1~5000000
  2. db2 : 5000001~10000000
  3. db3 : 10000001~15000000

详细的分片规则主要在rule.xml中定义,然后取tableRule标签中的name属性值即可
比如上面使用到的auto-sharding-long

<tableRule name="auto-sharding-long">
    <rule>
        <columns>id</columns>
        <algorithm>rang-long</algorithm>
    </rule>
</tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
    <property name="mapFile">autopartition-long.txt</property>
</function>

如果对多个表进行分片配置则配置多个table,指定相应的dataNoderule等信息即可

rule.xml :定义分片规则

在这里我们可以自定义分片规则,然后在schema.xml中使用

tableRule

  1. name : 对应schema.xml配置文件中table标签对应的rule属性,即逻辑表的分片规则
  2. columns : 指定拆分的列字段
  3. algorithm : 定义分片规则即具体的分片算法,对应function标签的name属性值

function

  1. name : 分片算法名
  2. class : 分片算法对应的具体的类
  3. property : 算法具体需要的一些属性,不同的算法对应的配置不同

下面贴出mycat默认的一些分片规则,实际应用中可根据自已的需求来自定义!

<?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="rule1">
        <rule>
            <columns>id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="rule2">
        <rule>
            <columns>user_id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="sharding-by-intfile">
        <rule>
            <columns>sharding_id</columns>
            <algorithm>hash-int</algorithm>
        </rule>
    </tableRule>
    <tableRule name="auto-sharding-long">
        <rule>
            <columns>id</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-murmur">
        <rule>
            <columns>id</columns>
            <algorithm>murmur</algorithm>
        </rule>
    </tableRule>
    <tableRule name="crc32slot">
        <rule>
            <columns>id</columns>
            <algorithm>crc32slot</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-month">
        <rule>
            <columns>create_time</columns>
            <algorithm>partbymonth</algorithm>
        </rule>
    </tableRule>
    <tableRule name="latest-month-calldate">
        <rule>
            <columns>calldate</columns>
            <algorithm>latestMonth</algorithm>
        </rule>
    </tableRule>

    <tableRule name="auto-sharding-rang-mod">
        <rule>
            <columns>id</columns>
            <algorithm>rang-mod</algorithm>
        </rule>
    </tableRule>

    <tableRule name="jch">
        <rule>
            <columns>id</columns>
            <algorithm>jump-consistent-hash</algorithm>
        </rule>
    </tableRule>

    <function name="murmur"
              class="io.mycat.route.function.PartitionByMurmurHash">
        <property name="seed">0</property><!-- 默认是0 -->
        <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
        <property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
        <!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
        <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
                用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
    </function>

    <function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
        <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
    </function>
    <function name="hash-int"
              class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
    </function>
    <function name="rang-long"
              class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">3</property>
    </function>

    <function name="func1" class="io.mycat.route.function.PartitionByLong">
        <property name="partitionCount">8</property>
        <property name="partitionLength">128</property>
    </function>
    <function name="latestMonth"
              class="io.mycat.route.function.LatestMonthPartion">
        <property name="splitOneDay">24</property>
    </function>
    <function name="partbymonth"
              class="io.mycat.route.function.PartitionByMonth">
        <property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2015-01-01</property>
    </function>

    <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
        <property name="mapFile">partition-range-mod.txt</property>
    </function>

    <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
        <property name="totalBuckets">3</property>
    </function>
</mycat:rule>

③ 重启mycat服务

三、创建表插入数据测试分片

这里注意要先在mysql主库上新建我们上面scheam.xml配置文件中配置的db1,db2,db3这3个库再连接mycat服务哦,不然连接mycat的时候会出现如下的问题

MySQL(19) Mycat分片(分库分表)配置

1、Navicat连接Mycat创建表t_user

温馨小提示:如果之前mycat中已经有了t_user表,即之前的操作中我们的mysql下已经存在一个db1库下的t_user表,但db2以及db3库下却没有的话,需要我们自己手动在db2,db3库下创建与db1库下t_user表相同的表结构,这里小编为了方便是直接将之前存在的t_user表删除后重新创建一个新的,但实际情况中建议不要这样操作哦,毕竟表里面是存在数据的,数据就是财富,如果吗,没有数据的话就随便怎么搞!

创建完成效果为主从数据库下的db1,db2,db3库下都会出现t_user表

MySQL(19) Mycat分片(分库分表)配置

2、插入数据

温馨小提示:在mycat中操作数据,mysql中刷新以查看效果哦~

① 插入id为1~5000000的数据

效果如下,只有db1库下存在数据,db2,db3库下均无数据
MySQL(19) Mycat分片(分库分表)配置

② 插入id为5000001~10000000的数据

效果如下,只有db2库下存在数据,db1,db3库下均无数据
MySQL(19) Mycat分片(分库分表)配置

③ 插入id为10000001~15000000的数据

效果如下,只有db3库下存在数据,db1,db2库下均无数据
MySQL(19) Mycat分片(分库分表)配置


最后我们一个简单的mycat分片配置就成功完成了~