使用MYCAT轻松实现MYSQL水平分片
2015-12-25 20:36
591 查看
完整文章下载地址: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
(2)定义规则:/src/main/resources/rule.xml
(3)规则文件:/src/main/resources/autopartition-long.txt
2、主键范围规则(auto-sharding-long)
(1)使用规则:/src/main/resources/schema.xml
(2)定义规则:/src/main/resources/rule.xml
(3)规则文件:/src/main/resources/autopartition-long.txt
三、 MYCAT分片测试
下文以使用分片枚举规则和主键范围规则分片为例:
1、分片枚举规则(sharding-by-intfile)
(1)插入两条sharding_id=10000的数据,数据被插入到dn1节点
1)语句1:explain insert into employee(id,name,sharding_id) values(1,’test1’,10000);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/25/2afc0ab11778f7a44d9856a44df6623b)
2)语句2:explain insert into employee(id,name,sharding_id) values(1,’test2’,10000);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/25/48960d480ef603fa5fc7f5a55d5a22d9)
(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);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/25/020d304e29c0310d8fa837b55170a961)
2)语句2:explain insert into travelrecord (id,user_id,traveldate,fee,days) values(6000001,’zhao’,’2015-12-10’,510.5,3);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/25/1fb9f948b444f5179e8e06ca3f6dec82)
四、 分片全局序列号(数据库方式)
分库以后MySQL的自增主键就不能使用了,我们可以把SEQUENCE生成功能存储过程放到一个数据库分片中,数据插入前先查询当前的SEQUENCE,然后再执行操作。
1、配置server.xml:
sequnceHandlerType 配置为 1,表示使用数据库库生成 sequence
2、创建MYCAT_SEQUENCE 表
3、创建 function
(1)创建mycat_seq_currval,获取当前 sequence的值
(2)创建mycat_seq_currval,获取下一个sequence值
(3)创建mycat_seq_currval,设置sequence 值
(4)增加权限,否则不能执行
(5)插入初始值,测试function
执行以下查询测试:
1) 查询1:SELECT MYCAT_SEQ_CURRVAL(‘article_seq’);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/25/449fb3fe5f76b77aa63a9d7314513841)
2) 查询2:SELECT MYCAT_SEQ_SETVAL(‘article_seq’, 2);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/25/56c9cdcb0b5dddf74ec27178657f2eed)
3) 查询3:SELECT MYCAT_SEQ_CURRVAL(‘article_seq’);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/25/63f543176c98b42e278721fcebb8c2c0)
4) 查询4:SELECT MYCAT_SEQ_NEXTVAL(‘article_seq’);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/25/ed61a03e79e65bfbd9708be5cb34586c)
5)查询5:SELECT MYCAT_SEQ_NEXTVAL(‘article_seq’);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201512/25/0c3f9650b09bb4025c505ad6e94c9f13)
6)查询6:SELECT MYCAT_SEQ_CURRVAL(‘article_seq’);
简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行切分到其他的数据库中,其中选择合适的切分规则至关重要,因为它决定了后续数据聚合的难易程度。
有几种典型的分片规则包括:
(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’);
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- Android之获取手机上的图片和视频缩略图thumbnails
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- 数据库链接字符串查询网站
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法