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生成方案汇总的更多相关文章

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

    基于Orleans的分布式Id生成方案,因Orleans的单实例.单线程模型,让这种实现变的简单,贴出一种实现,欢迎大家提出意见 public interface ISequenceNoGenerat ...

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

    搞懂分布式技术12:分布式ID生成方案 ## 转自: 58沈剑 架构师之路 2017-06-25 一.需求缘起 几乎所有的业务系统,都有生成一个唯一记录标识的需求,例如: 消息标识:message-i ...

  3. 分布式id生成方案总结

    本文已经收录自 JavaGuide (60k+ Star[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.) 本文授权转载自:https://juejin.im/post/ ...

  4. 分布式ID生成方案总结整理

    目录 1.为什么需要分布式ID? 2.业务系统对分布式ID有什么要求? 3.分布式ID生成方案 3.1 UUID 3.2.数据库自增 3.3.号段模式 3.4. Redis实现 3.4. 雪花算法(S ...

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

    系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...

  6. [转]分布式系统唯一ID生成方案汇总

    系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...

  7. 分布式系统唯一ID生成方案汇总【转】

    转自:http://www.cnblogs.com/haoxinyue/p/5208136.html 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很 ...

  8. 分布式ID生成方案

    系统唯一ID是设计一个系统的时候常常会遇到的问题,也常常为这个问题而纠结. 生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略. 0. 分布式ID要求 ...

  9. 分布式系统ID生成方案汇总

    在分布式系统中,需要对大量的数据.消息.请求等进行唯一的标识,例如分布式数据库的ID需要满足唯一且多数据库同步,在单一系统中,使用数据库自增主键可以满足需求,但是在分布式系统中就需要一个能够生成全局唯 ...

随机推荐

  1. SAFe必备——提高团队敏捷性

    规模化敏捷之于项目群,就像Scrum之于敏捷团队.为了创建高质量业务解决方案,企业需要提高自身能力,提升团队和技术敏捷性,实现真正的规模化敏捷. 敏捷发布火车 实现团队和技术敏捷性,首先需要敏捷团队围 ...

  2. 文字识别还能这样用?通过Python做文字识别到破解图片验证码

    前期准备 1. 安装包,直接在终端上输入pip指令即可: # 发送浏览器请求 pip3 install requests # 文字识别 pip3 install pytesseract # 图片处理 ...

  3. 记不住git命令?试试这个命令浏览网站

    Find the right git commands without digging through the web. 找 git 命令,无需谷歌百度,无需 git -help,这个网站以图形界面的 ...

  4. 使用Python从PDF文件中提取数据

    前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...

  5. 6、Java 运算符

    Java运算符按功能可分为:算数运算符.关系运算符.逻辑运算符.位运算符.赋值运算符和条件运算符. 1.算数运算符 算术运算符包括通常的加(+).减(-).乘(*).除(/).取模(%),完成整数型和 ...

  6. C#LeetCode刷题之#824-山羊拉丁文​​​​​​​(Goat Latin)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3971 访问. 给定一个由空格分割单词的句子 S.每个单词只包含大 ...

  7. Vue 内联模板(inline-template)

    内联模板不会把子组件的内容分发渲染到父组件中 而是需要在父组件中实现其内容的渲染 父组件 <template> <div> <template-inline inline ...

  8. Linux学习笔记 一 第三章 Linux常用命令

    第三章Linux常用命令 一.文件处理命令 1.命令格式 2.目录处理命令:ls 3.目录处理命令:mkdir 4.文件处理命令: touch

  9. MySQL设置跳过密码验证

    1.linux系统下 在/etc/my.cnf文件中, [mysqld]下面新增skip-grant-tables,然后重启服务器.

  10. 轻轻松松学CSS:position

    position属性表示元素的定位类型,在CSS布局中,position发挥着非常重要的作用,一些元素的布局就是用position完成的,鉴于此,本文结合一些小实例详细讲解一下. position属性 ...