分布式全局序列号

1 本地文件方式 磁盘io 读写慢

数据库mysql 设置当前num和步长,单点问题 注意并发修改

当挂掉的时候 有缺失的一段,但不会重复

3 snowflake

4 本地时间戳??mycat看到的 snowflake的变种?

ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加)

换算成十进制为 18 位数的 long 类型,每毫秒可以并发 12 位二进制的累加。 

zk方式 利用分布式锁 每个线程原子的设置某个节点从current 到 current+period

每个线程可以用一段period,用完去zk上取

6

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 的并发。

其中的instanceId 是从zk获取的

mycat中的实现用了选主,

主的instanceId = 1,从节点发现自己不是leader,创建一个代表自己的slave节点,data是ready

然后主成为leader的时候会对将ready替换成0到(1<<5)-1的某一个 这样从节点就能获取到这个由主节点分配的instanceId 

主节点和从节点都有一个定时任务 一个去设置更新instanceId 一个取获取设置的值 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章