分布式系统唯一ID生成器
像传统数据库中有自增 auto increment 属性的主键,但是自增属性在分布式
环境中不好用,因为单数据库服务器不够大,而在多个数据库之间生成唯一ID且
只容忍极低延时是很具挑战性的。
多主复制
图7-2
利用数据库的自增特性,并不是把下一个ID加1,而是加k,k是正在使用的服务器数量。
- 很难与多个数据中心一起扩展,需要进行额外的同步和协调操作
- 在分布式环境下,多个服务器同时生成 ID, 可能导致 ID 并不连续,也即 ID
并不随时间递增
- 当服务器被添加或者移除时,ID不能很好地随之变化
UUID
UUID 是一个 128 位的数字,用于标识计算机系统中的信息。
UUID
重复的概率非常低,每秒产生10亿个UUID且持续约100年,产生一个重复UUID的概率才达到50%。
UUID 方法的优点:
- 生成 ID 很简
单。服务器之间不需要任何协调,所以不会有任何同步问题
- 系统易于扩展,因为每个 Web 服务器只负责生成它们自己使用的 ID 。 ID
生成器可以很容易地随 Web 服务器一起扩展。
缺点:
- ID 长 128 位,但是我们要求的是 64 位。
- ID 并不随时 间增加。
- ID 可能是 非数字的。
工单服务器
这个方法的思想是利用中心化的单数据库服务器的自增特性
图7-4
工单服务器方法的优点是:
缺点:存在单点故障,为了避免单点故障,可以设置多个工单服务器,但又会引入新的挑战
如 数据同步问题。
推特的雪花算法
推特的唯一ID生成系统叫 Snowflake
把ID分成不同的部分,组成一个唯一ID
图7-5
- 符号位 1 位: 它始终为数字 O ,
留作未来使用。它有可能被用来区分有符号数和无符号数
- 时间戳 41 位:它是从纪元或者自定义纪元开始以来的毫秒数。我们使用
Snowflake 默认纪元 (epoch ) 1,288 , 834,974,657, 相 当千 UTC 时间 2010
年 11 月 4 日 01:42 :54
- 数据中心 ID 5 位:最多可以有 32 =
2^5 数据中心
- 机器ID 5位:每个数据中心最多可以有 32 台机器
- 序列号 12 位:对个某个机器 进程,每生成一个 ID, 序列号就加 1
。这个数字每毫秒开始时 都会被重置为 0