文档章节

Mycat 设置全局序列号

coderJL
 coderJL
发布于 2015/12/31 11:56
字数 994
阅读 37
收藏 0

1.全局序列号介绍

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

2.本地文件方式

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

配置方式:

在sequence_conf.properties文件中做如下配置:

GLOBAL_SEQ.HISIDS=

GLOBAL_SEQ.MINID=1001

GLOBAL_SEQ.MAXID=1000000000

GLOBAL_SEQ.CURID=1000

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

server.xml中配置:

<property NAME="sequnceHandlerType">0</property>

注:sequnceHandlerType需要配置为0,表示使用本地文件方式。 1表示数据库方式

使用示例:

INSERT INTO table1(id,NAME) VALUES(NEXT VALUE FOR MYCATSEQ_GLOBAL,'test');

缺点:当MyCAT重新发布后,配置文件中的sequence会恢复到初始值。

优点:本地加载,读取速度较快。

2.数据库方式

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

Sequence获取步骤:

1).当初次使用该sequence时,根据传入的sequence名称,从数据库这张表中读取current_value,和increment到MyCat中,并将数据库中的current_value设置为原current_value值+increment值;

2).MyCat将读取到current_value+increment作为本次要使用的sequence值,下次使用时,自动加1,当使用increment次后,执行步骤1)相同的操作.

MyCat负责维护这张表,用到哪些sequence,只需要在这张表中插入一条记录即可。若某次读取的sequence没有用完,系统就停掉了,则这次读取的sequence剩余值不会再使用。

配置方式:

server.xml配置

<property NAME="sequnceHandlerType">1</property>

注:sequnceHandlerType 需要配置为1,表示使用数据库方式生成sequence.

数据库配置:

1) 创建MYCAT_SEQUENCE表

– 创建存放sequence的表

DROP TABLE IF EXISTS MYCAT_SEQUENCE;

– name sequence名称

– current_value 当前value

– increment 增长步长! 可理解为mycat在数据库中一次读取多少个sequence. 当这些用完后, 下次再从数据库中读取.

CREATE TABLE MYCAT_SEQUENCE (
NAME VARCHAR (50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 100,
PRIMARY KEY (NAME)
) ENGINE = INNODB;

– 插入一条sequence

INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES('GLOBAL', 100000, 100);

2) 创建相关function

– 获取当前sequence的值 (返回当前值,增量)

DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE DEFINER='root'@'%' FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) 
RETURNS VARCHAR(64) CHARSET latin1
    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_nextval`;
DELIMITER ;;
CREATE DEFINER='root'@'%' FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS VARCHAR(64)
 CHARSET latin1
    DETERMINISTIC
BEGIN 
         UPDATE MYCAT_SEQUENCE  
                 SET current_value = current_value + increment 
                  WHERE NAME = seq_name;  
         RETURN mycat_seq_currval(seq_name);  
END
;;
DELIMITER ;

– 获取下一个sequence值

DROP FUNCTION IF EXISTS `mycat_seq_setval`;
DELIMITER ;;
CREATE DEFINER='root'@'%' FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), VALUE INTEGER) 
RETURNS VARCHAR(64) CHARSET latin1
    DETERMINISTIC
BEGIN 
         UPDATE MYCAT_SEQUENCE  
                   SET current_value = VALUE  
                   WHERE NAME = seq_name;  
         RETURN mycat_seq_currval(seq_name);  
END
;;
DELIMITER ;

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

例如:

USER_SEQ=test_dn1


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

you might want to use the less safe log_bin_trust_function_creators variable

需要对数据库做如下设置:

windows下my.ini[mysqld]加上log_bin_trust_function_creators=1

linux下/etc/my.cnf下my.ini[mysqld]加上log_bin_trust_function_creators=1

修改完后,即可在mysql数据库中执行上面的函数.

使用示例:

INSERT INTO table1(id,NAME) VALUES(NEXT VALUE FOR MYCATSEQ_GLOBAL,'test');


声明:摘自《mycat权威指南》

© 著作权归作者所有

共有 人打赏支持
coderJL
粉丝 3
博文 11
码字总数 10517
作品 0
深圳
私信 提问
MyCAT全局序列号-数据库方式

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

HilaryHe
07/23
0
0
MySQL 数据库中间件 MyCAT 基础解析

前言 网络应用持续扩张的过程中,为了处理海量数据往往首先遇到的挑战就是数据存储的扩展 数据存储的扩展一般以切分来实现,切分的技术实现又可分为垂直切分和水平切分: 以表(或Schema)为切...

PeakFang-BOK
前天
0
0
高性能Mysql中间组件Mycat安装配置

高性能Mysql中间组件Mycat安装配置 由于公司项目需要使用到读写分离,但是官方版本的Mysql-proxy读写分离组件太不稳定且有很多BUG,最终决定使用Mycat作为中间组件,其实读写分离只是Mycat中...

幸运券发放
05/02
0
0
数据库水平切分(Mycat分片路由原理和全局序列号)

分片路由原理 Select * from travelrecord where id in(5000001, 10000001); dn1,dn2,dn3, id=5000001这条数据在dn2上,id=10000001这条数据在dn3上。 全部扫描一遍dn1 dn2 dn3,结果导致性能...

这很耳东先生
08/16
0
0
mycat实现mysql分库分表

1. mycat介绍 MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,...

红隐
05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

binlog2sql mysql数据库闪回工具

binlog2sql工具比mysqlbinlog+sed恢复更快捷。 1、安装: 从github上下载:https://github.com/danfengcao/binlog2sql shell> git clone https://github.com/danfengcao/binlog2sql.git && c......

mickelfeng
7分钟前
0
0
SpringCloud 复杂对象接收时候对象变成LinkeHashMap

如果定义feign接口为 @PostMapping("/user/queryUserByAccountStatus") BaseResult queryUserByAccountStatus(@RequestBody AccountsTenantIdStatusArg arg); 其中BaseResult的范性应该为Lis......

xiaomin0322
7分钟前
0
0
Android/Java 读、写MP3文件ID3V1信息

MP3的歌曲信息一般分两个大版本,分别是ID3V1和ID3V2,其中V2又分为好几个版本,具体百度一下,下方的代码仅仅是支持ID3V1。 需要用到的一个辅助工具(juniversalchardet)用于解决乱码问题,...

她叫我小渝
7分钟前
0
0
thymeleaf的onclick标签传参异常

异常 org.thymeleaf.exceptions.TemplateProcessingException: Only variable expressions returning numbers or booleans are allowed in this context, any other datatypes are not trust......

EasyProgramming
8分钟前
0
0
前端杂谈: CSS 权重 (Specificity)

前端杂谈: CSS 权重 (Specificity) css 权重想必大家都听说过, 一些简单的规则大部分人也都知道: 较长的 css selector 权重会大于较短的 css selector id selector 权重高于 class selector...

ssthouse_hust
15分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部