分布式id那些事儿(建议收藏)

这篇具有很好参考价值的文章主要介绍了分布式id那些事儿(建议收藏)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、分布式系统

1.1 分布式系统的定义和应用场景

分布式系统是由多个独立的计算机节点协同工作,以共同完成一个任务的系统。这些节点通过网络进行通信和协调,共享计算和存储资源,从而实现对更大规模问题的处理和更高系统可用性的要求。

分布式应用场景:

  • 互联网应用:互联网公司的网站、搜索引擎、社交媒体、在线购物等都需要支持大量的并发请求和用户访问,而分布式系统可以通过将请求分发到不同的服务器节点,以提高服务的响应速度和可用性。
  • 云计算:云计算平台需要处理大量的用户请求和数据存储,而分布式系统可以通过将计算和存储资源分配到不同的计算机节点上,以提高资源利用率和系统的可扩展性。
  • 大数据:大数据处理需要处理庞大的数据集和实时性的要求,而分布式系统可以通过将数据处理任务分发到不同的计算机节点上,以加速数据的处理和分析过程。

1.2 分布式系统面临的挑战

  1. 通信延迟和网络拥塞
    由于节点之间的通信需要通过网络进行,因此可能会面临通信延迟和网络拥塞等问题。这些问题可能导致系统的响应时间变慢,影响系统的性能和可用性。
  2. 一致性和可靠性问题
    在分布式系统中,数据可能存储在多个节点上,因此需要确保数据的一致性和可靠性。如果数据在某些节点上失效或不一致,可能会导致系统出现错误或数据损坏。
  3. 分布式事务处理问题
    在分布式系统中,可能需要处理跨多个节点的事务。这可能导致事务处理复杂和困难,特别是在出现部分节点故障或网络中断的情况下。
  4. 负载均衡和故障恢复问题
    由于系统可能面临大量的并发请求和计算任务,因此需要进行负载均衡,以确保各个节点的负载平衡。另外,在某些节点故障或网络中断的情况下,需要进行故障恢复,以确保系统的可用性。

二、分布式id

2.1 什么是id

id就是一个身份的标识,在日常生活以及软件系统中都是必不可少的存在的。id可以用来唯一标识一个对象或事件,例如我们都有一个身份证号码来标识每一位公民,在软件系统中,为了标识每一个用户,会有对应的user id,在网购时有订单id,发表评论时有评论id等等。

在计算机科学中,ID(Identifier)通常是一个数字或字符串,用于唯一标识某个实体。在软件开发中,ID常常用于识别、定位、查找和管理对象,例如用户、订单、商品等。

在分布式系统中,生成唯一的ID是非常重要的,因为分布式系统可能包含多个节点和多个数据中心,每个节点都需要在处理数据和请求时分配唯一的ID。这样可以帮助在分布式系统中进行诊断、故障排除和性能分析,同时还可以保证数据的一致性和正确性。

2.2 分布式id的定义

分布式ID(Distributed ID)是指在分布式系统中生成全局唯一的ID的方法或算法。分布式ID的生成需要满足以下几个条件:

  • 全局唯一性:在分布式系统中,生成的ID必须是全局唯一的,即任何时候都不会有两个节点生成相同的ID。
  • 可排序性:生成的ID应该是可排序的,以便在分布式系统中进行排序和比较。
  • 低延迟、高可用、高QPS:很多使用id的场景,都强依赖id生成,没有办法降级,例如用户注册中,如果用户id生成失败,注册流程也没办法继续。因此低延迟、高可用是id生成服务的一个必要要求,避免因为id生成服务的问题影响正常业务流程。

常见的分布式ID生成算法包括UUID、Snowflake、Leaf等。这些算法都可以生成唯一的ID,并且在分布式系统中具有可排序性和可读性。

三、 UUID

UUID(通用唯一识别码)是一种用于唯一标识信息的标准格式,通常由32位的16进制数字和4个“-”符号构成,形式为8-4-4-4-12的36个字符,如:123e4567-e89b-12d3-a456-426655440000,在Java中可以通过java.util.UUID#randomUUID来调用。 有意思的是uuid是存在极小概率重复可能的,不过由于过低,大部分情况都可以忽略。
特点:

  • 全局唯一性:UUID使用标准算法生成,可以保证全球范围内的唯一性。
  • 高性能:生成UUID的算法比较简单,执行效率很高,在分布式系统中广泛使用。
  • 长度适中:UUID通常为128位,长度适中,在使用时可以有效地减少网络传输的数据量。
  • 无序性:由于UUID是随机生成的,因此它们在存储时是没有任何规律可循的,不会影响数据的查询和排序性能。

UUID的优点:
全局唯一性:UUID可以保证全球范围内的唯一性,即使在分布式系统中也可以使用。
高性能:生成UUID的算法比较简单,执行效率很高,在分布式系统中广泛使用。
不可预测性:由于UUID是随机生成的,因此无法被猜测或推断出来,可以提高系统的安全性。

UUID的缺点:

  • 长度过长无法转换成long,通常用String来表示,例如c3b5ec9a-de62-4325-90a9-0fed060f20bb,一共36个字符,如果去掉-,长度为32个字符。
  • 信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。
  • 冲突概率:虽然UUID的冲突概率非常小,但在极端情况下也有可能会发生冲突。

在分布式系统中,由于系统规模的增大和负载的增加,单点自增ID已经不能满足需求。UUID是一种很好的解决方案,可以保证全球范围内的唯一性,并且可以在分布式系统中广泛使用。在一些需要防止ID被猜测或推断的场景下,如密码重置、授权等场景,使用UUID可以提高系统的安全性。但是,UUID的缺点也需要考虑,如可读性差、冲突概率等。为了克服这些缺点,一些方案使用了更加复杂的算法来生成ID,如Twitter的Snowflake算法、美团点评的Leaf算法等。

四、基于数据库的分布式ID

4.1 使用方法

基于数据库的分布式ID生成方法是一种生成全局唯一ID的方法。它的主要原理是利用数据库的特性,如自增主键、事务和锁,保证ID的唯一性和有序性。下面将详细介绍这种方法的实现原理和应用。

基于数据库的分布式ID生成方法的实现原理如下:

  1. 在数据库中创建一个表,用于存储ID生成器的状态信息和生成的ID。
  2. 在该表中创建一个自增主键列,用于生成ID。
  3. 使用事务保证每次生成ID时,都会在该表中插入一条新记录并获取该记录的ID。
  4. 使用数据库锁,保证同一时间只有一个线程能够获取ID。

通过上述步骤,我们可以保证在分布式系统中生成的ID是唯一且有序的。

基于数据库的分布式ID生成方法通常适用于以下场景:

  • 数据库中存在业务表需要生成ID。
  • 需要在分布式系统中使用ID进行排序或索引。
  • 数据库中需要使用自增主键来提高性能。

4.2 优缺点

优点:

  • 可以保证生成的ID是有序的,有利于数据库的索引和排序。
  • 基于事务的实现方法,保证了ID的唯一性。
  • 可以很容易地与数据库集群进行集成。

然而,它也存在以下缺点:

  • 生成ID的效率较低,需要使用事务和锁来保证唯一性和有序性。
  • 需要在数据库中创建一个新表,增加了数据库的复杂度。
  • 可能存在分布式事务的问题,需要特殊处理。

五、基于Redis的分布式ID

Redis的优点是单线程、免去了线程间切换的开销,存取速度快。Redis本身提供像 incr 和 increby 这样的自增原子命令,所以能保证生成的 ID 肯定是唯一有序的。

但Redis无法保证在主节点宕机时自动完成数据一致性的同步操作。那么在极端情况下,主节点挂掉后可能产生重复的id。

六、Snowflake雪花算法

6.1 Snowflake 算法介绍

Snowflake 算法是 Twitter 开源的分布式 ID 生成算法,其核心思想是:一个 long 型的 ID 由 64 位组成,其中,第1 个为符号位,41 个为时间戳,5 个为数据中心标识,5 个为机器标识,12 个为序列号。由此,Snowflake 算法可以生成全局唯一的 ID,同时,其按时间有序递增,也便于对数据进行排序。
分布式id使用场景,分布式,分布式,云计算

Snowflake 算法的特点如下:

  • 生成的 ID 全局唯一:由于其包含了数据中心标识、机器标识和序列号,时间戳,不同的机器生成的 ID 不会冲突。
  • 生成的 ID 按时间有序递增:其 41 位时间戳可以精确到毫秒级别,因此生成的 ID 按时间有序递增,可以方便的按时间排序。
  • 简单高效:Snowflake 算法使用位运算实现 ID 生成,非常高效,可以支持很高的QPS。

6.2 优缺点

Snowflake 算法的优点如下:

  • 全局唯一:Snowflake 算法可以生成全局唯一的 ID,非常适合分布式系统中 ID 的生成。
  • 高效简单:Snowflake 算法的实现非常简单,只需要一次位运算即可生成 ID,因此非常高效。

Snowflake 算法的缺点如下:

  • 对系统时间依赖:Snowflake 算法依赖于系统时间,如果系统时间回拨或者发生跳变,就可能会导致 ID 生成出现问题。
  • 对机器标识和数据中心标识有限制:Snowflake 算法使用了 5 位来标识数据中心和机器,因此,数据中心和机器数量不能超过 2^5 = 32,否则就会出现 ID 冲突问题。

七、美团Leaf算法

7.1 Leaf算法简介

该方案的主要思想是将ID的生成工作交由独立的ID生成服务,由其负责ID的生成和管理。在Leaf算法中,ID生成服务使用数据库和缓存协同工作,生成的ID具有可读性、可排序性和趋势递增性等特点。

Leaf算法将ID分成三个部分:时间戳、数据中心ID、业务ID。其中,时间戳占用的位数最多,可以根据需要分配更多的位数;数据中心ID和业务ID分别用于区分不同的数据中心和业务,分别占用固定的位数。Leaf算法的位分配策略如下表所示:

分布式id使用场景,分布式,分布式,云计算

在Leaf算法中,时间戳的精度可以通过配置来控制,可以选择使用秒、毫秒或微秒级别的时间戳。同时,Leaf算法也支持使用基于ZooKeeper的全局唯一ID生成器,可以避免时间戳回拨等问题。

7.2 优缺点

优点:

  • 算法简单:Leaf算法相比于其他分布式id算法来说,实现和使用都比较简单。
  • 可扩展性:Leaf算法在设计上就考虑了高可用和可扩展性,可以根据业务量的增长灵活调整发号段的数量。
  • 可定制化:Leaf算法的ID号码格式可以定制,可以满足各种业务的需求。

缺点:文章来源地址https://www.toymoban.com/news/detail-780455.html

  • 依赖于MySQL:Leaf算法使用了MySQL数据库作为存储介质,因此在使用之前需要先安装和配置MySQL,增加了系统的复杂度。
  • 单点故障:Leaf算法在使用过程中,依赖于MySQL数据库的可用性,如果数据库宕机,可能导致系统无法生成新的ID号码,造成单点故障。
  • 可能存在瓶颈:当系统并发量很高时,可能会存在MySQL的读写瓶颈,导致ID生成的性能受到影响。

到了这里,关于分布式id那些事儿(建议收藏)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【分布式技术专题】「分布式ID系列」百度开源的分布式高性能的唯一ID生成器UidGenerator

    UidGenerator是什么 UidGenerator是百度开源的一款分布式高性能的唯一ID生成器,更详细的情况可以查看官网集成文档 uid-generator是基于Twitter开源的snowflake算法实现的一款唯一主键生成器(数据库表的主键要求全局唯一是相当重要的)。要求java8及以上版本。 snowflake算法 Snowflake算法描

    2024年02月04日
    浏览(49)
  • 分布式id实战

    目录 常用方式 特征 潜在问题 信息安全 高性能 UUID 雪花算法 数据库生成 美团Leaf方案 Leaf-segment 数据库方案 Leaf-snowflake 方案 uuid 雪花算法 数据库主键 全局唯一 趋势递增 信息安全 如果id连续递增, 容易被爬虫, 批量下载数据 如果订单id是连续递增, 容易被竞争对手推算出日交

    2024年02月21日
    浏览(37)
  • 分布式ID(2):雪花算法生成ID

    1 雪花算法简介 这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等,比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示: 41-bit的时间可以表示(1L

    2024年01月20日
    浏览(37)
  • 算法、语言混编、分布式锁与分布式ID、IO模型

    数据结构和算法是程序的基石。我们使用的所有数据类型就是一种数据结构(数据的组织形式),写的程序逻辑就是算法。 算法是指用来操作数据、解决程序问题的一组方法。 对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源(空间

    2024年02月08日
    浏览(35)
  • 架构设计-分布式ID

    1.不要用主键ID作为业务单号的唯一标识,因为一是数据同步麻烦,第二一旦业务数据扩张涉及到分库分表则数据维护麻烦,因为此时主键ID容易造成重复 。 2.对于有相似属性的业务ID如直播或者录播ID存储在业务表中的一个字段,一旦程序员哪天状态不好忘记区分类型,就很

    2024年02月03日
    浏览(77)
  • 分布式唯一ID实战

    UUID的标准形式包含32个16进制数字,以 “ - ” 进行分割,形式为 8-4-4-4-12的32个字符,实例 550e8400-e29b-41d4-a716-446655440000。 优点: - 性能高,本地生成,没有网络消耗 缺点: - 不易存储,长度太长,32个16进制数字,128位 - 不安全,会暴露MAC地址 - UUID作为MySQL主键,会导致索引

    2024年02月12日
    浏览(31)
  • MongoDB的分布式ID

    MongoDB ObjectID是MongoDB数据库中的一种数据类型,用于表示一个文档(document)在集合(collection)中的唯一标识符。每个ObjectID值是一个12字节的字符串,其中前四个字节表示时间戳,后三个字节表示机器编号,后两个字节表示进程编号,最后一个字节表示随机数。由于MongoDB O

    2024年02月16日
    浏览(35)
  • 分布式ID系统设计(2)

    https://editor.csdn.net/md/?articleId=133988963 应用举例 mongoDB ObjectID 就是一个典型的实现。 以MySQL举例 利用给字段设置AUTO-INCREMENT来保证ID自增,每次业务使用SQL拿到MySQL的ID 这种方案的优缺点: 优点 1 简单。利用数据库实现 成本小,有专业的DBA维护 2 ID单调递增。用来实现一些对于ID有

    2024年02月06日
    浏览(34)
  • 分布式ID系统设计(1)

    我们姑且把它叫做id-server 。那么这么个id-server的设计和考虑需要什么 全局唯一:不能出现重复的id号 最基本要求。 趋势递增: 在innodb中使用的是聚集索引。B+Tree的pk最好是有序的 单调递增:保证下一个id一定要大于上一个id 安全:如果ID是连续的 被爬虫的可能性能就很大。有一些

    2024年02月08日
    浏览(38)
  • 分布式ID系统设计(3)

    第二集说了id-service-Segment-DB可以生成趋势递增的ID,但是ID号是可以计算的。不太适用于一些订单ID生成的场景。因为存在数据暴露的风险 比如我可以对比两天的订单ID号来大致计算出公司一天的订单量。这个有点危险。 所以我们需要id-serviceSnowFlake方案。 id-service-snowFlake完全沿

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包