本篇前提:

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. Vuejs2.0构建一个彩票查询WebAPP(1)

    说明:本人也是刚接触VUE.js,作为一个学习笔记,旨在与初学者共同学习.其中编程语法错误或者写作水平刺眼,还望轻喷. 使用工具:Visual Studio Code.技术栈为vue2+vuex+ax ...

  2. 使用Xcode的Targets来管理开发和生产版本的构建

    如何创建一个新的Target 如何在Xcode中创建一个开发的target?我使用示例项目“todo”引导您一步一步完成整个过程..您也可以使用自己的项目并按照步骤: 1. 在项目的导航面板进入项目设 ...

  3. zoj 2317 Nice Patterns Strike Back(矩阵乘法)

    problemId=1317">http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=1317 给出一个n*m的矩阵( ...

  4. VC、IE、ASP环境下打印、预备的完美解决方式

    一种基于XML的报表开发工具,它支持从设计报表.调用API打印.预览,能支持分布式报表.方便报表的存储.转发. 在报表中能嵌入VBScript,能方便地訪问VB,VC的变量,能訪问COM组件.ADO等 ...

  5. eclipse部署maven web项目到tomcat服务器时,没有将lib、web.xml复制过去的解决办法

    我这几天在写项目的时候发现自己以前的项目能够访问,隔一段时间写的这个项目却不能够访问,没有发现代码的逻辑错,但是就是访问不了jsp页面,项目一发布就是出现404错误,后来发现原来是发布到tomcat上 ...

  6. hadoop集群环境配置成功与否查看方法

    1.Hadoop启动jobhistoryserver来实现web查看作业的历史运行情况,由于在启动hdfs和Yarn进程之后,jobhistoryserver进程并没有启动,需要手动启动jobhist ...

  7. 洛谷P1908 逆序对(归并排序)

    题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...

  8. 10款最好的Python IDE

    Python 的学习过程少不了集成开发环境(IDE)或者代码编辑器.这些 Python 开发工具帮助开发者加快使用 Python 开发的速度,提高效率.高效的代码编辑器或者 IDE 应该会提供插件,工 ...

  9. jquery实现瀑布流效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Vue给元素添加样式

    Vue中使用样式 绑定css 数组 <style> .red{ color:red } .thin{ font-size:18px } </style> <h1 :cla ...