本篇前提:

mycat配置正确,且能正常启动。

1、schema.xml

<table>标签:

dataNode -- 分片节点指定(取值:dataNode中的name属性值)
rule ------ 分片规则选择(取值:rule标签中的name属性值)
[root@dras-test conf]# vim schema.xml 

  1 <?xml version="1.0"?>

2 <!DOCTYPE mycat:schema SYSTEM "schema.dtd">

3 <mycat:schema xmlns:mycat="http://io.mycat/">

4 <schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100">

5 <!-- auto sharding by id (long) -->

6 <table name="t_person" dataNode="dn1,dn2" rule="mod-long" />

7 <table name="t_user" primaryKey="id" dataNode="dn1,dn2" rule="sharding-by-murmur" />

<!-- 全局表 -->

8 <!-- table name="province" type="global" dataNode="dn1,dn2,dn3" />

9
10 <table name="student" dataNode="dn1,dn2" rule="auto-sharding-long-sharejoin" />

11 <table name="score" dataNode="dn2,dn3" rule="auto-sharding-long-sharejoin" />

12 <table name="score" dataNode="dn1,dn2" rule="auto-sharding-long-sharejoin" />

13
<!-- ER分片 -->

14 <table name="customer" dataNode="dn1,dn2,dn3" rule="auto-sharding-long-customer">

15 <childTable name="orders" joinKey="customer_id" parentKey="id"/>

16 </table -->

17
18 <table name="user" primaryKey="id" dataNode="dn1,dn2" rule="mod-long-test">

19 <childTable name="cell" joinKey="user_id" parentKey="id"/>

20 <childTable name="note" joinKey="user_id" parentKey="id"/>

21 <childTable name="lit" joinKey="user_id" parentKey="id"/>

22 <childTable name="lit_usr" joinKey="user_id" parentKey="id"/>

23 </table>

24
25 </schema>

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

28 <dataNode name="dn2" dataHost="localhost1" database="db2" />

29 <dataNode name="dn3" dataHost="localhost1" database="db3" />

30
31 <dataHost name="localhost1" maxCon="500" minCon="100" balance="2"

32 writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
33 <heartbeat>select user()</heartbeat>

34
35 <writeHost host="hostM1" url="localhost:3306" user="root"

36 password="" >
37 </writeHost>

38
39 </dataHost>

40 </mycat:schema>

2、rule.xml

<tablerule>标签

columns—— 指定分片列的列名;

algorithm—- 选择分片算法(function标签中的name属性)

<function>标签

定义算法,class–分片算法类名及路径;

<count> 分片数,需要分成多少片;

<mapFile> 范围分片时使用的规则;

<type>默认值是0,表示分片列的值是整数,非0表示是字符串。

[root@dras-test conf]# vim rule.xml 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mycat:rule SYSTEM "rule.dtd">

<mycat:rule xmlns:mycat="http://io.mycat/">

<tableRule name="mod-long">

<rule>

<columns>person_id</columns>

<algorithm>mod-long</algorithm>

</rule>

</tableRule>

<tableRule name="mod-long-test">

<rule>

<columns>id</columns>

<algorithm>mod-long</algorithm>

</rule>

</tableRule>

<tableRule name="auto-sharding-long-customer">

<rule>

<columns>id</columns>

<algorithm>auto-sharding-long-customer</algorithm>
</rule>

</tableRule>

<tableRule name="auto-sharding-long-sharejoin">

<rule>

<columns>id</columns>

<algorithm>auto-sharding-long-sharejoin</algorithm>
</rule>

</tableRule>
<tableRule name="sharding-by-murmur">

<rule>

<columns>uuid</columns>

<algorithm>murmur</algorithm>

</rule>

</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">

<!-- how many data nodes -->

<property name="count">2</property>
</function>

<function name="auto-sharding-long-customer" class="io.mycat.route.function.AutoPartitionByLong">

<property name="mapFile">autopartition-long.txt</property>

</function>
<function name="auto-sharding-long-sharejoin" class="io.mycat.route.function.AutoPartitionByLong">

<property name="mapFile">autopartition-long-sharejoin.txt</property>

</function>

<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">

<property name="seed">0</property><!-- 默认是0 -->

<property name="type">1</property><!-- 默认是0, 表示integer, 非0表示string-->

<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">/usr/local/mycat/logs/bucketMapPath</property>

<!-- 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function>
</mycat:rule>

3、说明

对于以上配置文件,选择一个来说明,其他类推。

对t_person表:


在sechma.xml中:


<table name="t_person" dataNode="dn1,dn2" rule="mod-long" />


说明,将其分别存在分片节点dn1和dn2上, 分别对应实际MySQL数据库的db1和db2:


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

<dataNode name="dn2" dataHost="localhost1" database="db2" />


数据库db1和db2又在分片主机localhost1上,localhost1是连接的实际MySQL服务器,


<writeHost host="hostM1" url="localhost:3306" user="root" password="" >

因此,t_person表会被按照rule=’mod-long’被分别存储在实际MySQL服务器的db1和db2中。

在rule.xml中,


mod-long算法指定其分片里是id,分片算法是mod-long,对id列进行取模。


count=2,说明对2取模,


取模后值为0,存入dn1,取模后值为1,存入dn2.


4、验证

在mycat数据库中创建含id列的t_person表,插入5条数据:

[root@dras-test ~]# mysql -uroot -p123456 -h127.0.0.1 -P8066

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;

+----------+

| DATABASE |

+----------+

| mycatdb |

+----------+

1 row in set (0.00 sec)
mysql> use mycatdb;

Database changed

mysql>

mysql> create table t_person(id int(11) primary key, name varchar(32));

Query OK, 0 rows affected (0.04 sec)
mysql> desc t_person;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id | int(11) | NO | PRI | NULL | |

| name | varchar(32) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

2 rows in set (0.01 sec)
mysql>

mysql> insert into t_person(id,name) values(1,"Moxiao1"),(2,"Moxiao2"),(3,"Moxiao3"),(4,"Moxiao4"),(5,"Moxiao5");

Query OK, 5 rows affected (0.02 sec)

Records: 3 Duplicates: 0 Warnings: 0
mysql>

mysql> select * from t_person;

+----+---------+

| id | name |

+----+---------+

| 2 | Moxiao2 |

| 4 | Moxiao4 |

| 1 | Moxiao1 |

| 3 | Moxiao3 |

| 5 | Moxiao5 |

+----+---------+

5 rows in set (0.04 sec)


在实际的物理MySQL服务器中,查看:

[root@dras-test conf]# mysql -uroot -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 522063

Server version: 5.1.71-log Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| db1 |

| db2 |

| db3 |

| estudy |

| mysql |

| test |

| yundras |

+--------------------+

8 rows in set (0.00 sec)
mysql> select * from db1.t_person;

+----+---------+

| id | name |

+----+---------+

| 2 | Moxiao2 |

| 4 | Moxiao4 |

+----+---------+

2 rows in set (0.00 sec)
mysql> select * from db2.t_person;

+----+---------+

| id | name |

+----+---------+

| 1 | Moxiao1 |

| 3 | Moxiao3 |

| 5 | Moxiao5 |

+----+---------+

3 rows in set (0.00 sec)


t_person表成功被mycat自动分散到db1和db2两个库的t_person中。

解决单表数据量大的问题。在以分片列为条件进行查询时,会先查找其所在的分片,缩小查找范围。

mysql> explain select * from t_person where id=3;

+-----------+-----------------------------------------------+

| DATA_NODE | SQL |

+-----------+-----------------------------------------------+

| dn2 | SELECT * FROM t_person WHERE id = 3 LIMIT 100 |

+-----------+-----------------------------------------------+

1 row in set (0.01 sec)


            <link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/markdown_views-d4dade9c33.css">
</div>

MyCat:对MySQL数据库进行分库分表的更多相关文章

  1. 实现对MySQL数据库进行分库/分表备份(shell脚本)

    工作中,往往数据库备份是件非常重要的事情,毕竟数据就是金钱,就是生命!废话不多,下面介绍一下:如何实现对MySQL数据库进行分库备份(shell脚本) Mysq数据库dump备份/还原语法: mysq ...

  2. Mycat安装并实现mysql读写分离,分库分表

    Mycat安装并实现mysql读写分离,分库分表 一.安装Mycat 1.1 创建文件夹 1.2 下载 二.mycat具体配置 2.1 server.xml 2.2 schema.xml 2.3 se ...

  3. Docker安装Mycat并实现mysql读写分离,分库分表

    Docker安装Mycat并实现mysql读写分离,分库分表 一.拉取mycat镜像 二.准备挂载的配置文件 2.1 创建文件夹并添加配置文件 2.1.1 server.xml 2.1.2 serve ...

  4. Mysql中的分库分表

    mysql中的分库分表分库:减少并发问题分表:降低了分布式事务分表 1.垂直分表 把其中的不常用的基础信息提取出来,放到一个表中通过id进行关联.降低表的大小来控制性能,但是这种方式没有解决高数据量带 ...

  5. MySQL纯透明的分库分表技术还没有

    MySQL纯透明的分库分表技术还没有  种树人./oneproxy --proxy-address=:3307 --admin-username=admin --admin-password=D033 ...

  6. mysql数据库为什么要分表和分区?

    一般下载的源码都带了MySQL数据库的,做个真正意义上的网站没数据库肯定不行. 数据库主要存放用户信息(注册用户名密码,分组,等级等),配置信息(管理权限配置,模板配置等),内容链接(html ,图片 ...

  7. mycat+ mysql集群 分库分表

    mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...

  8. 【MySQL】数据库(分库分表)中间件对比

    分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表 ...

  9. Mycat教程---数据库的分库分表

    mycat介绍 介绍在官方网站上有比较详细的介绍,在这里复制粘贴没什么意思,大家到官网上看 官网链接 前置条件 本教程是在window环境下运行的,实际生产推荐在Linux上运行. 必备条件(自行安装 ...

随机推荐

  1. IBM将收购Linux发行商红帽公司,继续发力云计算市场

    10月29日凌晨消息,IBM和Red Hat当地时间星期日联合宣布,IBM将以340亿美元收购红帽公司(Red Hat).根据两家公司发表的一份联合声明,IBM将以每股190美元的价格,以现金方式收购 ...

  2. Swift学习笔记(13)--属性 (Properties)

    普通属性用var和let即可,本文不做详述 1.延迟存储属性 延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性.在属性声明前使用@lazy来标示一个延迟存储属性. class DataImp ...

  3. codevs 1019 集合论与图论

    1019 集合论与图论  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 集合论与图论对于小松来说 ...

  4. Intersection between a 2d line and a conic in OpenCASCADE

    Intersection between a 2d line and a conic in OpenCASCADE eryar@163.com Abstract. OpenCASCADE provid ...

  5. js---11闭包

    //匿名立即调用函数 (function(){//把a,b,f全部隐藏在函数中,外部访问不到, var a = 5; var b = 6; function f(){ alert(a); } wind ...

  6. python-excel操作之xlrd

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++操作excel文件+++++++++++++++++ ...

  7. javafx KeyFrame

    import javafx.animation.Animation; import javafx.animation.KeyFrame; import javafx.animation.Timelin ...

  8. px、em、rem、vw、vh、vm、rpx这些单位的

    px是像素 em是参考父元素的font-size的倍数 rem是参考根元素的font-size 常用于响应式,一般会让html的font-size:625%,body的大小为.16rem.这样1rem ...

  9. python3 requests 模块 json参数和data参数区别

    json 表示使用application/json方式提交请求 data 使用application/form-urlencode方式提交请求

  10. Oracle学习总结(8)—— 面向程序员的数据库访问性能优化法则

    特别说明: 1.  本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2.  本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...