设计思想赏析-分布式id生成算法-雪花算法

简介: 设计思想赏析-分布式id生成算法-雪花算法

唯一ID怎么生成?

在数据库的使用中,根据第二范式的设计准则:数据库中的每行必须可以被唯一的区分,因此我们经常需要生成唯一id。在RDBMS(关系数据库管理系统)时代,数据库提供序列生成器,例如oracle的sequence,mysql的increment自增长字段等。RDBMS是中心化环境(单机环境),全局唯一只需要当前机器自己说了算就行;但是在分布式环境(去中心化)下,多台主机并存,如何让他们自动生成全局不会重复的id呢?


主要的解决方案有以下两类

法一:仍然采用中心化的思路

   在RDBMS中预生成一批序列,分布式环境中的每个节点启动时到RDBMS中获取一个号段,各自使用。美团leaf的Segment模式就属于此类型。


方法二:采用去中心化的思想

    约定一个规则,分布式环境中的每个节点自己生成全局唯一的id即可。UUID、GUID、雪花算法都属于此类情况。

雪花算法

     其实很多创新方法都非常简单,雪花算法也是如此。我们需要学习其设计思想,在分布式环境中的id都可以套用此方法。

雪花算法是由Twitter开源的,设定64个bit【思考:为什么是64位?】,由首位、时间戳、机器id和自增序列四部分组成。

  • 首位,1个bit,固定为0;【思考:为什么首位为0?】
  • 时间戳,41个bit,当前时间与指定日期的毫秒级时间差;【思考:为什么是时间差?】
  • 集群节点id,10个bit,最多2^10,共计1024台机器;
  • 自增序列,12个bit,最多2^12,共计4096个id。

天下没有两片相同的雪花

    每个节点在生成id时,会因为时间戳和自增序列的不同,生成的id局部唯一;加上集群节点id,自然就做到了全局唯一,因此雪花算法做到了“天下没有两片相同的雪花”的目的。

    同时,时间戳按毫秒计,每毫秒最多可支持4096个id,因此,每个节点每秒可生成4096000个id,且生成的id在(2^41-1)/86400/365/1000=69年之后才会超出41位,应对多大的量都够用了。

设计核心

所以其设计的核心是:

1、  循环使用的自增id,保证某个时间内局部唯一;

2、毫秒级时间戳,提供秒级生成大量id,应对高请求;

3、集群节点id,保证全局唯一。

     设计思想明白了,就可以进行相应改良。例如百度的集群已经超过1024台了,那该怎么办?

     百度对雪花算法进行了调整,他的uid是1bit首位+28bit时间戳+22bit机器id+13bit序列号。所以百度uid支持2^22=4194304个节点,每个节点每个秒可生成2^13=8192个id。但是时间戳变短了,只能支持到秒级,所以这个算法生成的id,在(2^28-1)/86400/365=8.5年之后就会超出28bit的长度。

     所以,百度的同学,你准备8年半之后要干啥?


拓展:雪花算法会遇到什么问题?有什么解决办法?还可以应用在哪个场景?

相关文章
|
1天前
|
消息中间件 算法 分布式数据库
Raft算法:分布式一致性领域的璀璨明珠
【4月更文挑战第21天】Raft算法是分布式一致性领域的明星,通过领导者选举、日志复制和安全性解决一致性问题。它将复杂问题简化,角色包括领导者、跟随者和候选者。领导者负责日志复制,确保多数节点同步。实现细节涉及超时机制、日志压缩和网络分区处理。广泛应用于分布式数据库、存储系统和消息队列,如Etcd、TiKV。其简洁高效的特点使其在分布式系统中备受青睐。
|
1天前
|
算法 分布式数据库
Paxos算法:分布式一致性的基石
【4月更文挑战第21天】Paxos算法是分布式一致性基础,由Leslie Lamport提出,包含准备和提交阶段,保证安全性和活性。通过提案编号、接受者和学习者实现,广泛应用于分布式数据库、锁和配置管理。其简单、高效、容错性强,影响了后续如Raft等算法,是理解分布式系统一致性关键。
|
1天前
|
SQL 算法
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
13 1
|
1天前
|
算法
【免费】基于ADMM算法的多微网电能交互分布式运行策略(matlab代码)
【免费】基于ADMM算法的多微网电能交互分布式运行策略(matlab代码)
|
1天前
|
算法 Serverless 调度
基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究(matlab代码)
基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究(matlab代码)
|
1天前
|
算法 关系型数据库 MySQL
Go语言中的分布式ID生成器设计与实现
【5月更文挑战第6天】本文探讨了Go语言在分布式系统中生成全局唯一ID的策略,包括Twitter的Snowflake算法、UUID和MySQL自增ID。Snowflake算法通过时间戳、节点ID和序列号生成ID,Go实现中需处理时间回拨问题。UUID保证全局唯一,但长度较长。MySQL自增ID依赖数据库,可能造成性能瓶颈。选择策略时需考虑业务需求和并发、时间同步等挑战,以确保系统稳定可靠。
115 0
|
1天前
|
存储 分布式计算 负载均衡
分布式(计算机算法)
分布式(计算机算法)
|
1天前
|
存储 SQL 算法
搞定了 6 种分布式ID,分库分表哪个适合做主键?
在《ShardingSphere5.x分库分表原理与实战》系列的第七篇文章中,作者探讨了分布式ID在分库分表中的重要性,以及如何利用`ShardingSphere-jdbc`的多种主键生成策略。文章介绍了`UUID`、`NanoID`、自定义雪花算法和`CosId`等策略的优缺点,并警告不要在SQL中手动拼接主键字段。此外,文章还展示了如何配置这些策略,并提醒读者`CosId`在5.2.0版本可能不可用。最后,文章讨论了如何自定义分布式主键生成算法,并强调选择策略时要考虑全局唯一性、性能和易用性。
115 1
|
1天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
1天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。

热门文章

最新文章

http://www.vxiaotou.com