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