mycat 使用mysql实现全局序列号

本文介绍了如何在mycat分布式数据库中间件中结合MySQL,实现跨表、跨节点的全局唯一序列号生成策略,详细讲解了相关配置和工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 $$
CREATE FUNCTION 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 $$
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`
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 -h 192.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











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值