分布式系统唯一ID设计
目录
1 概述
2 分布式唯一ID特点
3 分布式唯一ID传统方案
3.1 UUID
3.2 数据库生成
3.3 Redis生成ID
3.4 利用zookeeper生成唯一ID
3.5 snowflake(雪花算法)方案
1 概述
在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在金融、电商、支付、等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求,此时一个能够生成全局唯一ID的系统是非常必要的。
2 分布式唯一ID特点
- 全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。
- 趋势递增:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B-tree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能
- 单调递增:保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求。
- 运行效率:ID简短,查询效率快
- 信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道我们一天的单量。所以在一些应用场景下,会需要ID无规则、不规则。
3 分布式唯一ID传统方案
3.1 UUID
UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的36个字符,示例:550e8400-e29b-41d4-a716-446655440000,到目前为止业界一共有5种方式生成UUID,详情见IETF发布的UUID规范 A Universally Unique IDentifier (UUID) URN Namespace。
优点:
- 代码实现简单。
- 本机生成,没有性能问题
- 因为是全球唯一的ID,所以迁移数据容易
缺点:
- 不易于存储:UUID太长,16字节128位,通常以36长度的字符串表示,很多场景不适用。
- 信息不安全:基于MAC地址生成UUID的算法可能会造成MAC地址泄露,这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。
- 每次生成的ID是无序的,无法保证趋势递增
3.2 数据库生成
这个方案就是利用了MySQL的主键自增auto_increment,默认每次ID加1。
优点:
- 数字化,id递增
- 查询效率高
- 具有一定的业务可读
缺点:
- 存在单点问题,如果mysql挂了,就没法生成iD了
- 数据库压力大,高并发抗不住
3.3 Redis生成ID
利用redis的incr原子性操作自增,比较适合使用Redis来生成每天从0开始的流水号。比如订单号=日期+当日自增长号。
优点:
- 不依赖于数据库,灵活方便,且性能优于数据库。
- 数字ID天然排序,对分页或者需要排序的结果很有帮助。
缺点:
- 如果系统中没有Redis,还需要引入新的组件,增加系统复杂度。
- 需要编码和配置的工作量比较大。
3.4 利用zookeeper生成唯一ID
zookeeper主要通过其znode数据版本来生成序列号,可以生成32位和64位的数据版本号,客户端可以使用这个版本号来作为唯一的序列号。
很少会使用zookeeper来生成唯一ID。主要是由于需要依赖zookeeper,并且是多步调用API,如果在竞争较大的情况下,需要考虑使用分布式锁。因此,性能在高并发的分布式环境下,也不甚理想。
3.5 snowflake(雪花算法)方案
这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间等,比如在snowflake中的64-bit分别表示如下图所示:
41-bit的时间可以表示(1L<<41)/(1000L*3600*24*365)=69年的时间,10-bit机器可以分别表示1024台机器。如果我们对IDC划分有需求,还可以将10-bit分5-bit给IDC,分5-bit给工作机器。这样就可以表示32个IDC,每个IDC下可以有32台机器,可以根据自身需求定义。12个自增序列号可以表示2^12个ID,理论上snowflake方案的QPS约为409.6w/s,这种分配方式可以保证在任何一个IDC的任何一台机器在任意毫秒内生成的ID都是不同的。
优点:
- 毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。
- 不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。
- 可以根据自身业务特性分配bit位,非常灵活。
缺点:
- 强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态
参考:
1、通俗易懂:如何设计能支撑百万并发的数据库架构?
2、Leaf——美团点评分布式ID生成系统
分布式系统唯一ID设计相关推荐
- 分布式系统唯一ID生成方案浅析
有情怀,有干货,微信搜索[荒古传说]关注这个不一样的程序员. 分布式系统唯一ID生成方案浅析 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.业务ID需要满足的要求如下 全局唯一性:不能出 ...
- java产生全局唯一的int类型_全局唯一ID设计
在分布式系统中,经常需要使用全局唯一ID查找对应的数据.产生这种ID需要保证系统全局唯一,而且要高性能以及占用相对较少的空间. 全局唯一ID在数据库中一般会被设成主键,这样为了保证数据插入时索引的快速 ...
- 分布式系统唯一ID生成方案汇总【转】
转自:http://www.cnblogs.com/haoxinyue/p/5208136.html 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很 ...
- 分布式系统唯一ID生成方案汇总
系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...
- android唯一机器码生成方案_分布式系统唯一ID生成方案汇总
系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成ID的方法有很多,适应不同的场景.需求以及性能要求.所以有些比较复杂的系统会有多个ID生成的策略.下面就介绍一些常见 ...
- 阿里P8架构师谈:分布式系统全局唯一ID简介、特点、5种生成方式
什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据 ...
- ef设置非自增长id_今日学习必备:分布式系统全局唯一ID你懂吗?
一 什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息, ...
- 全局唯一递增的id_分布式系统全局唯一ID简介、特点、生成
一.什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息, ...
- java生成8位的uuid_分布式系统全局唯一ID简介、特点、生成
一.什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息, ...
最新文章
- Python培训教程分享:10款超好用的Python开发工具
- 计算机制作印章,制作印章软件【处理办法】
- python旋转矩阵_python实现回旋矩阵方式(旋转矩阵)
- tensorboard的初次使用
- 高等数学下-赵立军-北京大学出版社-题解-练习12.1
- Linux命令之 mke2fs -- 格式化分区(为分区写入文件系统)
- HDU 2159 FATE (DP 二维费用背包)
- [考试]20151008
- python清屏命令-python 命令行里实现clear清屏技巧
- 中文OCR的汉字按常见度的划分
- 2021年3月CISSP考试顺利通过,超详细的经验介绍
- matlab j计算丰水期的值,科学计算与MATLAB语言超星2020期末考试查题公众号答案
- 怎么卸载虚幻4_用虚幻引擎重现新海诚风格“秒速五厘米”场景(附流程和思路)...
- Hello Qt(十)——QT输入组件
- AngularJs ng-repeat重复项异常解决方案
- 调用设备录像回放接口,无法播放录像是什么原因?
- 外汇交易都有哪些基本的交易策略
- JBoss未授权访问漏洞Getshell过程复现
- FPGA纯verilog实现视频拼接,纯逻辑资源搭建,提供4套工程源码和技术支持
- 惠普z4g4安装Linux,HP Z4 G4—高性价比工作站神器!