MyCat全局序列之数据库方式

一、简介

上一篇文件介绍了MyCat全局序列的本地文件方式,由于 MyCat 重新发布后,配置文件中的 sequence 会恢复到初始值(当这台机器宕机时会出现,序列文件丢失,造成序列冲突问题),所以在实际项目中并不会采用本地文件生成序列,更多是采用数据库的方式,本文就将对如何在MyCat中使用数据库实现全局序列主键唯一。

二、数据库方式

  • 实现方式:在数据库中建立一张表MYCAT_SEQUENCE ,用于存放 序列sequence 名称(name),sequence 当前值(current_value),步长(increment int 类型每次读取多少个 sequence。
  • 获取步骤大概如下三个:
  1. 初次获取sequence时,根据传入的序列名称,从数据库表中获取current_value,increment到MyCat中,并将数据库中的current_value更新为current_value + increment。
  2. MyCat将读取到的current_value + increment作为本次的序列,在下次使用时,将序列的值 + 1,当使用increment次后,重复第一个步骤。
  3. MyCat负责维护序列表MYCAT_SEQUENCE,当用到序列时,往数据库表中插入一条记录即可。如果某次读取完的序列还没有用完数据库就崩了,那么剩余的没有使用的序列将会被废弃掉。

三、实现方式

环境信息: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));

MyCat全局序列之数据库方式_第1张图片

【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;

MyCat全局序列之数据库方式_第2张图片

【c】创建生成序列的函数(同样在testdb_seq1数据库上面执行)

这里主要有三个函数:

  • 返回当前的sequence的值
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 ;

MyCat全局序列之数据库方式_第3张图片

  • 设置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 ;

MyCat全局序列之数据库方式_第4张图片

  • 获取下一个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 ;

MyCat全局序列之数据库方式_第5张图片

【d】server.xml指定序列生成方式为数据库方式

1

MyCat全局序列之数据库方式_第6张图片

【e】配置  sequence_db_conf.properties :TESTDBSEQ 为全局序列的名称,dn1 表示分片节点

TESTDBSEQ=dn1

 

注意:MYCAT_SEQUENCE 表和以上的 3 个 function,需要放在同一个节点上,然后重启 mycat服务。

vim sequence_db_conf.properties

MyCat全局序列之数据库方式_第7张图片

【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'); 

测试结果:

MyCat全局序列之数据库方式_第8张图片

testdb_seq1数据库:

MyCat全局序列之数据库方式_第9张图片

testdb_seq2数据库:

MyCat全局序列之数据库方式_第10张图片

重启MyCat:

cd /bin

./mycat restart

继续插入数据进行测试:

insert into test1(id,xm) values( 1187517422467420161,'wangwu');

MyCat全局序列之数据库方式_第11张图片

查看 mycat_sequence 数据:发现序列当前值在上次的基础上100100增加了100(即变为100200),重启后的id重100200开始计数。

 

MyCat全局序列之数据库方式_第12张图片

【h】其他配置server.xml执行逻辑库地址、访问的数据库用户信息等





	
	0  
	0  

		1
       
         
	
	
		
		0
		
		
		
		
		
		
		
		
		0
		
			
		1

		
		1m

		
		1k

		0

		
		384m


		
		true


	
	
	
	
	
	
		0905
		TESTDB
		
		
		
	

	
		0905
		TESTDB
		true
	

四、总结

以上就是关于在MyCat中怎么使用数据库方式实现全局序列主键,主要需要注意点有:

  • 在数据库中创建全局序列表,并且在同一个数据库中创建三个函数;
  • server.xml指定全局序列方式为数据库方式(sequnceHandlerType=1);
  • 配置  sequence_db_conf.properties指定全局序列在哪个数据节点;
  • 如果某次读取完的序列还没有用完数据库就宕机了,那么没有使用的序列将会被废弃掉;

以上就是笔者学习期间的一些实践总结,希望能对大家有所帮助,如有不对之处,还望指点一二。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(MyCat)