全局序列号介绍
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,需要新的实现方式。
本地文件方式
原理:此方式 MyCAT 将 sequence 配置到文件中,当使用到 sequence 中的配置后,MyCAT 会更下 classpath 中的 sequence_conf.properties 文件中 sequence 当前的值。
配置方式: 在 sequence_conf.properties 文件中做如下配置, 使用示例: insert into table1(id,name) values(next value for MYCATSEQ_GLOBAL,‘test’);
缺点:当 MyCAT 重新发布后,配置文件中的 sequence 会恢复到初始值。
优点:本地加载,读取速度较快。
数据库方式
在数据库中建立一张表,存放 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)相同的操作
3).MyCat 负责维护这张表,用到哪些 sequence,只需要在这张表中插入一条记录即可。若某次读取的 sequence 没有用完,系统就停掉了,则这次读取的 sequence 剩余值不会再使用。
本地时间戳
方式 ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加);
换算成十进制为 18 位数的 long 类型,每毫秒可以并发 12 位二进制的累加;
使用方式:
a. 配置 server.xml 2
b. 在 mycat 下配置:sequence_time_conf.properties WORKID=0-31 任意整数 DATAACENTERID=0-31 任意整数
多个个 mycat 节点下每个 mycat 配置的 WORKID,DATAACENTERID 不同,组成唯一标识,总共支持 32*32=1024 种组合。
ID 示例:56763083475511
分布式 ZK ID 生成器
<property name="sequnceHandlerType">3</property>
Zk 的连接信息统一在 myid.properties 的 zkURL 属性中配置。
基于 ZK 与本地配置的分布式 ID 生成器(可以通过 ZK 获取集群(机房)唯一 InstanceID,也可以通过配置文 件配置 InstanceID) ID 结构:long 64 位,ID 最大可占 63 位
* |current time millis(微秒时间戳 38 位,可以使用 17 年)|clusterId(机房或者 ZKid,通过配置文件配置 5 位)|instanceId(实例 ID,可以通过 ZK 或者配置文件获取,5 位)|threadId(线程 ID,9 位) |increment(自增,6 位) * 一共 63 位,可以承受单机房单机器单线程 1000*(2^6)=640000 的并发。
* 一共 63 位,可以承受单机房单机器单线程 1000*(2^7)=1280000 的并发。
* 无悲观锁,无强竞争,吞吐量更高
配置文件:sequence_distributed_conf.properties,只要配置里面:INSTANCEID=ZK 就是从 ZK 上获取 InstanceID。
注:自增ID配置
<property name="sequnceHandlerType">4</property>
自增长主键
MyCAT 自增长主键和返回生成主键 ID 的实现