MyCat:对MySQL数据库进行分库分表
本篇前提:
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数据库进行分库分表的更多相关文章
- 实现对MySQL数据库进行分库/分表备份(shell脚本)
工作中,往往数据库备份是件非常重要的事情,毕竟数据就是金钱,就是生命!废话不多,下面介绍一下:如何实现对MySQL数据库进行分库备份(shell脚本) Mysq数据库dump备份/还原语法: mysq ...
- Mycat安装并实现mysql读写分离,分库分表
Mycat安装并实现mysql读写分离,分库分表 一.安装Mycat 1.1 创建文件夹 1.2 下载 二.mycat具体配置 2.1 server.xml 2.2 schema.xml 2.3 se ...
- Docker安装Mycat并实现mysql读写分离,分库分表
Docker安装Mycat并实现mysql读写分离,分库分表 一.拉取mycat镜像 二.准备挂载的配置文件 2.1 创建文件夹并添加配置文件 2.1.1 server.xml 2.1.2 serve ...
- Mysql中的分库分表
mysql中的分库分表分库:减少并发问题分表:降低了分布式事务分表 1.垂直分表 把其中的不常用的基础信息提取出来,放到一个表中通过id进行关联.降低表的大小来控制性能,但是这种方式没有解决高数据量带 ...
- MySQL纯透明的分库分表技术还没有
MySQL纯透明的分库分表技术还没有 种树人./oneproxy --proxy-address=:3307 --admin-username=admin --admin-password=D033 ...
- mysql数据库为什么要分表和分区?
一般下载的源码都带了MySQL数据库的,做个真正意义上的网站没数据库肯定不行. 数据库主要存放用户信息(注册用户名密码,分组,等级等),配置信息(管理权限配置,模板配置等),内容链接(html ,图片 ...
- mycat+ mysql集群 分库分表
mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...
- 【MySQL】数据库(分库分表)中间件对比
分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表 ...
- Mycat教程---数据库的分库分表
mycat介绍 介绍在官方网站上有比较详细的介绍,在这里复制粘贴没什么意思,大家到官网上看 官网链接 前置条件 本教程是在window环境下运行的,实际生产推荐在Linux上运行. 必备条件(自行安装 ...
随机推荐
- codeforces1114D. Flood Fill(区间Dp)
传送门: 解题思路: 区间Dp,发现某一个区间修改后区间颜色一定为左边或右边的颜色. 那么只需要设方程$f_(l,r,0/1)$表示区间$[l,r]$染成左/右颜色的最小代价 转移就是枚举左右颜色就好 ...
- 学习《深度学习与计算机视觉算法原理框架应用》《大数据架构详解从数据获取到深度学习》PDF代码
<深度学习与计算机视觉 算法原理.框架应用>全书共13章,分为2篇,第1篇基础知识,第2篇实例精讲.用通俗易懂的文字表达公式背后的原理,实例部分提供了一些工具,很实用. <大数据架构 ...
- 紫书 例题 9-1 UVa 1025 ( DAG的动态规划)
影响到状态的只有时间和在哪个车站(空间),所以可以设f[i][j]是时刻i的时候在第j个车站的最少等待时间 因为题目中的等待时间显然是在0时刻1车站,所以答案为f[0][1],那么就提醒我们从大推到小 ...
- ubuntu下vim中内容拷贝到浏览器
在vim中编辑好了代码想要复制出来到浏览器或者其它地方.用yy复制后去别的地方粘帖发现根本不是当初复制的内容,非常头疼-- 这是由于vim中有它自己的一套剪贴板系统(clipboard).这套系统和u ...
- 彻查网络局部网段内Ping时断时续的问题
前两天须要安装2台server,结果前期一直有问题的网络又来了,明明vlan内能ping通,可是与vlan外却ping不同. 这个现象非常像是arp病毒,于是周末的时间我们就进行了一次彻底的排查,一定 ...
- 详解Android插件化开发-资源访问
动态加载技术(也叫插件化技术),当项目越来越庞大的时候,我们通过插件化开发不仅可以减轻应用的内存和CPU占用,还可以实现热插拔,即在不发布新版本的情况下更新某些模块. 通常我们把安卓资源文件制 ...
- elasticsearch index 之 create index(二)
创建索引需要创建索引并且更新集群index matedata,这一过程在MetaDataCreateIndexService的createIndex方法中完成.这里会提交一个高优先级,AckedClu ...
- 59.C++与正则表达式
regex_match 整个字符串是否匹配 (通过cmatch存储匹配的结果),match[0]代表整个匹配序列,match[1]代表第1个匹配后的子序列,match[2]代表第2个匹配后的子序列 代 ...
- js闭包注意事项
/关于闭包使用应该注意的 // 1 闭包在父函数每次调用都会产生不同的闭包 // 2 闭包中子函数使用父函数变量的变量不是复制 是引用 // 3 闭包在循环中使用
- C# 正整数和非零正整数校验
/// <summary> /// 1. 校验正整数(包含0) /// </summary> public static bool isInterger(string str) ...