Mycat全局序列号

目录

全局序列号

一.本地文件方式

server.xml配置

sequence_conf.properties文件配置 

使用示例

二.数据库方式

server.xml配置

数据库配置

三.本地时间戳方式

server.xml配置

sequence_time_conf.properties文件配置


全局序列号

在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局
sequence,并且提供了包含本地配置和数据库配置等多种实现方式。

一.本地文件方式

此方式MyCAT将sequence 配置到文件中,当使用到sequence中的配置后,MyCAT 会更下classpath中的sequence_conf.properties文件中sequence当前的值

server.xml配置

<system><property name="sequnceHandlerType">0</property></system>
<!--注:sequnceHandlerType需要配置为0,表示使用本地文件方式-->

sequence_conf.properties文件配置 

#default global sequence
GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000

# self define sequence
EMPLOYEE.HISIDS=
EMPLOYEE.MINID=2001
EMPLOYEE.MAXID=2005
EMPLOYEE.CURID=2000

<!-- HISIDS表示使用过的历史分段(一般无特殊需要可不配置),MINID表示最小ID值,MAXID 表示最大ID值,CURID表示当前 ID值 -->

使用示例

insert into table1(id,name) values(next value for MYCATSEQ_GLOBAL,‘test’)
insert into table2(id,name) values(next value for MYCATSEQ_EMPLOYEE,‘test’);

缺点:当MyCAT重新发布后,配置文件中的sequence会恢复到初始值
优点:本地加载,读取速度较快

 注:当超过设置的最大值时,会继续增加

二.数据库方式

在数据库中建立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment,int类型每次读取多少个sequence,假设为K)等信息

server.xml配置

<system><property name="sequnceHandlerType">1</property></system>
<!-- 注:sequnceHandlerType 需要配置为1,表示使用数据库方式生成sequence -->

数据库配置

1.创建MYCAT_SEQUENCE表

**创建存放sequence的表

DROP TABLE IF EXISTS MYCAT_SEQUENCE;
CREATE TABLE MYCAT_SEQUENCE (
name VARCHAR(50) NOT NULL COMMENT 'sequence名称',
current_value INT NOT NULL COMMENT '当前value',
increment INT NOT NULL DEFAULT 100 COMMENT '增长步长',
PRIMARY KEY(name)
) ENGINE=InnoDB;

**插入数据

INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES (‘GLOBAL’, 10000,100);
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES (‘EMPLOYEE’, 10000,100);

2.创建function

**获取当前sequence的值

DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE  FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) 
RETURNS varchar(64) CHARSET utf8
    DETERMINISTIC
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
    DETERMINISTIC
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
    DETERMINISTIC
BEGIN 
         UPDATE MYCAT_SEQUENCE  
                 SET current_value = current_value + increment 
                  WHERE name = seq_name;  
         RETURN mycat_seq_currval(seq_name);  
END
;;
DELIMITER ;

3. sequence_db_conf.properties 相关配置,指定sequence 相关配置在哪个节点上:

#sequence stored in datanode
GLOBAL=dn1
EMPLOYEE=dn1
COMPANY=dn1
CUSTOMER=dn1
ORDERS=dn1

优点:在 MyCAT 重启后,sequence 值不会被初始化,比如当前MYCAT_SEQUENCE的初始值是10000,当mycat的重启之后再执行插入数据后MYCAT_SEQUENCE的初始值就加100(步长)变成10100,新插入到表的值也是在加100的基础上开始递增

缺点:当配置了主从复制时(A主B从),一开始主从上面的MYCAT_SEQUENCE表的current_value初始值是10000;当前配置的读写分离方案是A负责写B负责读当A宕机之后B负责写A变成了读,加入现在的全局ID已经到了 10103,这个时候如果A宕机了,mycat应该是存在缓存current_value还是记录的是A的值,不会立马切换使用B上的current_value的值,如果这个时候mycat重启了,这个时候全局系列号就开始使用B中的current_value值由于B值也是从10100开始那么这个时候插入全局记录到B中的表中就会和之前生成的10100到10103主键冲突了。

注:MYCAT_SEQUENCE表和以上的3个function,需要放在同一个节点上。function直接在具体节点的数据库上执行 

       步长的增加不会从插入到当前值增加,例插入数据到了10103,重启动是从10200开始而不是10203

三.本地时间戳方式

ID=  64位二进制  (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加) 
换算成十进制为 18位数的long类型,每毫秒可以并发12位二进制的累加

server.xml配置

<system><property name="sequnceHandlerType">2</property></system>
<!-- 注:sequnceHandlerType 需要配置为2,表示使用本地时间戳生成sequence -->

sequence_time_conf.properties文件配置

#sequence depend on TIME
WORKID=01  #0-31任意整数
DATAACENTERID=01  #0-31任意整数

多个个mycat节点下每个mycat配置的 WORKID,DATAACENTERID不同,组成唯一标识,总共支持32*32=1024种组合

优点:不会出现以上两种方式因mycat重启导致sequence重复

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值