`

顺序全局id生成方案-flickr(转载)

 
阅读更多

全局ID的核心需求:

1、全局唯一

2、趋势递增(ID如果做为索引,有序非常重要)

3、单调递增(下一次调用的id一定要大于本次的id)

 

在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作。在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象。但是当我们对数据库进行了分库分表后,就不能依赖于每个表的自增ID来全局唯一标识这些数据了。因此,我们需要提供一个全局唯一的ID号生成策略来支持分库分表的环境。下面来介绍两种非常优秀的解决方案:

 

1. 数据库自增ID——来自Flicker的解决方案

因为MySQL本身支持auto_increment操作,很自然地,我们会想到借助这个特性来实现这个功能。Flicker在解决全局ID生成方案里就采用了MySQL自增长ID的机制(auto_increment + replace into + MyISAM)。一个生成64位ID方案具体就是这样的: 
先创建单独的数据库(eg:ticket),然后创建一个表:

 

1 CREATE TABLE Tickets64 (
2             id bigint(20) unsigned NOT NULL auto_increment,
3             stub char(1) NOT NULL default '',
4             PRIMARY KEY  (id),
5             UNIQUE KEY stub (stub)
6     ) ENGINE=MyISAM

 

当我们插入记录后,执行SELECT * from Tickets64,查询结果就是这样的:

 

1 +-------------------+------+
2 | id                | stub |
3 +-------------------+------+
4 72157623227190423 |    a |
5 +-------------------+------+

 

在我们的应用端需要做下面这两个操作,在一个事务会话里提交:

 

1 REPLACE INTO Tickets64 (stub) VALUES ('a');
2 SELECT LAST_INSERT_ID();

 

这样我们就能拿到不断增长且不重复的ID了。 
到上面为止,我们只是在单台数据库上生成ID,从高可用角度考虑,接下来就要解决单点故障问题:Flicker启用了两台数据库服务器来生成ID,通过区分auto_increment的起始值和步长来生成奇偶数的ID。

 

1 TicketServer1:
2 auto-increment-increment = 2
3 auto-increment-offset = 1
4  
5 TicketServer2:
6 auto-increment-increment = 2
7 auto-increment-offset = 2

 

最后,在客户端只需要通过轮询方式取ID就可以了。

  • 优点:充分借助数据库的自增ID机制,提供高可靠性,生成的ID有序。
  • 缺点:占用两个独立的MySQL实例,有些浪费资源,成本较高。

参考:http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/

 

2. 独立的应用程序——来自Twitter的解决方案

Twitter在把存储系统从MySQL迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。GitHub地址:https://github.com/twitter/snowflake。根据twitter的业务需求,snowflake系统生成64位的ID。由3部分组成:

 

1 41位的时间序列(精确到毫秒,41位的长度可以使用69年)
2 10位的机器标识(10位的长度最多支持部署1024个节点)
3 12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)

 

最高位是符号位,始终为0。

  • 优点:高性能,低延迟;独立的应用;按时间有序。
  • 缺点:需要独立的开发和部署。
分享到:
评论

相关推荐

    全局唯一ID生成

    时间戳保证了ID的生成顺序,工作节点ID确保不同节点生成的ID互不干扰,而序列号则用于在同一节点同一毫秒内生成多个ID。这种方法可支持上亿级别的ID生成,且无需中心协调,具备较高的并发性和扩展性。 除此之外,...

    分布式ID生成策略_snowflake算法

    Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用于Java和其他编程语言的系统中。 Snowflake算法的核心思想是将64位的整数划分为不同的部分,分别为: 1. **时间戳**(41位):自定义...

    TIA博途-顺序队列全局FB库文件-GF-sequential-Queue-FIFO.zip

    在这个特定的案例中,"TIA博途-顺序队列全局FB库文件-GF-sequential-Queue-FIFO.zip" 提供了一个基于顺序队列(Sequential Queue)的全局功能块(Global Function Block, GFB)库,该库特别关注先进先出(First In ...

    Springboot唯一编号整合,vesta全局唯一id生成器

    通过以上步骤,我们可以在SpringBoot项目中成功地集成Vesta ID Generator,为分布式系统提供稳定、高效的全局唯一ID生成方案。在高并发环境下,Vesta的优秀性能和易用性将为系统的可靠性和扩展性带来显著提升。

    分布式唯一ID解决方案-雪花算法.docx

    ID生成器在应用程序中,经常需要全局唯一的ID作为数据库主键。如何生成全局唯一ID?首先,需要确定全局唯一ID是整型还是字符串?如果是字符串,那么现有的UUID就完全满足需求,不需要额外的工作。 SnowFlake算法...

    Mysql全局ID生成方法

    既然要sharding,那么不可避免的要讨论到sharding key问题,在有些业务系统中,必须保证sharding key全局唯一,比如存放商品的数据库等,那么如何生成全局唯一的ID呢,下文将从DBA的角度介绍几种常见的方案。...

    Go-token服务提供token一致性服务以及相关的全局ID生成服务等

    在IT行业中,尤其是在分布式系统和微服务架构的设计与实现中,令牌(Token)服务和全局唯一ID(Global Unique Identifier, GUID)生成服务是至关重要的组件。Go语言由于其简洁、高效的特性,常被用于构建这类服务。...

    生成数字的全局唯一Id.zip

    在IT行业中,生成全局唯一的ID(Identifier)是一个常见的需求,特别是在分布式系统中,数据库记录、消息队列等都需要这样的标识符。"生成数字的全局唯一Id.zip" 提供了一个Java实现,利用雪花算法来生成Long类型的...

    全局自增ID设计方案

    **一、数据库自增ID方案** ##### Flicker方案解析 Flicker提出的解决方案是利用MySQL自身的auto_increment特性来实现。该方案的具体步骤如下: 1. **数据库表设计**:首先创建一个名为`Tickets64`的表,包含两个...

    67.[开源][安卓][全局代理]proxydroid-master

    67.[开源][安卓][全局代理]proxydroid-master ProxyDroid是Android上的一个全局代理应用,遵循GPLv3协议,可以帮助你设置Android设备上的代理。proxydroid项目包含了ProxyDroid所有开放源代码。

    50_一个关键的问题!分库分表之后全局id咋生成?.zip

    选择哪种方法取决于具体的应用场景,包括对ID长度、生成速度、唯一性、顺序性的要求,以及现有系统的架构。在实际应用中,往往需要根据业务需求进行权衡和定制,以找到最适合的全局ID生成策略。

    全局唯一id生成器vesta.rar

    Vesta是一款广泛应用于分布式系统中的全局唯一ID(Global Unique ID,GUID)生成器。在分布式环境中,为了确保每个实体的标识都是唯一的,全局唯一ID生成器扮演着至关重要的角色。Vesta的设计目标是高效、可扩展且...

    细聊分布式ID生成方法.pdf

    针对不同的应用场景,本文介绍了几种常见的分布式ID生成方案。 ##### 3.1 消息ID(Message-ID) 对于消息传递系统而言,确保消息ID的全局唯一性至关重要。一种常见做法是基于时间戳进行排序,并限制每批次生成的...

    VC++全局变量初始化-16.09.26

    这种分段初始化的方法使得开发者能够更精细地控制全局变量的初始化顺序,这对于避免某些初始化顺序不当导致的错误非常有用。 例如,考虑以下代码: ```cpp #pragma init_seg(".CRT$XCC") int C1 = GetC1(); int C2...

    gateway+sleuth+docker+单点登陆+全局ID生成策略.rar

    在Spring Cloud生态系统中,"gateway+sleuth+docker+单点登陆+全局ID生成策略"是一组关键组件,用于构建高效、可扩展的微服务架构。让我们深入探讨这些概念及其在实际开发中的应用。 首先,Spring Cloud Gateway是...

    浅谈CAS在分布式ID生成方案上的应用

    这种方案不仅能够有效解决高并发下的ID生成问题,还能保证ID的全局唯一性和连续性,为分布式系统的稳定运行提供了坚实的基础。当然,这种方法也并非完美无缺,例如生成的ID不再是绝对递增的,而是趋势递增的,但这...

    javaID生成器javaID生成器

    - **使用 IP 地址**:虽然文中没有明确提到,但在实际应用中,可以将当前机器的 IP 地址加入到 ID 的生成过程中,这样即使在分布式环境中也能保证 ID 的全局唯一性。 - **其他信息的整合**:根据业务需求,还可以...

    全局优化算法CMA-ES.rar

    全局优化算法是解决多维度复杂优化问题的一种方法,它旨在找到一个函数的全局最优解,而非局部最优解。在各种工程、科学计算以及机器学习领域,全局优化算法扮演着至关重要的角色。CMA-ES(Covariance Matrix ...

Global site tag (gtag.js) - Google Analytics