MyCat:对MySQL数据库进行分库分表

本篇前提:
mycat配置正确,且能正常启动。

1、schema.xml

<table>标签:

dataNode -- 分片节点指定(取值:dataNode中的name属性值)rule ------ 分片规则选择(取值:rule标签中的name属性值)
  • 1
  • 2
  • 3
[[email protected] 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

2、rule.xml

<tablerule>标签
columns—— 指定分片列的列名;
algorithm—- 选择分片算法(function标签中的name属性)
<function>标签
定义算法,class–分片算法类名及路径;
<count> 分片数,需要分成多少片;
<mapFile> 范围分片时使用的规则;
<type>默认值是0,表示分片列的值是整数,非0表示是字符串。

[[email protected] 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

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条数据:

[[email protected] ~]# mysql -uroot -p123456 -h127.0.0.1 -P8066Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 1Server 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 itsaffiliates. Other names may be trademarks of their respectiveowners.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 changedmysql> 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: 0mysql> mysql> select * from t_person;+----+---------+| id | name    |+----+---------+|  2 | Moxiao2 ||  4 | Moxiao4 ||  1 | Moxiao1 ||  3 | Moxiao3 ||  5 | Moxiao5 |+----+---------+5 rows in set (0.04 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

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

[[email protected] conf]# mysql -uroot -pEnter password: Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 522063Server version: 5.1.71-log Source distributionCopyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

原文地址:https://www.cnblogs.com/jpfss/p/8205385.html

时间: 2024-08-14 20:21:49

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

数据库-数据库设计-分库分表

为什么要分库分表 分库分表的设计 带来的问题 扩容 分布式事务 多个路由字段怎么设置 关于分库分表最全的一篇文章 这里介绍设计分库分表框架时应该考虑的设计要点,并给出相应的解决方案. 一.整体的切分方式 简单来说,数据的切分就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)中,以达到分散单台设备负载的效果,即分库分表. 数据的切分根据其切分规则的类型,可以分为如下两种切分模式. 垂直(纵向)切分:把单一的表拆分成多个表,并分散到不同的数据库(主机)上. 水平(横

Mysql中的分库分表

mysql中的分库分表分库:减少并发问题分表:降低了分布式事务分表1.垂直分表把其中的不常用的基础信息提取出来,放到一个表中通过id进行关联.降低表的大小来控制性能,但是这种方式没有解决高数据量带来的性能损耗.优点1.拆分后业务清楚,达到专库专用.2.可以实现热数据和冷数据的分离,将不经常变化的数据和变动较大的数据分散到不同的库/表里面.3.便于维护.缺点1.不能解决数据量大带来的性能损耗,读写的压力依旧很大.2.不同的业务不能夸库关联,只能通过业务关联.2.水平分表以某个字段按照一定的规则将一

MySQL如何实现分库分表,如何提高查询效率

本人没有做过电商平台,但了解其中的道道,今天闲来无事,说说其中的道道.下边我要开始表演了. 在大型电商网站中,随着业务的增多,数据库中的数据量也是与日俱增,这时候就要将数据库进行分库分表了. 1.如何分库分表? 两种解决方案:垂直拆分.水平拆分 垂直拆分:根据业务进行拆分,比如可以将一张表中的多个字段拆成两张表,一张是不经常更改的,一张是经常改的. 水平拆分:即根据表来进行分割:比如user表可以拆分为user0,.user1.user2.user3.user4等 2.分库分表之后如何实现联合查

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

MySQL纯透明的分库分表技术还没有 种树人./oneproxy --proxy-address=:3307 --admin-username=admin --admin-password=D033E22AE348AEB5660FC2140AEC35850C4DA997 --proxy-master-addresses=172.16.132.87:[email protected] --proxy-master-addresses=172.16.3.92:[email protected] --

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

一般下载的源码都带了MySQL数据库的,做个真正意义上的网站没数据库肯定不行. 数据库主要存放用户信息(注册用户名密码,分组,等级等),配置信息(管理权限配置,模板配置等),内容链接(html ,图片,声音,视频等等的路径).那mysql数据库为什么要分表和分区? 为什么要分表和分区? 我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且 由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. mysql 中有一种机制是表锁定和行锁定,是为了保证数据的完整性

数据库(分库分表)中间件对比

转自:http://www.cnblogs.com/cangqiongbingchen/p/7094822.html 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表呢,还是一张表.分区可以把表分到不同的硬盘上,但不能分配到不同服务器上. 优点:数据不存在多个副本,不必进行数据复制,性能更高. 缺点:分区策略必须经过充分考虑,避免多个分区之间的数

【数据库】分库分表策略

关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数.处理能力都有限.当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库.优化索引,做很多操作时性能仍下降严重.此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间. 数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位.整合.数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的

【转】数据库的分库分表基本思想

Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题.不太严格的讲,对于海量数据的数据库,如果是因为表多而数据多,这时候适合使用垂直切分,即把关系紧密(比如同一模块)的表切分出来放在一个server上.如果表并不多,但每张表的数据非常多,这时候适合水平切分,即把表的数据按某种规则(比如按ID散列)切分到多个数据库(server)上.当然,现实中更多是这两种情况混杂在一起,这时候需要根据实际情况做出选择,也可能会综合使用垂直与水平

mysql主从同步分库分表同步

一.mysql数据库的安装 分别在master 和slave上源码安装mysql数据库 1.1 安装相关包1.1.1 cmake软件cd /home/oldboy/tools/tar xf cmake-2.8.8.tar.gzcd cmake-2.8.8./configure#CMake has bootstrapped.  Now run gmake.gmakegmake installcd ../ 1.1.2 依赖包yum install ncurses-devel -y 1.2 开始安装m