Mycat全局序列号

Mycat全局序列号功能确保在分库分表场景下主键全局唯一,替代了MySQL自增主键。文章介绍了两种实现方式:本地配置和数据库配置,强调本地配置在高并发时可能的自增失败问题,建议生产环境采用数据库配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全局序列号概述

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

其格式为:
next value for MYCATSEQ_GLOBAL

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

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

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

常用的两种实现方式

本地配置

  1. MyCAT目前已经提供了一个本地配置版的实现,下面是配置说明:

    配置说明
    
    配置文件:sequence_conf.properties  
    
    格式说明:
    
    XXX.HISIDS= 1-100,501-800,3001-5000 //使用过得历史分段
    
    XXX.MINID=10001 //当前可用分段的最小值
    
    XXX.MAXID=20000 //当前可用分段的最大值
    
    XXX.CURID=10000 //当前可用分段的当前值
    
  2. 全局sequence配置如下:

    GLOBAL.HISIDS=
    GLOBAL.MINID=1
    GLOBAL.MAXID=50000
    GLOBAL.CURID=10000
    
    自定义sequence配置如下:
    MY1.HISIDS=
    MY1.MINID=101
    MY1.MAXID=200
    MY1.CURID=152
    

数据库配置

Mysql数据库表格保存全局序列号的配置如下:

  1. Serfver.xml中启用

    <property name="sequnceHandlerType">1</property>
    
  2. 在某个分区(dataNode)数据库上创建序列号相关的表格和函数,SQL脚本在doc目录下的sequnce-sql.txt中,需要在数据库上而非Mycat上执行。

  3. Mycat_home/conf/quence_db_conf.properties 中记录了sequnce所存放的db对应的配置信息。

    #sequence stored in datanode
    GLOBAL=dn1
    COMPANY=dn1
    CUSTOMER=dn1
    
  4. 在sequnce表中,插入相应的sequnce记录,并确定其初始值,以及增长步长,步长建议一个合适的范围,比如50-500,需要在数据库上而非Mycat上执行。

    INSERT INTO MYCAT_SEQUENCE VALUES ('GLOBAL', 0, 100);
    
  5. 修改sequnce的当前值为某个新值,需要在数据库上而非Mycat上执行。

    SELECT mycat_seq_curval('GLOBAL');
    

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

实际使用踩中的坑

高并发时,最好不用本地配置方式实现全局序列号,有概率会自增失败。所以,一般测试环境可以用本地配置方式,生产环境用数据库配置方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值