文章目录

  • 摘要
  • 1 分布式id相关概念
    • 1.1 为什么需要分布式id
      • 1.1.1 BTree
      • 1.1.2 B+Tree
      • 1.1.3 B+Tree相比于BTree优势
    • 1.2 什么是分布式id
    • 1.3 常见分布式id生成策略
      • 1.3.1 基于数据库自增id
      • 1.3.2 基于UUID
      • 1.3.3 Twitter的Snowflake算法
      • 1.3.4 美团的Leaf-segment算法
      • 1.3.5 ZooKeeper发号器
      • 1.3.6 Redisson分布式锁
  • 2 Leaf-segment 算法(美团——Leaf)
    • 2.1 Leaf-segment算法是什么?
    • 2.2 为什么需要 Leaf-segment算法
    • 2.3 Leaf-segment算法解决的问题
    • 2.4 Leaf-segment算法架构图
    • 2.5 美团——Leaf(基于docker)
    • 2.6 Leaf-segment算法入门

摘要

摘要:分布式id;全局唯一性;Leaf-segment 算法;美团——Leaf;BTree;B+Tree

1 分布式id相关概念

1.1 为什么需要分布式id

为什么需要分布式id?

  • 全局唯一性问题:在分布式环境中,存在多节点共同完成一个功能,这些节点会被放在不同物理机上,每个节点都运行一个或多个进程,当某一时刻出现,多个进程同时请求生成id情况,会出现id重复问题。
  • 性能问题:解决全局唯一性问题关键,就是让id唯一,然而,在分布式系统中,每个节点都需要单独维护自己id,这时候有两种解决方案,第一种,全局使用序列号生成器生成id(虽然可以保证全局唯一性),但若只有一个节点运行,那么序列号生成器势必会成为性能瓶颈;第二种,使用分布式id思想,让多个节点在同一id空间内生成唯一id,且id唯一,从而保证整个系统的正确与可靠。
  • 趋势递增:在MySQL InnoDB引擎中使用聚集索引,由于多数RDBMS使用B-tree的数据结构(每个节点都会索引节点和数据节点)存储索引数据,因此,在主键选择上应当选择有序(B-tree是有顺序的,Tree是有顺序的)主键保证写入性能。
  • 单调递增:保证下一个id > 上一个id,例如:事务版本号(乐观锁)、排序等特殊要求。
  • 信息安全:若id连续,会造成恶意用户爬取数据工作简单,例如:按照指定URL顺序下载网站数据;若id为订单号,则竞对只需间隔一天时间下单,便可知道平台一天单量,因而,在特定场景下,需要id无规则。

1.1.1 BTree

针对数据节点:

  • 在BTree中,每个节点即可是索引节点又可是数据节点,即索引节点与数据节点是一体,节点既存索引,又存储数据。

针对索引节点:

  • 在BTree中,索引节点中存储的是索引关键字和指向子节点的指针,每个节点存储的子节点数是固定的,且与键值的个数相同。

1.1.2 B+Tree

针对数据节点:

  • 只有叶子节点存储数据,且同一层叶子节点间形成一个有序链表,便于区间查找,而非叶子节点只存储索引关键字和指向孩子节点的指针,不存储数据。

针对索引节点:

  • 索引节点中存储的是索引关键字和指向子节点的指针,每个节点可以存储多个子节点的索引关键字和指针,这样可以减少索引节点的数量,提高树的高度和查询效率。

1.1.3 B+Tree相比于BTree优势

  • 基于上述对于B+Tree和BTree的论述,B+Tree有更好的磁盘读写性能、更快的查询速度和更高的查询效率,在MySQL和Oracle中都采用B+Tree索引结构优化查询效率。

1.2 什么是分布式id

分布式id:指在分布式环境下,为保证id全局唯一性而设计的一种分布式id生成方式。

  • 全局唯一:不同机器在不同时间生成id必须唯一,确保整个分布式系统内id唯一性。
  • 有序递增:生成id需要具有有序性,便于排序和查询,也方便数据库索引,提高效率。

1.3 常见分布式id生成策略

1.3.1 基于数据库自增id

基于数据库自增id:使用数据库自增id主键生成全局唯一id,适用于单机场景和数据量较小的分布式场景。

1.3.2 基于UUID

基于UUID:使用UUID生成全局唯一id,这种方法适用于分布式环境,但是,有以下缺点

  • ① UUID生成id较长,占用存储空间较大,索引不够高效。

1.3.3 Twitter的Snowflake算法

Snowflake算法:Twitter开发的算法,使用64位二进制生成全局唯一id,该算法的核心是将64位的整数分成多个区域,分别代表时间戳、机器id、序列号等信息,具体用位运算实现,在保证全局唯一性同时,保证id的排序和高效索引。

1.3.4 美团的Leaf-segment算法

Leaf-segment算法:美团开发的算法,使用一个一个数据库记录保存当前的id区间,然后将id的生成请求发送给多个服务节点,每个服务节点拿到id区间后,可以在本地生成一定量的id,然后以缓存的方式使用,使用该算法将高并发下的单点性能问题分散到多个节点,通过id生成效率。

1.3.5 ZooKeeper发号器

ZooKeeper发号器:使用ZooKeeper实现分布式锁,使得在多个服务节点同时生成id时,只有一个节点可以进行生成,确保id的唯一性。(但是会造成线程阻塞,影响性能)

1.3.6 Redisson分布式锁

Redisson分布式锁:使用Redisson实现分布式锁,使得在多个服务节点同时生成id时,只有一个节点可以进行生成,确保id唯一性。(但是会造成线程阻塞,影响性能;依赖其他库,为我们带来许多额外工作量)

2 Leaf-segment 算法(美团——Leaf)

2.1 Leaf-segment算法是什么?

2.2 为什么需要 Leaf-segment算法

2.3 Leaf-segment算法解决的问题

2.4 Leaf-segment算法架构图

2.5 美团——Leaf(基于docker)

2.6 Leaf-segment算法入门

[分布式id]:Leaf——美团点评分布式ID生成系统相关推荐

  1. 【阅读】Leaf——美团点评分布式ID生成系统

    文章目录 背景 常见实现方案 UUID 优势 缺点 应用 类SnowFlake方案 优点 缺点 应用 数据库生成 优点 缺点 MySQL 增强版 优点 缺点 Leaf -segment方案 优点 缺点 ...

  2. Leaf——美团点评分布式ID生成系统

    背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数 ...

  3. 基于.NET Standard的分布式自增ID算法--美团点评LeafSegment

    概述 前一篇文章讲述了最流行的分布式ID生成算法snowflake,本篇文章根据美团点评分布式ID生成系统文章,介绍另一种相对更容易理解和编写的分布式ID生成方式. 实现原理 Leaf这个名字是来自德 ...

  4. 带你了解「美团、百度和滴滴」的分布式 ID 生成系统

    文章目录 美团 背景 常见方法介绍 UUID 类snowflake方案 数据库生成 Leaf 方案实现 Leaf-segment 数据库方案 双 buffer 优化 Leaf 高可用容灾 Leaf-s ...

  5. 美团技术分享:深度解密美团的分布式ID生成算法

    本文来自美团技术团队"照东"的分享,原题<Leaf--美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息I ...

  6. 分布式「唯一ID生成器」的几种生成方案

    前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十 ...

  7. 在 .NET6.0 中实现 Leaf-segment 分布式 ID 生成系统

    背景 分布式 ID (Distributed ID)是指在分布式系统中,为了保证全局唯一性而生成的一类 ID.在分布式系统中,由于存在多个节点同时生成 ID 的情况,因此需要采用一定的算法来保证生成的 ...

  8. MTDDL——美团点评分布式数据访问层中间件

    https://tech.meituan.com/mtddl.html 背景 2016年Q3季度初,在美团外卖上单2.0项目上线后,商家和商品数量急速增长,预估商品库的容量和写峰值QPS会很快遇到巨大 ...

  9. 美团点评容器平台HULK的调度系统

    本文是美团点评基础架构系列文章之一.这个系列将全面介绍支撑数亿用户.超千万日订单的美团点评平台诸多业务的公共基础架构相关技术.系列已经发布的文章包括: - <分布式会话跟踪系统架构设计与实践&g ...

最新文章

  1. 概率图模型PGM——D map, I map, perfect map
  2. 如何解决Android 5.0中出现的警告:Service Intent must be explicit
  3. Docker 修改运行中的容器端口映射
  4. 查询所有的存储过程哪些中包含某个字符串
  5. php use include区别,php use和include区别总结
  6. android 多个复选框,Android UI控件之CheckBox(复选框、多选框)
  7. 【Java】如何较好地将int转化成String
  8. 不写程序,整体就泡 土豆网电视剧
  9. Java-使用反射获取类型信息
  10. VMware虚拟机安装RHEL6.5系统
  11. 华为交换机虚拟局域网(VLAN)的配置
  12. 广义线性模型解读必看文章
  13. 工业交换机的管理方式有哪些?
  14. 启动Nginx时报错:error while loading shared libraries: librdkafka.so.1: cannot open shared object file: No
  15. 关于web项目播放AMR格式音频的问题
  16. 靴子落地,火山引擎官宣进军云市场
  17. Set是如何不能加入重复值
  18. 最新千锋3G学院Android游戏开发教程之数独游戏
  19. 考研英语 - word-list-46
  20. Flutter 底部弹窗详解

热门文章

  1. [Verilog学习笔记] always@(*)语句是什么意思
  2. matlab 密度热力图,使用matplotlib绘制热力图
  3. postgre+timescaledb笔记
  4. 年货都买些什么?年货清单列表用便签记下来
  5. Redis详解(六)渐进式rehash机制
  6. ROS学习:URDF语法详解一link篇
  7. Java模拟一个简单的双向链表
  8. [状压DP][BFS][哈希]JZOJ 3243 Cube
  9. 儿童节,却有超过6000万的儿童无人陪伴
  10. VC++函数ATOM MyregisterClass(HINSTANCE hInstance)