分布式ID生成方案汇总

1、目标
1.1、全局唯一
不能出现重复的ID,全局唯一是最基本的要求。
1.2、趋势有序
业务上分页查询需求,排序需求,如果ID直接有序,则不必建立更多的索引,增加查询条件。
而且Mysql InnoDB存储引擎主键使用聚集索引,主键有序则写入性能更高。
1.3、高可用
ID是一条数据的唯一标识,如果ID生成失败,则影响很大,业务执行不下去。所以好的ID方案需要有高可用。
1.4、信息安全
ID虽然趋势有序,但是不可以被看出规则,免得被爬取信息。
了解到一个有意思的事情:基于MAC地址生成UUID的算法造成的MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。
2、常见方案介绍
2.1、UUID
UUID(Universally Unique Identifier)是最简单的生成方案了:
UUID.randomUUID().toString()
生成形如:e811b49b-9ac1-47dc-8ab9-98fa7dd861d0的8-4-4-4-12的字符串。
优点
- 简单
- 性能好
- 全球唯一
缺点
- 无序
- 不能标识出此ID的含义,不可读。
- 字符串太长且无序,作为MySQL主键,影响性能。
2.2、snowflake方案
snowflake是twitter开源的分布式ID生成算法,核心思想是:一个Long类型的ID,其中41bit作为毫秒数,10bit作为机器码,12bit作为毫秒内序列号。

优点
- 毫秒数在高位,自增序列在低位,ID趋势递增。
- 以服务方式部署,可以做高可用。
- 根据业务分配bit位,灵活。
缺点
- 每台机器的时钟不同,当时钟回拨可能会发生重复ID。
- 当数据量大时,需要对ID取模分库分表,在跨毫秒时,序列号总是归0,会发生取模后分布不均衡。
2.3、基于数据库Flickr方案
这个方案的思路时采用了MySQL自增长ID的机制(auto_increment auto_increment_offset)。
通过使用以下SQL获取不同的ID:
begin;
REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();
commit;
在分布式系统中,多部署几台Mysql,每台机器的初始值不同,步数与机器数量相等。
假设部署N台机器,步数为N,每台机器初始值依次为:0、1、2...N-1,架构如下:

优点
- 简单,利用现有数据库架构。
- ID自增
缺点
- 依赖DB,配置主从复制可以增加可用性,但是当主从切换时可能会导致ID重复。
- 水平扩展困难,因为步数与机器数相同。
- 每次获取ID都需要读写数据库。
2.4、基于Redis生成
基于redis的lua也可以做Flickr方案,生成的ID为64位:
- 41bit存放时间(毫秒)
- 12bit存放逻辑分片ID
- 10bit存放自增长ID.
最终ID:((second * 1000 microSecond / 1000) << (12 10)) (shardId << 10) seq;
也可以直接使用INCR或者HINCRBY来做ID生成方案,因为Redis的单线程原子性,性能也很不错。
优点
- ID递增
- 性能好
缺点
- 需要依赖Redis。
- 需要考虑Reids宕机等问题。
3、开源产品
3.1、百度uid-generator
uid-generator是基于Twitter开源的snowflake算法实现,需要依赖Mysql。
Github: baidu/uid-generator
具体文档参考Github。
3.2、美团Leaf
Leaf——美团点评分布式ID生成系统
Github: Meituan-Dianping/Leaf
支持号段模式与snowflake模式。
3.3、小米chronos
Github: XiaoMi/chronos
Chronos依赖ZooKeeper,ChronosServer运行时会启动一个Thrift服务器。
参考
【分布式全局ID】细聊分布式ID生成方法
ID生成器,Twitter的雪花算法(Java)
Leaf——美团点评分布式ID生成系统
万亿级调用系统:微信序列号生成器架构设计及演变
使用Redis实现高并发分布式序列号生成服务
分布式ID方案有哪些以及各自的优劣势,我们当如何选择
分布式ID生成器解决方案
分布式全局序列ID方案之Redis优化方案
[分布式唯一ID极简教程](http://baijiahao.baidu.com/s?id=1584913615817222458
分布式ID生成方案汇总的更多相关文章
- 一种基于Orleans的分布式Id生成方案
基于Orleans的分布式Id生成方案,因Orleans的单实例.单线程模型,让这种实现变的简单,贴出一种实现,欢迎大家提出意见 public interface ISequenceNoGenerat ...
- 搞懂分布式技术12:分布式ID生成方案
搞懂分布式技术12:分布式ID生成方案 ## 转自: 58沈剑 架构师之路 2017-06-25 一.需求缘起 几乎所有的业务系统,都有生成一个唯一记录标识的需求,例如: 消息标识:message-i ...
- 分布式id生成方案总结
本文已经收录自 JavaGuide (60k+ Star[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.) 本文授权转载自:https://juejin.im/post/ ...
- 分布式ID生成方案总结整理
目录 1.为什么需要分布式ID? 2.业务系统对分布式ID有什么要求? 3.分布式ID生成方案 3.1 UUID 3.2.数据库自增 3.3.号段模式 3.4. Redis实现 3.4. 雪花算法(S ...
- 分布式系统唯一ID生成方案汇总
系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...
- [转]分布式系统唯一ID生成方案汇总
系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...
- 分布式系统唯一ID生成方案汇总【转】
转自:http://www.cnblogs.com/haoxinyue/p/5208136.html 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很 ...
- 分布式ID生成方案
系统唯一ID是设计一个系统的时候常常会遇到的问题,也常常为这个问题而纠结. 生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略. 0. 分布式ID要求 ...
- 分布式系统ID生成方案汇总
在分布式系统中,需要对大量的数据.消息.请求等进行唯一的标识,例如分布式数据库的ID需要满足唯一且多数据库同步,在单一系统中,使用数据库自增主键可以满足需求,但是在分布式系统中就需要一个能够生成全局唯 ...
随机推荐
- java交换两个参数值的四种方法
第一种:添加中间变量,算是最经典最简易的一种了. //添加一个中间变量 int x = 1, y = 2; int z; z = x;x = y;y = z; System.out.println(x ...
- HTTP POST 请求的两种编码格式:application/x-www-form-urlencoded 和 multipart/form-data
在常见业务开发中,POST 请求常常在这些地方使用:前端表单提交时.调用接口代码时和使用 Postman 测试接口时.我们下面来一一了解: 一.前端表单提交时 application/x-www-fo ...
- URLDecoder异常解决方法
URLDecoder对参数进行解码时候,代码如: URLDecoder.decode(param,"utf-8"); 有时候会出现类似如下的错误: URLDecoder异常Ille ...
- 连通图算法详解之① :Tarjan 和 Kosaraju 算法
相关阅读: 双连通分量 ,割点和桥 简介 在阅读下列内容之前,请务必了解 图论相关概念 中的基础部分. 强连通的定义是:有向图 G 强连通是指,G 中任意两个结点连通. 强连通分量(Strongly ...
- 谈谈对Java平台的理解
从我第一次接触Java的时候,老师就说"Write once,run anywhere",这句话虽然听起来有一点太过于形式主义,但是也突出了它的特点.那么,现在的我们应该总结一下和 ...
- java web工程导入jar包流程,容易犯错
1)首先把jar包拷贝到WEB-INF/lib下 2)在Eclipse中web/WEB-INF/lib路径下刷新.(省略此步骤就会找不到) 3)Java Build Path中Remove掉Web A ...
- List 集合的操作
如果当前id存在集合里 去除当前id 如果不在集合里 去除集合最后一个结果Long videoId = 0l; // 当前 IDList<VideoZoneReturnBean> ...
- Nginx的Gzip功能
什么是HTTP压缩 有时候客户端和服务器之间会传输比较大的报文数据,这时候就占用较大的网络带宽和时长.为了节省带宽,加速报文的响应速速,可以将传输的报文数据先进行压缩,然后再进行传输. HTTP支持多 ...
- 学习Python(新手教程链接)
1.这个是地址: https://www.ggdoc.com/cHl0aG9uIG1zaeaYr_S7gOS5iA2/NTY4Nzc1MWQxMDJkZTJiZDk3MDU4OGE20/
- 【HNOI2015】菜肴制作 - 拓扑排序+贪心
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...