MyCat教程六:全局序列号-全局主键的自增长
程序员文章站
2022-04-15 14:49:20
前面我们介绍了MyCat的分库分表操作,那么同一张表中的数据会被保存在不同的数据库中,那么这就涉及到了主键维护的问题,此时肯定不能使用单个数据库中id自增的方式来处理了,这时我们就可以通过MyCat中提供的几种增长的方式来实现 全局主键自增 一、本地文件自增方式 首先我们来看下第一种方式,也就是本地 ......
前面我们介绍了mycat的分库分表操作,那么同一张表中的数据会被保存在不同的数据库中,那么这就涉及到了主键
维护的问题,此时肯定不能使用单个数据库中id自增的方式来处理了,这时我们就可以通过mycat中提供的几种增长的方式来实现
全局主键自增
一、本地文件自增方式
首先我们来看下第一种方式,也就是本地文件自增
方式
1. 修改分片策略
我们原来配置的分片策略crc32slot
是不支持主键自增的,所以我们需要修改为auto-sharding-long
2. 修改server.xml文件
server.xml文件中的sequncehandlertype
是用来配置主键生成类型的
sequncehandlertype值 | 说明 |
---|---|
0 | 本地文件自增方式 |
1 | 数据库自增方式 |
2 | 本地时间戳自增方式 |
所以我们需要先把sequncehandlertype的值修改为0
3.sequence_conf.properties介绍
在conf目录下的sequence_conf.properties
中有序列的相关配置信息
#wed oct 16 07:40:44 cst 2019 company.maxid=2000 global.maxid=20000 company.hisids= customer.maxid=2000 hotnews.curid=1000 order.minid=1001 customer.hisids= hotnews.minid=1001 global.curid=10002 order.maxid=2000 company.curid=1000 customer.curid=1000 company.minid=1001 global.minid=10001 hotnews.maxid=2000 customer.minid=1001 global.hisids= hotnews.hisids= order.hisids= order.curid=1000
主要的是global.maxid=20000
global.curid=10002
global.minid=10001
可以自行设置
4.测试实现
插入语句中主键字段用next value for mycatseq_global
替代
insert into t_user(id,name,age)values(next value for mycatseq_global,'hg-93',23)
二、本地时间戳自增方式
使用时间戳的方式,我们不需要分配策略或者选择其他的分片策略。
1.修改server.xml文件
将server.xml文件中的sequncehandlertype
修改为2
2.重启mycat
修改了配置文件,要让其生效需重启服务。
3.插入数据测试
insert into t_user(id,name,age)values(next value for mycatseq_global,'hg-93',23)
时间戳太长将id
修改为 varchar
类型。
生成成功~
三、数据库自增方式
1.创建序列表和相关函数
第三种方式是在mycat所管理的某个数据库中创建一张自增的表结构来维护相关的数据,相关的脚本官方提供的有,如下:
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 ; insert into mycat_sequence(name,current_value,increment) values ('global', 100000, 100); 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 ; 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 ; 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 ;
我们把这些脚本在demo2
上执行
2.修改server.xml
3.修改sequence_db_conf.properties文件
因为demo2
对应的逻辑库是 dn2
所以我们需要修改此处
4.测试
重启服务并插入数据测试
insert into t_user(id,name,age)values(next value for mycatseq_global,'hg-93',23)
主键的生成成功,除了这三种方式以外还可以通过`zookeeper`来维护自增的主键,这个可以自行实现