完整文章下载地址:http://download.csdn.net/detail/dreamcode/9383516

简单来说,我们能够将数据的水平切分理解为是依照数据行的切分。就是将表中的某些行切分到一个数据库,而另外的某些行切分到其它的数据库中。当中选择合适的切分规则至关重要,由于它决定了兴许数据聚合的难易程度。

有几种典型的分片规则包含:

(1)依照用户主键ID求模。将数据分散到不同的数据库。具有同样数据用户的数据都被分散到一个库中。

(2)依照日期。将不同月甚至日的数据分散到不同的库中。

(3)依照某个特定的字段求摸,或者依据特定范围段分散到不同的库中。

一、 MYCAT经常使用分片规则

MYCAT经常使用的分片规则例如以下,另外另一些其它分片方式这里不所有列举:

(1)分片枚举:sharding-by-intfile

(2)主键范围:auto-sharding-long

(3)一致性hash:sharding-by-murmur

(4)字符串hash解析:sharding-by-stringhash

(5)按日期(天)分片:sharding-by-date

(6)按单月小时拆分:sharding-by-hour

(6)自然月分片:sharding-by-month

二、 MYCAT分片配置说明

下文以使用分片枚举规则和主键范围规则分片为例:

1、分片枚举规则(sharding-by-intfile)

(1)使用规则:/src/main/resources/schema.xml

        <table name="employee" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile" />

(2)定义规则:/src/main/resources/rule.xml

    <tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule> <function name="hash-int"
class="org.opencloudb.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>

(3)规则文件:/src/main/resources/autopartition-long.txt

10000=0
10010=1

2、主键范围规则(auto-sharding-long)

(1)使用规则:/src/main/resources/schema.xml

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />

(2)定义规则:/src/main/resources/rule.xml

    <tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule> <function name="rang-long"
class="org.opencloudb.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>

(3)规则文件:/src/main/resources/autopartition-long.txt

# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2

三、 MYCAT分片測试

下文以使用分片枚举规则和主键范围规则分片为例:

1、分片枚举规则(sharding-by-intfile)

(1)插入两条sharding_id=10000的数据。数据被插入到dn1节点

1)语句1:explain insert into employee(id,name,sharding_id) values(1,’test1’,10000);

2)语句2:explain insert into employee(id,name,sharding_id) values(1,’test2’,10000);

(2)插入两条id范围在500M-1000M的数据,数据被插入到dn2节点

1)语句1:explain insert into travelrecord (id,user_id,traveldate,fee,days) values(5000001,’zhao’,’2015-12-10’,510.5,3);

2)语句2:explain insert into travelrecord (id,user_id,traveldate,fee,days) values(6000001,’zhao’,’2015-12-10’,510.5,3);

四、 分片全局序列号(数据库方式)

分库以后MySQL的自增主键就不能使用了。我们能够把SEQUENCE生成功能存储过程放到一个数据库分片中。数据插入前先查询当前的SEQUENCE,然后再运行操作。

1、配置server.xml:

sequnceHandlerType 配置为 1,表示使用数据库库生成 sequence

<system><property name="sequnceHandlerType">1</property></system>

2、创建MYCAT_SEQUENCE 表

DROP TABLE
IF EXISTS MYCAT_SEQUENCE; CREATE TABLE MYCAT_SEQUENCE (
NAME VARCHAR (50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 100,
PRIMARY KEY (NAME)
) ENGINE = INNODB;

3、创建 function

(1)创建mycat_seq_currval。获取当前 sequence的值

DROP FUNCTION
IF EXISTS `mycat_seq_currval`;
DELIMITER ;; CREATE DEFINER = `root`@`%` FUNCTION `mycat_seq_currval` (seq_name VARCHAR(50)) RETURNS VARCHAR (64) CHARSET latin1 DETERMINISTIC
BEGIN DECLARE retval VARCHAR (64) ;
SET retval = "-999999999,null" ; SELECT
concat(
CAST(current_value AS CHAR),
",",
CAST(increment AS CHAR)
) INTO retval
FROM
MYCAT_SEQUENCE
WHERE
NAME = seq_name ; RETURN retval ;
END

(2)创建mycat_seq_currval。获取下一个sequence值

DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;; CREATE DEFINER = `root`@`%` FUNCTION `mycat_seq_nextval` (seq_name VARCHAR(50)) RETURNS VARCHAR (64) CHARSET latin1 DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment
WHERE
NAME = seq_name ; RETURN mycat_seq_currval (seq_name) ;
END;;
DELIMITER ;

(3)创建mycat_seq_currval,设置sequence 值

DROP FUNCTION
IF EXISTS `mycat_seq_setval`;
DELIMITER ;; CREATE DEFINER = `root`@`%` FUNCTION `mycat_seq_setval` (
seq_name VARCHAR (50),
VALUE
INTEGER
) RETURNS VARCHAR (64) CHARSET latin1 DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value =
VALUE
WHERE
NAME = seq_name ; RETURN mycat_seq_currval (seq_name) ;
END;;
DELIMITER ;

(4)添加权限。否则不能运行

mysql > GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY ".";

QUERY OK,
0 rows affected (0.00 sec) mysql > FLUSH PRIVILEGES; QUERY OK,
0 rows affected (0.00 sec)

(5)插入初始值。測试function

INSERT INTO MYCAT_SEQUENCE VALUES ('article_seq', 1, 1);

运行下面查询測试:

1) 查询1:SELECT MYCAT_SEQ_CURRVAL(‘article_seq’);

2) 查询2:SELECT MYCAT_SEQ_SETVAL(‘article_seq’, 2);

3) 查询3:SELECT MYCAT_SEQ_CURRVAL(‘article_seq’);

4) 查询4:SELECT MYCAT_SEQ_NEXTVAL(‘article_seq’);

5)查询5:SELECT MYCAT_SEQ_NEXTVAL(‘article_seq’);

6)查询6:SELECT MYCAT_SEQ_CURRVAL(‘article_seq’);

使用MYCAT轻松实现MYSQL水平分片的更多相关文章

  1. LVS+MYCAT读写分离+MYSQL同步部署手册(第三版)

    1      配置MYSQL主备同步 1.1    测试环境 mysql版本:5.6.24: 操作系统内核版本:Linux-3.13-0-32 主数据库IP:192.168.10.3: 主数据库名:d ...

  2. LVS+MYCAT+读写分离+MYSQL主备同步部署手册

    LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1          配置MYSQL主备同步…. 2 1.1       测试环境… 2 1.2       配置主数据库… 2 1.2.1  ...

  3. 【转载】LVS+MYCAT+读写分离+MYSQL主备同步部署手册(邢锋)

    LVS+MYCAT+读写分离+MYSQL主备同步部署手册 1          配置MYSQL主备同步…. 2 1.1       测试环境… 2 1.2       配置主数据库… 2 1.2.1  ...

  4. 轻松理解MYSQL MVCC 实现机制

    轻松理解MYSQL MVCC 实现机制 转载https://blog.csdn.net/whoamiyang/article/details/51901888 1. MVCC简介 1.1 什么是MVC ...

  5. Docker安装Mycat并实现mysql读写分离,分库分表

    Docker安装Mycat并实现mysql读写分离,分库分表 一.拉取mycat镜像 二.准备挂载的配置文件 2.1 创建文件夹并添加配置文件 2.1.1 server.xml 2.1.2 serve ...

  6. mycat使用之MySQL单库分表及均分数据

    转载自 https://blog.csdn.net/smilefyx/article/details/72810531 1.首先在Mycat官网下载安装包,这里就以最新的1.6版本为例,下载地址为:  ...

  7. mycat配置实现mysql读写分离

    需要先把mysql的主从复制配置好,然后才可以开始mycat的配置 m ysql主从复制配置:https://www.cnblogs.com/renjianjun/p/9093062.html myc ...

  8. 如何轻松实现MySQL数据库的读写分离和负载均衡?

    配置好了 Mysql 的主从复制结构后,我们希望实现读写分离,把读操作分散到从服务器中,并且对多个从服务器能实现负载均衡.读写分离和负载均衡是 Mysql 集群的基础需求,MaxScale 就可以帮着 ...

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

    本篇前提: mycat配置正确,且能正常启动. 1.schema.xml <table>标签: dataNode -- 分片节点指定(取值:dataNode中的name属性值) rule ...

随机推荐

  1. NSPredicate 应用 --数组如何一键去重,如何一行代码筛选,请慢慢看来

    1.去重 NSArray * uniqueVarValueArray= [origArray valueForKeyPath:@"@distinctUnionOfObjects.VarKey ...

  2. 【hibernate/JPA】对实体类的的多个字段建立唯一索引,达到复合主键的效果【spring boot】注解创建唯一索引和普通索引

    对实体类的的多个字段建立唯一索引,达到复合主键的效果 package com.sxd.swapping.domain; import lombok.Getter; import lombok.Sett ...

  3. ASP.NET 5 简介

    来源https://docs.asp.net/en/latest/conceptual-overview/aspnet.html ASP.NET 5 是ASP.NET的重新设计. 什么是ASP.NET ...

  4. Android Server Push - MQTT推送实现tokudu

    转自:http://www.juapk.com/thread-2834-1-1.html 项目说明:采用MQTT协议实现Android推送消息传输协议:IBM的MQTT协议 JAR包地址:下载服务器安 ...

  5. 1019(C++)

    计算n个数的最小公倍数,可用欧几里得算法计算两个数字的最大公约数,再计算两个数最小公倍数 有了2个数最小公倍数算法就简单了,即为:计算第一和第二个数得到最小公倍数lc,再计算lc和第三个数最小公倍数. ...

  6. 在项目中引用android.support.v7

    在Android开发中,新建的项目可能因为缺少对sopport工程的引用而报错,可以这样解决. 1.项目右键 --> import --> Android --> Existing ...

  7. mysql误操作后通过binlog恢复,同时解决tmp目录满的问题

    注意: 本文的恢复,并不是基于恢复某个时间点的全量备份后的增量恢复,而是指在现有数据库基础上基于binlog的恢复.适用于较小的数据误操作. 提取日志文件为sql语句: /usr-ext/local/ ...

  8. Php 中如何将内容写入log日志中

    $Str = '你想要存的内容'; file_put_contents('abc.log', "\r\n\r\n". $Str, FILE_APPEND);     FILE_AP ...

  9. 微信小程序 - 豆瓣同城

    代码地址如下:http://www.demodashi.com/demo/12121.html 一.准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com/ ...

  10. UINavigationbar/UINavigationItem/UITabBar/UITabButton/UITabBarItem粑粑粑粑~

    看着标题是不是乱的一塌糊涂...... . 在开发中,你非常可能就理不清这些关系,刚好闲的蛋疼,来整理一下吧. 一.UINavigationBar.UINavigationItem.UIBarButt ...