高并发分库分表之后分布式下如何保证ID全局唯一性

Posted Java技术汇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高并发分库分表之后分布式下如何保证ID全局唯一性相关的知识,希望对你有一定的参考价值。

分库分表:

跨库的问题

分布式事务问题

查询数据结果集合并

全局唯一性ID保证

要求:

1、全局唯一性:不能出现重复的id号(基本的要求)。

2、信息安全:防止恶意用户规矩id的规则来获取数据。混淆效果

3、数据递增:保证我下一个ID一定大于上一个ID。

当前201709122030下一个:201709122031下一个:201709122032

互斥关系:信息安全、数据递增规律

CREATE TABLE `tl_id` (`id` varchar(255) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据在分片时,典型的是分库分表,就有一个全局ID生成的问题。
单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求:
   1 不能有单点故障。
   2 以时间为序,或者ID里包含时间。这样一是可以少一个索引,二是冷热数据容易分离。
   3 可以控制ShardingId。比如某一个用户的文章要放在同一个分片内,这样查询效率高,修改也容易。
   4 不要太长,最好64bit。使用long比较好操作,如果是96bit,那就要各种移位相当的不方便,还有可能有些组件不能支持这么大的ID。

一 twitter 
twitter在把存储系统从mysql迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。
1 41位的时间序列(精确到毫秒,41位的长度可以使用69年)
2 10位的机器标识(10位的长度最多支持部署1024个节点) 
3 12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) 最高位是符号位,始终为0。
优点:高性能,低延迟;独立的应用;按时间有序。 缺点:需要独立的开发和部署。

原理


java 实现代码

(c)2006-2024 SYSTEM All Rights Reserved IT常识