全局序列号概述
全局序列号是MyCAT提供的一个新功能,为了实现分库分表情况下,表的主键是全局唯一,而默认的MySQL的自增长主键无法满足这个要求。全局序列号的语法符合标准SQL规范。
其格式为:
next value for MYCATSEQ_GLOBAL
其中MYCATSEQ_GLOBAL是序列号的名字,MyCAT自动创建新的序列号,免去了开发的复杂度,另外,MyCAT也提供了一个全局的序列号,名称为:MYCATSEQ_GLOBAL。
注意,MYCATSEQ_必须大写才能正确识别。
MyCAT温馨提示:实践中,建议每个表用自己的序列号。
常用的两种实现方式
本地配置
MyCAT目前已经提供了一个本地配置版的实现,下面是配置说明:
配置说明 配置文件:sequence_conf.properties 格式说明: XXX.HISIDS= 1-100,501-800,3001-5000 //使用过得历史分段 XXX.MINID=10001 //当前可用分段的最小值 XXX.MAXID=20000 //当前可用分段的最大值 XXX.CURID=10000 //当前可用分段的当前值
全局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数据库表格保存全局序列号的配置如下:
Serfver.xml中启用
<property name="sequnceHandlerType">1</property>
在某个分区(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秒会重新从数据库读取下一批次的序列号值。
实际使用踩中的坑
高并发时,最好不用本地配置方式实现全局序列号,有概率会自增失败。所以,一般测试环境可以用本地配置方式,生产环境用数据库配置方式