`

mycat全局序列号

阅读更多
全局序列号是MyCAT提供的一个新功能,为了实现分库分表情况下,表的主键是全局唯一,而默认的MySQL的自增长主键无法满足这个要求。全局序列号的语法符合标准SQL规范,其格式为:
next value for MYCATSEQ_GLOBAL


其中MYCATSEQ_GLOBAL是序列号的名字,MyCAT自动创建新的序列号,免去了开发的复杂度,另外,MyCAT也提供了一个全局的序列号,名称为:MYCATSEQ_GLOBAL。

注意,MYCATSEQ_必须大写才能正确识别。

MyCAT温馨提示:实践中,建议每个表用自己的序列号,序列号的命名建议为MYCATSEQ _tableName_ID_SEQ。

SQL中使用说明

自定义序列号的标识为:MYCATSEQ_XXX ,其中XXX为具体定义的sequence的名称,应用举例如下:

使用默认的全局sequence :
 insert into tb1(id,name) values(next value for MYCATSEQ_GLOBAL,'micmiu.com');


引用
注意:

序列:MYCATSEQ_MYCAT

配置:MYCAT=dn1 
表为:MYCAT  也就是”表名“=序列号后半部分的名字(MYCATSEQ_xxx 中的xxx)



目前全局序列号提供了本地文件跟数据库模式及本地基于时间戳算法的三种方式:

1. 本地文件:

1. 配置server.xml  
     <property name="sequnceHandlerType">0</property>
2. 配置sequence_conf.properties
    #default global sequence
   GLOBAL.HISIDS=
   GLOBAL.MINID=10001
   GLOBAL.MAXID=20000
   GLOBAL.CURID=10000

   # self define sequence
   COMPANY.HISIDS=
   COMPANY.MINID=1001
   COMPANY.MAXID=2000
   COMPANY.CURID=1000

INSERT  INTO msg (id,gid,content,create_date) VALUES( NEXT VALUE FOR MYCATSEQ_GLOBAL,1,"我是1月份",'2015-02-1')


2. 数据库方式:

1. 配置server.xml  
     <property name="sequnceHandlerType">1</property>

2. 配置sequence_db_conf.properties
   #sequence stored in datanode
   GLOBAL=dn1
   MYST=dn1


3.数据库本地创建脚本:
DROP TABLE IF EXISTS 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;
-- ----------------------------
-- Function structure for `mycat_seq_currval`
-- ----------------------------
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 ;
-- ----------------------------
-- Function structure for `mycat_seq_nextval`
-- ----------------------------
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 ;
-- ----------------------------
-- Function structure for `mycat_seq_setval`
-- ----------------------------
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 ;


数据库完整脚本

DROP TABLE IF EXISTS 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;

-- ----------------------------
-- Function structure for `mycat_seq_currval`
-- ----------------------------
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 ;

-- ----------------------------
-- Function structure for `mycat_seq_nextval`
-- ----------------------------
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 ;

-- ----------------------------
-- Function structure for `mycat_seq_setval`
-- ----------------------------
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 ;

INSERT INTO MYCAT_SEQUENCE VALUES ('GLOBAL', 0, 100);
SELECT MYCAT_SEQ_SETVAL('GLOBAL', 1);
SELECT MYCAT_SEQ_CURRVAL('GLOBAL');
SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');


在某个分区(dataNode)数据库上创建序列号相关的表格和函数,SQL脚本在doc目录下的sequnce-sql.txt中,需要在数据库上而非Mycat上执行。
• Mycat_home/conf/quence_db_conf.properties 中记录了sequnce所存放的db对应的配置信息。
#sequence stored in datanode
GLOBAL=dn1
COMPANY=dn1
CUSTOMER=dn1
• 在sequnce表中,插入相应的sequnce记录,并确定其初始值,以及增长步长,步长建议一个合适的范围,比如50-500,需要在数据库上而非Mycat上执行。
INSERT INTO MYCAT_SEQUENCE VALUES ('GLOBAL', 0, 100);
• 修改sequnce的当前值为某个新值,需要在数据库上而非Mycat上执行。
SELECT mycat_seq_curval('GLOBAL');

提示:步长选择多大,取决与你数据插入的TPS,假如是每秒1000个,则步长为1000×60=6万,也不是很大,即60秒会重新从数据库读取下一批次的序列号值。



3. 本地时间戳算法:


ID=  64位二进制  (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)



换算成十进制为18位数的long类型,每毫秒可以并发12位二进制的累加。



使用方式:

a.  配置server.xml

<property name="sequnceHandlerType">2</property>



b.    在mycat下配置:sequence_time_conf.properties

           WORKID=0-31 任意整数

           DATAACENTERID=0-31 任意整数



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


ID示例:56763083475511



sequence_db_conf.propertie中配置
#sequence stored in datanode
#全局配置的数据源
# GLOBAL : mycat_sequence 表中 name的值
GLOBAL=mycat1
#定义的表所在的数据库
# SEQUENCE : mycat_sequence 表中 name的值
SEQUENCE=mycat1
#COMPANY=dn1
#CUSTOMER=dn1
#ORDERS=dn1


INSERT  INTO msg (id,gid,content,create_date) VALUES( NEXT VALUE FOR MYCATSEQ_SEQUENCE,1,"我是1月份",'2015-01-1')

INSERT  INTO msg (id,gid,content,create_date) VALUES( NEXT VALUE FOR MYCATSEQ_GLOBAL,1,"我是1月份",'2015-01-1')
分享到:
评论

相关推荐

    Mycat全局序列号示例

    总结来说,Mycat的全局序列号功能通过两种方式——本地文件和数据库,提供了在分库分表场景下生成全局唯一主键的解决方案。本地文件方式简单易用,适用于对性能要求不高的场景,而数据库方式则在一致性上有更好的...

    mycat读写分离

    最后,Mycat全局序列号是MyCAT提供的一个新功能,为了实现分库分表情况下,表的主键自增,保证数据的唯一性。 总的来说,Mycat通过读写分离和自动切换机制,可以有效地提高数据库的读写性能,解决单点数据库的压力...

    分库分表第二次1

    6. **Mycat全局序列号**:讨论了在分布式环境中如何实现全局唯一的序列号生成,Mycat提供了全局序列号服务,确保了在分库分表后数据的一致性。 7. **Mycat常用分片规则**:阐述了Mycat支持的各种分片策略,如哈希分...

    mycat的全面文档

    5. Mycat的分片JOIN和全局序列号章节详细讲解了Mycat如何处理分片表的JOIN操作以及如何管理全局序列号,这对于确保数据一致性和避免冲突至关重要。 6. 常见问题与解决方案章节列举了Mycat使用者可能遇到的问题以及...

    Mycat-权威学习指南

    Mycat核心概念包括数据库中间件、逻辑库、逻辑表、分片节点、节点主机、分片规则、全局序列号和多租户等。理解这些基本概念有助于深入学习Mycat的各种功能。 - 数据库中间件:指在应用程序和数据库之间提供额外服务...

    mycat-权威指南.pdf

    这节可能会介绍Mycat全局表、ER分片表、多对多关联、常用分片规则以及权限控制和多租户支持等高级概念。 ### 第11章 常见问题与解决方案 本章集中解答了Mycat用户可能遇到的问题,并提供了相应的解决方案。 ### 第...

    mycat基本工具书

    ##### 9.2 Mycat全局表 全局表作为一种特殊类型的分片规则,适用于需要跨分片节点查询的情况。 ##### 9.3 ER分片表 ER分片表是指根据实体关系模型进行分片的表。 ##### 9.4 多对多关联 多对多关联是指两个或多...

    Mycat_V1.6.0

    “全局序列号”章节则对Mycat如何生成和使用全局唯一的序列号进行了介绍,这在分布式数据库场景下是保证数据唯一性的关键。 在“Mycat分片规则”章节中,会解释分片规则的具体作用,并介绍如何设置和优化这些规则。...

    数据库集群Mycat搭建和配置

    4. **rule.xml**:定义分片规则,包括分片策略(如范围分片、哈希分片等)和全局序列号生成器。 5. **sequence配置**:如果使用了全局序列号,需配置sequence.xml来管理序列号生成。 **五、Mycat高级特性** 1. **...

    Mycat配置使用

    Mycat全局表操作: 在Mycat中,全局表操作通常是为了处理跨节点的数据一致性问题。使用全局表时,需要在插入数据时指定具体的分片节点,如"Mycatorders@host1orders@host2orders@host3",这样操作才会针对所有的分片...

    mycat学习教程

    5. **数据一致性**:通过全局序列号(GID)保证分布式环境下的数据一致性。 ### 结论 Mycat作为分布式数据库中间件,为解决传统数据库的局限性提供了有效方案。通过合理的安装、配置和使用,可以显著提升系统的可...

    分布式架构系统生成全局唯一序列号的一些思路对比分析

    在分布式架构系统中,生成全局唯一序列号是至关重要的任务,它涉及到数据一致性、系统扩展性和性能优化等多个方面。本文将对比分析几种常见的生成全局唯一序列号的策略,以供IT从业者参考。 1. **雪花算法...

    Mycat权威指南第一版_V1.5.1

    同时,Mycat支持全局序列号(sequence),这是一个保证数据有序增长的机制,包括本地文件方式、数据库方式和本地时间戳方式等实现方法。全局序列号对于分布式系统中保证主键的唯一性至关重要。 读写分离是数据库...

    分库分表中间件MyCat使用手册

    4.1 **全局序列号**:MyCat 可以生成全局唯一的序列号,确保在分布式环境中数据的唯一性。 4.2 **读写分离策略**:支持自定义读写分离策略,例如优先读取从库,当从库不可用时自动切换到主库。 4.3 **安全控制**:...

Global site tag (gtag.js) - Google Analytics