本篇前提:

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. dos 实用命令搜集

    dos 命令: 1.netstat -an 2.XP下打开凭证管理:  control keymgr.dll 3.刷新DHCP协议,重新自动获取IP *   ipconfig/release 命令来丢 ...

  2. py2exe打包python脚本

    在工作中遇到将python脚本转换成exe可执行程序的需求,通过查询可以使用py2exe来构建满足要求的程序,这里简要说明一下使用步骤. 一.py2exe是一个将python脚本转换成windows上 ...

  3. React开发实时聊天招聘工具 -第三章 React基础知识回顾

    function a (props) { return <h1>hello world{this.props.asd}</h1> } class a extends React ...

  4. Node书签

    1.开源项目 [译]过去一年25个惊人的开源Node.js项目(2018版) 百度网盘下载助手

  5. paste---合并文件的列。

    Linux paste命令用于合并文件的列. paste指令会把每个文件以列对列的方式,一列列地加以合并. 语法 paste [-s][-d <间隔字符>][--help][--versi ...

  6. 紫书 习题 10-16 UVa 1647 (高精度+递推)

    这道题我已经推出00和1过两步变成00了,可我没有继续做下去-- 后来看了博客发现自己已经做了90%了-- 可惜了,以后不要轻易放弃. 1的个数有个规律,就是每次都乘以2,因为0和1下一步都会变出1 ...

  7. 一个Web报表项目的性能分析和优化实践(六):设置MySQL的最大连接数(max_connections)

    在上一篇文章中"一个Web报表项目的性能分析和优化实践(二):MySQL数据库连接不够用(TooManyConnections)问题的一次分析和解决案例"提到,项目中新增几个数据库 ...

  8. springboot 前后端分离开发解决跨域访问

    最近新学习了Java EE开发框架springboot,我在使用springboot前后台分离开发的过程中遇到了跨域求问题.在网上寻找答案的过程中发现网上的解决方案大多比较零散,我在这里整理一个解决方 ...

  9. [Python] Wikipedia Crawler

    import time import urllib import bs4 import requests start_url = "https://en.wikipedia.org/wiki ...

  10. android Manifest.xml选项

    结构 继承关系 public final class Manifest extends Object java.lang.Object android.Manifest 内部类 class  Mani ...