设计思想赏析-分布式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年半之后要干啥?


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

相关文章
|
3月前
|
负载均衡 算法 调度
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
217 11
|
3月前
|
算法 安全 Python
【顶级EI复现】分布式电源选址定容的多目标优化算法(Matlab代码实现)
【顶级EI复现】分布式电源选址定容的多目标优化算法(Matlab代码实现)
148 1
|
3月前
|
传感器 机器学习/深度学习 算法
【无人机编队】基于麻雀算法分布式无人机群自适应航迹规划和碰撞检测研究(Matlab代码实现)
【无人机编队】基于麻雀算法分布式无人机群自适应航迹规划和碰撞检测研究(Matlab代码实现)
117 2
|
3月前
|
并行计算 算法 调度
基于串行并行ADMM算法的主从配电网分布式优化控制研究(Matlab代码实现)
基于串行并行ADMM算法的主从配电网分布式优化控制研究(Matlab代码实现)
258 0
|
3月前
|
并行计算 算法 安全
【ADMM、碳排放】基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究【IEEE6节点、IEEE30节点、IEEE118节点】(Matlab代码实现)
【ADMM、碳排放】基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究【IEEE6节点、IEEE30节点、IEEE118节点】(Matlab代码实现)
239 0
|
4月前
|
运维 算法 5G
【优化管理】基于事件触发的弹性分布式能源管理算法研究(Matlab代码实现)
【优化管理】基于事件触发的弹性分布式能源管理算法研究(Matlab代码实现)
110 0
|
7月前
|
NoSQL 算法 安全
分布式锁—1.原理算法和使用建议
本文主要探讨了Redis分布式锁的八大问题,包括非原子操作、忘记释放锁、释放其他线程的锁、加锁失败处理、锁重入问题、锁竞争问题、锁超时失效及主从复制问题,并提供了相应的优化措施。接着分析了Redis的RedLock算法,讨论其优缺点以及分布式专家Martin对其的质疑。此外,文章对比了基于Redis和Zookeeper(zk)的分布式锁实现原理,包括获取与释放锁的具体流程。最后总结了两种分布式锁的适用场景及使用建议,指出Redis分布式锁虽有性能优势但模型不够健壮,而zk分布式锁更稳定但部署成本较高。实际应用中需根据业务需求权衡选择。
|
10月前
|
运维 NoSQL 算法
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
本文深入探讨了基于Redis实现分布式锁时遇到的细节问题及解决方案。首先,针对锁续期问题,提出了通过独立服务、获取锁进程自己续期和异步线程三种方式,并详细介绍了如何利用Lua脚本和守护线程实现自动续期。接着,解决了锁阻塞问题,引入了带超时时间的`tryLock`机制,确保在高并发场景下不会无限等待锁。最后,作为知识扩展,讲解了RedLock算法原理及其在实际业务中的局限性。文章强调,在并发量不高的场景中手写分布式锁可行,但推荐使用更成熟的Redisson框架来实现分布式锁,以保证系统的稳定性和可靠性。
637 0
【📕分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理
|
11月前
|
存储 人工智能 算法
解锁分布式文件分享的 Java 一致性哈希算法密码
在数字化时代,文件分享成为信息传播与协同办公的关键环节。本文深入探讨基于Java的一致性哈希算法,该算法通过引入虚拟节点和环形哈希空间,解决了传统哈希算法在分布式存储中的“哈希雪崩”问题,确保文件分配稳定高效。文章还展示了Java实现代码,并展望了其在未来文件分享技术中的应用前景,如结合AI优化节点布局和区块链增强数据安全。
|
9月前
|
开发框架
osharp集成Yitter.IdGenerator并实现分布式ID
本文介绍了在 osharp 框架中集成 Yitter.IdGenerator 实现分布式 ID 的方法。osharp 是一个基于 .NET Core 的快速开发框架,而 Yitter.IdGenerator 是一种高效的分布式 ID 生成器。通过实现 `IKeyGenerator<long>` 接口并创建 `YitterSnowKeyGenerator` 类,结合 `YitterIdGeneratorPack` 模块化配置,实现了分布式环境下唯一 ID 的生成。
206 0