Mycat水平分片策略(水平分表拆分)

  • Post author:
  • Post category:其他


一、分片枚举算法

可以实现按照地区进行分表

根据不同的枚举(常量)进行分表存储


1.mysql中建立3个数据库分别为user_db1 user_db2 user_db3


2.在3个数据库中建立3个一样的数据表 order_info  order_info表中有字段name


3.配置mycat环境


schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- TESTDB1 是mycat的逻辑库名称,链接需要用的 -->
    <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
		<table name="order_info"  dataNode="dn1,dn2,dn3" rule="role2" />
	</schema>
        <!-- database 是MySQL数据库的库名 -->
	<dataNode name="dn1" dataHost="localhost1" database="user_db1" />
	<dataNode name="dn2" dataHost="localhost1" database="user_db2" />
	<dataNode name="dn3" dataHost="localhost1" database="user_db3" />
    <!--
    dataNode节点中各属性说明:
    name:指定逻辑数据节点名称;
    dataHost:指定逻辑数据节点物理主机节点名称;
    database:指定物理主机节点上。如果一个节点上有多个库,可使用表达式db$0-99,     表示指定0-99这100个数据库;

    dataHost 节点中各属性说明:
        name:物理主机节点名称;
        maxCon:指定物理主机服务最大支持1000个连接;
        minCon:指定物理主机服务最小保持10个连接;
        writeType:指定写入类型;
            0,只在writeHost节点写入;
            1,在所有节点都写入。慎重开启,多节点写入顺序为默认写入根据配置顺序,第一个挂掉切换另一个;
        dbType:指定数据库类型;
        dbDriver:指定数据库驱动;
        balance:指定物理主机服务的负载模式。
            0,不开启读写分离机制;
            1,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡;
            2,所有的readHost与writeHost都参与select语句的负载均衡,也就是说,当系统的写操作压力不大的情况下,所有主机都可以承担负载均衡;
-->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- 可以配置多个主从 -->
        <writeHost host="hostM1" url="192.168.3.60:3009" user="root" password="root">
            <!-- 可以配置多个从库 -->
            <readHost host="hostS2" url="192.168.3.60:3008" user="root" password="root" />
        </writeHost>
    </dataHost>
</mycat:schema>

指定表名为order_info 指定数据库集群 指定分片规则 为role2


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="role2">
             <rule>
                  <columns>name</columns>
                <algorithm>hash-int</algorithm>
                </rule>
    </tableRule>
	
	<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
		<property name="mapFile">partition-hash-int.txt</property>
		<property name="type">1</property>
		<property name="defaultNode">1</property>
	</function>
	
</mycat:rule>


<columns>name</columns>    指定表中字段 该字段决定存入哪个库

<algorithm>hash-int</algorithm>   规则方法


class=”io.mycat.route.function.PartitionByFileMap” 采用分片枚举算法


<property name=”mapFile”>partition-hash-int.txt</property>  指定枚举文件

wuhan=0
shanghai=1
suzhou=2


<property name=”type”>1</property> 表示枚举不为数值


<property name=”defaultNode”>1</property> 如果不在枚举中则默认存入节点1


4.启动mycat


练级mycat数据库 添加以下3条数据



同时mycat虚拟数据库中查询 可以将数据全部查询出来 包括分页 模糊查询等都支持

二、分片求模算法


根据id字段取模集群台数 得出的结果分别分配给不同节点。节点从0开始


比如1%3=1 分配到节点1  也就是user_db2


3%3 =0 分配到节点0  也就是user_db1


修改rule.xml文件 添加role1取模规则

<?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="role2">
		<rule>
			<columns>name</columns>
			<algorithm>hash-int</algorithm>
		</rule>
    </tableRule>
	
	<tableRule name="role1">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
	
	<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
		<property name="mapFile">partition-hash-int.txt</property>
		<property name="type">1</property>
		<property name="defaultNode">1</property>
	</function>
 
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!--指定分片数量,不可以被更改-->
        <property name="count">3</property>
	</function>
	
</mycat:rule>


这里需要注意的是 tableRule 需要放一起 function也需要放一起 不然启动时候会出现报错


schema.xml文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- TESTDB1 是mycat的逻辑库名称,链接需要用的 -->
    <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100">
	<table name="order_info"  dataNode="dn1,dn2,dn3" rule="role2" />
	<table name="user_info"  dataNode="dn1,dn2,dn3" rule="role1" /> 
    </schema>
        <!-- database 是MySQL数据库的库名 -->
    <dataNode name="dn1" dataHost="localhost1" database="user_db1" />
	<dataNode name="dn2" dataHost="localhost1" database="user_db2" />
	<dataNode name="dn3" dataHost="localhost1" database="user_db3" />
    <!--
    dataNode节点中各属性说明:
    name:指定逻辑数据节点名称;
    dataHost:指定逻辑数据节点物理主机节点名称;
    database:指定物理主机节点上。如果一个节点上有多个库,可使用表达式db$0-99,     表示指定0-99这100个数据库;

    dataHost 节点中各属性说明:
        name:物理主机节点名称;
        maxCon:指定物理主机服务最大支持1000个连接;
        minCon:指定物理主机服务最小保持10个连接;
        writeType:指定写入类型;
            0,只在writeHost节点写入;
            1,在所有节点都写入。慎重开启,多节点写入顺序为默认写入根据配置顺序,第一个挂掉切换另一个;
        dbType:指定数据库类型;
        dbDriver:指定数据库驱动;
        balance:指定物理主机服务的负载模式。
            0,不开启读写分离机制;
            1,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡;
            2,所有的readHost与writeHost都参与select语句的负载均衡,也就是说,当系统的写操作压力不大的情况下,所有主机都可以承担负载均衡;
-->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- 可以配置多个主从 -->
        <writeHost host="hostM1" url="192.168.43.66:3009" user="root" password="root">
            <!-- 可以配置多个从库 -->
            <readHost host="hostS2" url="192.168.43.66:3008" user="root" password="root" />
        </writeHost>
    </dataHost>
</mycat:schema>


添加  <table name=”user_info”  dataNode=”dn1,dn2,dn3″ rule=”role1″ />


启动mycat  添加测试数据



版权声明:本文为baiyan3212原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。