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
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数据库中间件透明实现MYSQL读写分离
- 基于MYCAT的MYSQL主从与读写分离配置
- MyCat部署运行(Linux环境)与使用步骤详解
- MyCat - 背景篇(1)
- MyCat - 背景篇(2)
- MyCat_下载配置
- MyCat_全局表及其死锁问题
- MyCat_分片&ER分片及其查询插入更新异常等问题
- MyCat_sequence配置
- MyCat_sql的支持举例
- MyCat_注解
- Mycat_非分片表删除插入死锁问题
- MyCat源码解析(1)
- mycat AIO改写成NIO 性能从80000tps增加到100000tps
- 关系型数据的分布式处理系统MyCAT(2)——高级功能和管理监控
- 关系型数据的分布式处理系统MyCAT(1)—概述和基本使用教程
- Mycat分布式事务的实现
- Mycat数据排序和数据汇聚的实现
- 基于MYCAT的MYSQL主从与读写分离配置详解与示例
- 使用MYCAT轻松实现MYSQL水平分片