您的位置:首页 > 数据库 > MySQL

mycat 使用mysql实现全局序列号

2016-07-15 16:15 686 查看
mycat 及mysql 机器配置
http://blog.csdn.net/convict_eva/article/details/51858121
主  192.168.192.128
从  192.168.192.129
mycat    192.168.192.133

1、原理

在数据库中建立一张表,存放“名称”,“当前值”,“步长”(mycat 每次读取多少个 sequence)
sequence 获取步骤:
1)当初次使用该sequence时,根据传入的squence名称,从这个表中获取current_value 和 increment 到mycat中,并将current_value 设置为current_value+increment
2)mycat 将本次读取到的current_value+increment 作为本次的squence,下次使用时自动加1,使用increment后,执行第一步操作。
3)mycat 维护这张张表,用到那些squence ,往表中插入一条数据即可。若某次读取的squence 没有用完服务器就停止,则读过的squence就不会再用,再从第一 步开始执行。

mycat配置:

server.xml
<property name="sequnceHandlerType">1</property>
配置为1 ,表示使用数据库方式生成squence

sequence_db_conf.properties

指定squence 所在结点:

TESTSEQ=dn_master

注意:必须大写

数据初始化
创建表:

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 ;

创建函数:

#取当前squence的值
DROP FUNCTION IF EXISTS mycat_seq_currval;
DELIMITER $$
CREATEFUNCTION mycat_seq_currval(seq_name VARCHAR(50))RETURNS VARCHAR(64) CHARSET `utf8`
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$$
DELIMITER ;

#设置 sequence 值
DROP FUNCTION IF EXISTS mycat_seq_setval;
DELIMITER $$
CREATEFUNCTION 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 $$
CREATEFUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS VARCHAR(64) CHARSET `utf8`
BEGIN
UPDATE MYCAT_SEQUENCE SET current_value = current_value + increment 
WHERE NAME = seq_name;
RETURN mycat_seq_currval(seq_name);
END$$
DELIMITER ;
注意:
    1、MYCAT_SEQUENCE 表和以上的 function,需要放在同一个节点上。这个结点就是sequence_db_conf.properties 指定的数据库结点

    2、远程创建function失败,需要对数据库做如下设置:

    /etc/my.cnf 下 my.ini
    [mysqld]加上 log_bin_trust_function_creators=1

重新启动mycat

测试:
----登录到mycat 服务器
#mysql -h192.168.192.133 -utest -ptest -P8066 -DTESTDB

----插入一个序列 ,序列的名字TESTSEQ 是上面配置的。

mysql>insert into MYCAT_SEQUENCE(name,current_value,increment) values('TESTSEQ',1000,10);
----查询出一个序列
mysql>SELECT next value for MYCATSEQ_TESTSEQ
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mycat