上一篇文件介绍了MyCat全局序列的本地文件方式,由于 MyCat 重新发布后,配置文件中的 sequence 会恢复到初始值(当这台机器宕机时会出现,序列文件丢失,造成序列冲突问题),所以在实际项目中并不会采用本地文件生成序列,更多是采用数据库的方式,本文就将对如何在MyCat中使用数据库实现全局序列主键唯一。
环境信息:MySQL5.6.45、Mycat-server-1.6、虚拟机IP地址192.168.1.11,
本文采用一台数据库服务器192.168.1.11里边的两个数据库(testdb_seq1、testdb_seq2)进行测试,详细的实现步骤如下:
【a】在数据库服务器192.168.1.11上面创建数据库(testdb_seq1、testdb_seq2)以及测试表test1。
create database testdb_seq1;
create database testdb_seq2;
use testdb_seq1;
create table test1(id int auto_increment primary key,xm varchar(32));
use testdb_seq2;
create table test1(id int auto_increment primary key,xm varchar(32));
【b】创建MYCAT_SEQUENCE表(这里使用testdb_seq1数据库(dn1节点)作为生成主键的节点)
注意:MYCAT_SEQUENCE表和以上的3个function,需要放在同一个节点(dn1)上。
DROP TABLE IF EXISTS MYCAT_SEQUENCE;
CREATE TABLE `MYCAT_SEQUENCE` (
`NAME` varchar(50) NOT NULL comment "名称",
`current_value` int(11) NOT NULL comment "当前值",
`increment` int(11) NOT NULL DEFAULT '100' comment "步长",
PRIMARY KEY (`NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
并且在表中初始化一条记录,指定序列名称TESTDBSEQ,序列当前值为100000,每次从数据库中取出100个序列,用完再取。
insert into MYCAT_SEQUENCE(name, current_value, increment) values ('TESTDBSEQ', 100000, 100);
-- 注意这里的TESTDBSEQ要大写,对应上 sequence_db_conf.properties 的配置
use testdb_seq1;
select * from MYCAT_SEQUENCE;
【c】创建生成序列的函数(同样在testdb_seq1数据库上面执行)
这里主要有三个函数:
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 ;
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 ;
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 ;
【d】server.xml指定序列生成方式为数据库方式
1
【e】配置 sequence_db_conf.properties :TESTDBSEQ 为全局序列的名称,dn1 表示分片节点
TESTDBSEQ=dn1
注意:MYCAT_SEQUENCE 表和以上的 3 个 function,需要放在同一个节点上,然后重启 mycat服务。
vim sequence_db_conf.properties
【f】配置schema.xml: 配置分片节点、分片规则等
select user()
【g】使用示例:
登录mycat,注意端口是8066
mysql -uroot -p0905 -h192.168.1.11 -P8066
插入语句进行测试:
insert into test1(id,xm) values( 1187517422463225856,'zhangsan');
insert into test1(id,xm) values( 1187517422467420160,'lisi');
测试结果:
testdb_seq1数据库:
testdb_seq2数据库:
重启MyCat:
cd /bin
./mycat restart
继续插入数据进行测试:
insert into test1(id,xm) values( 1187517422467420161,'wangwu');
查看 mycat_sequence 数据:发现序列当前值在上次的基础上100100增加了100(即变为100200),重启后的id重100200开始计数。
【h】其他配置server.xml执行逻辑库地址、访问的数据库用户信息等
0
0
1
0
0
1
1m
1k
0
384m
true
0905
TESTDB
0905
TESTDB
true
以上就是关于在MyCat中怎么使用数据库方式实现全局序列主键,主要需要注意点有:
以上就是笔者学习期间的一些实践总结,希望能对大家有所帮助,如有不对之处,还望指点一二。