博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mycat【数据库方式】实现全局序列号
阅读量:6436 次
发布时间:2019-06-23

本文共 3941 字,大约阅读时间需要 13 分钟。

hot3.png

说明:本文参考mycat官方提供的文档,结合自己的实践以及理解,做出如下整理,并附带一个分库分表的插入数据例子。 

原理 
在数据库中建立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment int类型每次读取多少个sequence,假设为K)等信息; 
Sequence获取步骤: 
1)当初次使用该sequence时,根据传入的sequence名称,从数据库这张表中读取current_value,和increment到MyCat中,并将数据库中的current_value设置为原current_value值+increment值; 
2)MyCat将读取到current_value+increment作为本次要使用的sequence值,下次使用时,自动加1,当使用increment次后,执行步骤1)相同的操作. 
3)MyCat负责维护这张表,用到哪些sequence,只需要在这张表中插入一条记录即可。若某次读取的sequence没有用完,系统就停掉了,则这次读取的sequence剩余值不会再使用。 
配置方式 
server.xml配置:

1

注:sequnceHandlerType 需要配置为1,表示使用数据库方式生成sequence. 

数据库配置: 
1)创建sequence表

CREATE TABLE MYCAT_SEQUENCE (   name VARCHAR (50) NOT NULL comment  "名称",   current_value INT NOT NULL  comment  "当前值",   increment INT NOT NULL DEFAULT 100  comment  "步长",   PRIMARY KEY (name)) ENGINE = INNODB;

2)创建相关function

#取当前squence的值DROP FUNCTION IF EXISTS mycat_seq_currval;DELIMITER $$CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50))RETURNS VARCHAR(64) CHARSET 'utf8'BEGINDECLARE retval VARCHAR(64);SET retval='-999999999,NULL';SELECT CONCAT(CAST(current_value AS CHAR),',',CAST(increment AS CHAR)) INTO retval FROMMYCAT_SEQUENCE WHERE NAME = seq_name;RETURN retval;END$$DELIMITER ;#设置 sequence 值DROP FUNCTION IF EXISTS mycat_seq_setval;DELIMITER $$CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),VALUE INTEGER) RETURNS VARCHAR(64) CHARSET 'utf8'BEGIN   UPDATE MYCAT_SEQUENCE SET current_value = VALUE    WHERE NAME = seq_name;RETURN mycat_seq_currval(seq_name);END$$DELIMITER ;#取下一个sequence的值DROP FUNCTION IF EXISTS mycat_seq_nextval;DELIMITER $$CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS VARCHAR(64) CHARSET 'utf8'BEGINUPDATE MYCAT_SEQUENCE SET current_value = current_value + increment WHERE NAME = seq_name;RETURN mycat_seq_currval(seq_name);END$$DELIMITER ;

3)sequence_db_conf.properties相关配置,指定sequence相关配置在哪个节点上: 

例如:

COMPANY=dn3

注:COMPANY为表名,必须大写,dn3为schema.xml配置的dataNode节点。建议专门独立一个数据库,存放sequence表和相关的function,方便维护管理和隔离。

注意:MYCAT_SEQUENCE表和以上的3个function,需要放在同一个节点上。function请直接在具体节点的数据库上执行,如果执行的时候报: 

you might want to use the less safe log_bin_trust_function_creators variable 
需要对数据库做如下设置: 
windows下my.ini[mysqld]加上log_bin_trust_function_creators=1 
linux下/etc/my.cnf下my.ini[mysqld]加上log_bin_trust_function_creators=1 
修改完后,即可在mysql数据库中执行上面的函数. 
使用示例:

SELECT next value for MYCATSEQ_SAM_TESTinsert into sam_test(id_,name_) values(next value for MYCATSEQ_SAM_TEST,'test');# 数据库表定义了自增,在mycat也定义了主键和自增,可以用如下方式insert into sam_test(name_) values('test');

测试

1.配置schema.xml

select user()
select user()

2.配置server.xml

1

3.配置rule.xml

id
mod-long
2

4.配置sequence_db_conf.properties

COMPANY=dn3

5.数据库配置文件修改my.ini

log_bin_trust_function_creators=1# 忽略大小写lower_case_table_names=1

6.数据库表 

1)分别到192.168.1.95的mycat_test数据库和mycat_test2数据库新建如下的表,由于是分库分表,所以两边都要创建。

DROP TABLE IF EXISTS `company`;CREATE TABLE `company` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(255) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

注:只有数据库和mycat都设置AUTO_INCREMENT才能通过mycat命令LAST_INSERT_ID()获取插入的id 

2)到192.168.1.112的testmycat数据库中执行上面的创建sequence和function过程。 
3)插入数据到MYCAT_SEQUENCE表

insert into MYCAT_SEQUENCE(name,current_value,increment) values('COMPANY',19,5);

7.mycat测试 

配置完之后,重启mycat 
执行

insert into company(id,name) values (next value for MYCATSEQ_COMPANY,"test")或insert into company(name) values ("test")

插入数据成功后 

执行

select LAST_INSERT_ID()

可以看到本次插入的id

小结 

如果要获取插入数据后的id,必须同时在mysql和mycat设置表的自增。 
sequence_db_conf.properties配置的表名必须大写。 
存放sequence表和function在同一个数据库中,且只有一个。 
以上【Sequence获取步骤】是mycat原理,注意理解。

转载于:https://my.oschina.net/u/3485980/blog/1604102

你可能感兴趣的文章
干货|Spring Cloud Bus 消息总线介绍
查看>>
redis 原码安装
查看>>
容灾方式
查看>>
SSH隧道与端口转发内网穿透
查看>>
线程基础知识系列(三)线程的同步
查看>>
数据库内容导出为excel并下载
查看>>
Cannot create a session after the response has been committed
查看>>
Java生成javadoc
查看>>
JSP九大内置对象
查看>>
Arduino可穿戴教程Linux平台下安装Arduino IDE
查看>>
Python模块整理(四):线程模块threading
查看>>
XamarinSQLite教程创建数据表
查看>>
触发器摘录
查看>>
Python学习(一)
查看>>
通过ProcessBuilder运行linux命令
查看>>
mysql 终端操作
查看>>
常用批处理命令总结之Find和FindStr
查看>>
Centos7.1 命令行与图形化界面登陆
查看>>
增加myEclipse的非堆内存
查看>>
STC12单片机串口U盘测试程序源码
查看>>