本篇前提:

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. react基础用法一(在标签中渲染元素)

    react基础用法一(渲染元素) 如图所示最简单的变量使用方法 格式 let 变量名称 = 赋值: 渲染格式直接用 {变量名称} 就可以直接渲染到页面 如图所示第二种渲染方法 格式 const 变量名 ...

  2. IDEA 官方教程

    https://www.jetbrains.com/help/idea/discover-intellij-idea.html#UserInterface

  3. POJ——T 3067 Japan

    http://poj.org/problem?id=3067 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29474   ...

  4. Xposed框架之函数Hook学习

    作者:Fly2015 Xposed是Android下Java层的开源Hook框架类似的有cydiasubstrate框架而且据说cydiasubstrate框架能实现Android的Java层和Nat ...

  5. Dojo Chart之经常使用统计图

    非常多做web的都知道,在非常多web系统中会涉及到一些统计图.比如饼状图,柱状图.趋势图.以及叠加图等.提到这儿,做web的都非常熟悉的,jquery的highcharts就能搞定全部的涉及到统计图 ...

  6. UI_搭建MVC

    新建RootViewController 继承于 UIViewController 新建RootView 继承于 UIView AppDelegate.m 中引入 #import "Root ...

  7. Spring有用功能--Profile、WebService、缓存、消息、ORM

    本篇介绍一些Spring与其它框架结合的有用功能,包含:Apache CXF WebService框架.Redis缓存.RabbitMQ消息.MyBatis框架. 另外对于Profile,也是Spri ...

  8. 利用JAVA反射机制实现调用私有方法

    1.fragment是AccessibilityFragment的對象.须要被調用的方法的類. setAccessible(true)并非将方法的訪问权限改成了public.而是取消java的权限控制 ...

  9. home.pl 正在促销,一些域名免费(终止于2017.4.4)

    home.pl 正在促销,一些域名免费(终止于2017.4.4) home.pl 成立于1997年,是波兰顶尖的互联网服务公司.专注于域名登记,托管网站,保持电子邮件帐户等.  home.pl 正在促 ...

  10. 自定义控件学习——下拉刷新ListView

    效果 开始用Android Studio写了,还有挺多不明白这IDE用法的地方....蛋疼 主要思路 1. 添加了自定义的头布局    2. 默认让头布局隐藏setPadding.设置 -自身的高度  ...