高并发分库分表之后分布式下如何保证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 实现代码
1
以上是关于高并发分库分表之后分布式下如何保证ID全局唯一性的主要内容,如果未能解决你的问题,请参考以下文章 |