分布式ID生成方案

分布式ID生成方案(分布式数据库)

背景:在互联网应用中,应用需要为每一个用户分配一个id,在使用分布式数据库情况下,已经不能依靠自增主键来生成唯一性id了。。。

根据特定算法生成唯一ID

可重现的id生成方案:使用用户提供的特定的数据源(登录凭证),通过某种算法生成id,这个过程是可重现的,只要用户提供的数据源是唯一的,那么生成的id也是唯一的。

例如通过用户注册的email+salt,使用摘要算法(md5/sha)生成128bit的数据,然后通过混合因子转变为一个long类型的数据是64bit,有264 个可用数据,理论上冲突几率极低,优点:可用保证id固定的,每次通过email登录,直接能得到id,不需要访问数据库查询id。

不可重现的方案:

使用每个服务器环境中的如下参数:

1. 服务器网卡MAC地址/IP地址(确保服务器之间不冲突) 
2. 每个生成ID的程序的唯一编号(确保同一服务器上的不同服务之间不冲突) 
3. 程序每次启动的唯一编号(确保程序的每次启停之间不冲突) 
4. 启动后内存里的序列号/系统当前时间(确保程序的一次运行期内不冲突)

以及其他的参数,混合生成id,保证多台服务器、多个线程生成的id不冲突。

例如:

UUID.randomUUID().toString() 生成的是length=32的16进制格式的字符串,如果回退为byte数组共16个byte元素,即UUID是一个128bit长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成UUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复

例如:Instagram 的ID生成策略[翻译]

http://www.cnblogs.com/yjl49/archive/2012/04/16/2452210.html

Twitter的 Snowflake---一个使用Apache ZooKeeper来整合所有节点然后生成64bit唯一ID的简洁的服务。java实现

http://www.zuidaima.com/code/file/896737710621696.htm?dir=/896737710621696.java

是由(时间+应用的workId+应用的内存的sequence)生成

随机生成13位绝对无重复随机数的高效方法--这个需要数据库支持,会因为数据库存在瓶颈

http://www.cnblogs.com/wenhuisun/archive/2011/12/22/2297490.html

时间: 2024-10-14 04:28:31

分布式ID生成方案的相关文章

一种基于Orleans的分布式Id生成方案

基于Orleans的分布式Id生成方案,因Orleans的单实例.单线程模型,让这种实现变的简单,贴出一种实现,欢迎大家提出意见 public interface ISequenceNoGenerator : Orleans.IGrainWithIntegerKey { Task<Immutable<string>> GetNext(); } public class SequenceNoGenerator : Orleans.Grain, ISequenceNoGenerator

搞懂分布式技术12:分布式ID生成方案

搞懂分布式技术12:分布式ID生成方案 ## 转自: 58沈剑 架构师之路 2017-06-25 一.需求缘起 几乎所有的业务系统,都有生成一个唯一记录标识的需求,例如: 消息标识:message-id 订单标识:order-id 帖子标识:tiezi-id 这个记录标识往往就是数据库中的主键,数据库上会建立聚集索引(cluster index),即在物理存储上以这个字段排序. 这个记录标识上的查询,往往又有分页或者排序的业务需求,例如: 拉取最新的一页消息 select message-id/

分布式全局ID生成方案

传统的单体架构的时候,我们基本是单库然后业务单表的结构.每个业务表的ID一般我们都是从1增,通过AUTO_INCREMENT=1设置自增起始值,但是在分布式服务架构模式下分库分表的设计,使得多个库或多个表存储相同的业务数据.这种情况根据数据库的自增ID就会产生相同ID的情况,不能保证主键的唯一性. 如上图,如果第一个订单存储在 DB1 上则订单 ID 为1,当一个新订单又入库了存储在 DB2 上订单 ID 也为1.我们系统的架构虽然是分布式的,但是在用户层应是无感知的,重复的订单主键显而易见是不

【系统设计】分布式唯一ID生成方案总结

目录 分布式系统中唯一ID生成方案 1. 唯一ID简介 2. 全局ID常见生成方案 2.1 UUID生成 2.2 数据库生成 2.3 Redis生成 2.4 利用zookeeper生成 2.5 雪花算法生成 2.6 其他生成方式 分布式系统中唯一ID生成方案 在系统设计中,我们经常需要一个全局唯一的ID来标识一条数据,比如订单表,商品表的主键ID.这个ID往往能影响到数据存储.索引和查询等操作的效率.因此这个全局唯一的ID对系统的可用性和性能至关重要. 1. 唯一ID简介 在系统设计中,我们经常

分布式系统唯一ID生成方案汇总

系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见的ID生成策略. 1. 数据库自增长序列或字段 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2)数字ID天然排序,对分页或者需要排序的结果很有帮助. 缺点: 1)不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理. 2)在单个数据库或

【转载】细聊分布式ID生成方法

一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据库中的唯一主键,数据库上会建立聚集索引(cluster index),即在物理存储上以这个字段排序. 这个记录标识上的查询,往往又有分页或者排序的业务需求,例如: (1)拉取最新的一页消息:selectmessage-id/ order by time/ limit 100 (2)拉取最新的一页订单

细聊分布式ID生成方法

一.需求源起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: 消息标识 订单标识 帖子标识 这些记录标识往往都是数据库中的唯一主键,数据库上会建立聚集索引(cluster index),即在物理存储上以这个字段排序. 这个记录标识上的查询,往往又有分页或者排序的业务需求,例如: (1)拉取最新的一页消息:selectmessage-id/ order by time/ limit 100 (2)拉取最新的一页订单:selectorder-id/ order by time/ limit

分布式ID生成

在看代码的时候遇到一个snowflake算法,查了一下发现是Twitter的一个分布式ID生成算法,能够在分布式环境中生成一个全局唯一的ID,然后上网找了一些业界的做法,目前看到了携程和美团的方案,做一下笔记. 背景1 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求:特别一点的如订单.骑手.优惠券也都需要有唯一ID做标识

【数据库】总结常用分布式ID生成策略

1. SequenceID 数据库自增列,最常见的方式.由数据库维护,数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2)数字ID天然排序,对分页或者需要排序的结果很有帮助. 缺点: 1)数据迁移或者合库麻烦. 2)分表分库的时候麻烦. 改进方案: 通过设置各数据库的步长,或者通过HASH进行分表. 2. GUID 微软对UUID这个标准的实现.UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4