读书笔记-Mycat权威指南-09-全局序列号

全局序列号介绍

在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,需要新的实现方式。

本地文件方式

原理:此方式 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 的实现

 

posted @ 2017-08-26 12:07  一苇过江  阅读(190)  评论(0编辑  收藏  举报