分布式id探索

一、为什么要使用分布式id?

随着数据量增加,数据需要进行水平拆分,但表自增id无法满足唯一性;

二、分布式id的特点

1唯一性

2 趋势递增、单调递增(数据库中存放的数据结构数据从小到大有序排列),如果id不是单调递增,插入数据时为了维持平衡需要不停的做叶子节点的分裂与合并;

三、常用分布式id生成算法

1 uuid:32位16进制数字,36个字符;

优点:性能高,本地生成没有网络消耗;

缺点:过长不易于存储,信息不安全,基于MAC地址生成可能会造成MAC地址泄露

2 雪花算法:

第0位:符号位,始终为0,没用

第1~41位:用来表示时间戳,单位毫秒

第42~52位:前五位机房id,后五位机器id

第53~64位:用来表示序列号,序列号为自增,代表单台机器每秒能够产生的最大id 2 的12次方=4096;

优点:毫秒数在高位,自增序列在低位,id趋势递增;不依赖三方系统,稳定性高;

缺点:强依赖机器时钟,如果机器时钟回拨会导致重复id生成;(解决方法:缓存历史序列号,使用历史序列号直到它耗尽;等待时钟恢复;使用备用时间戳,即将上一次的时间戳加上一个安全间隔,防止重复生成;报警机制,严重时钟回拨时,人工干预;)

3 mysql用一张表专门生成id(读写磁盘网络开销大扩展性差)

4 redis生成(redis持久化会有丢失可能重复)

四、美团leaf算法

1 segment数据库方案,根据数据库中的表进行获取

批量获取分布式id,每次获取数量自定义;

缺点:id号不够随机;当批量获取的数据库id用尽时会产生毛刺现象;

2 雪花算法方案

依赖zk生成workid解决机器过多的问题;根据不同的方案解决始终回拨问题;

解决方案,新启动的机器通过拉去所有机器时间计算平均值,并与本机时间戳比较,判断当前时间戳是否符合;(缓存历史序列号,使用历史序列号直到它耗尽;等待时钟恢复;使用备用时间戳,即将上一次的时间戳加上一个安全间隔,防止重复生成;报警机制,严重时钟回拨时,人工干预;)

相关推荐
灯澜忆梦10 小时前
【RabbitMQ #3】 | Go 客户端 + SpringAMQP
分布式·golang·rabbitmq
Q264336502316 小时前
【有源码】基于Spark的电商客户细分与盈利洞察分析系统-面向精准营销的电商客户细分模型构建与盈利能力可视化研究
大数据·hadoop·分布式·数据挖掘·数据分析·spark·毕业设计
新思维软件17 小时前
基于无线传输的地衡系统:三节点 LoRa 组网与 MQTT 上云的分布式称重方案
分布式·stm32·单片机·嵌入式硬件·物联网·物联网开发
俊哥大数据17 小时前
Flink1.20.3 实时消费 Kafka 数据并解析入湖 Paimon1.4.2 全流程实战
分布式·flink·kafka·数据湖·paimon
宸津-代码粉碎机1 天前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
程序猿乐锅1 天前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
灯澜忆梦1 天前
【RabbitMQ #7】 | 消息转换器
分布式·rabbitmq·ruby
需要8261 天前
分布式事务:Seata AT/TCC/SAGA 的取舍与踩坑
java·spring boot·分布式·spring·spring cloud
CS创新实验室1 天前
为什么三台机器就能选出一个“带头大哥“?——Raft 一致性算法,一次讲透
分布式·操作系统
本人手速666+1 天前
企微开发API如何设计客户冻结状态?WeComApi 在删除、投诉和异常客户场景中的自动化边界
运维·分布式·自动化·企业微信·企微外部群开发·wecomapi·企业微信二次开发