环境:CentOS7,JDK1.8,mycat1.6,mysql5.7
本人刚刚学习到mycat,如果有什么不对的,请各位指出来,谢谢
Mycat 原理
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL 语句,首先对SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。下载安装
1.官方下载地址:http://dl.mycat.io/1.6-RELEASE/
2.解压:tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz,解压后是一个mycat文件夹,解压后的目录如下图:
3.在mysql中新建3个数据库db1,db2,db3,分别都建表item,建表SQL:
CREATE TABLE `item` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=205
;
4.配置mycat
4.1 配置schema.xmlrule:分片规则,mod-long表示对分片的主键字段id求模运算。
4.2 配置server.xml,sequnceHandlerType改成1,采用数据库方式,其他方式为:
0 表示使用本地文件方式
1 表示根据数据库来生成,就是我们自己配置的自增长
2 表示时间戳的方式 ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加)
3 zookeeper方式
5.在db1上建立sequence,SQL如下:
CREATE TABLE `mycat_sequence` (
`name` VARCHAR(50) NOT NULL,
`current_value` INT(11) NOT NULL,
`increment` INT(11) NOT NULL DEFAULT '100',
PRIMARY KEY (`name`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
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
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
6. 在表mycat_sequence插入数据:7.测试结果:插入数据的时候,db1,db2,db3轮流插入,主键自增,查询全部数据查询出来
再查询,表中已有数据:
数据分布:db1:
总结:利用mycat对数据进行分片成功