09ID全局唯一

123 阅读2分钟

1.基本概念

分布式存储:数据冗余和数据分片

数据冗余:一组多从,应对高并发的数据查询(分摊读压力)

数据分片:降低单个节点的存储压力

image.png

分库分表带来的问题:

查询必须带分区键

聚合查询效率低

主键全局唯一(物理上是分离的,需要在逻辑上保持一致)

2.数据的主键怎么选择

2.1使用业务字段作为主键

使用手机号,身份证号..

一般不使用,需要耦合业务,同时会出现不好选择的情况

2.2使用生成唯一ID作为主键

推荐使用,唯一性,一旦生成不会变更,随意引用

单裤单表:自增ID即可

分库分表:全局递增ID,同时保证全局唯一

基于 Snowflake 算法搭建发号器(生成全局唯一ID)

如果使用UUID有什么问题?

IDC 数据中心(Internet Data Center)

SnowflakeUUID
算法思想将**64位二进制(正好是一个int的大小)**数字分为若干部分,每一部分包含特殊含义(时间戳、机器ID、序列号、业务信息...)
包含业务信息后可以进行id反解
具体实现1.嵌入业务代码中,分布在业务服务器中
需要考虑机器ID
但是需要引入Zookeeper保证机器ID的全局唯一
2.独立服务部署,发号器服务
需要增加一次网络调用,但是不再需要考虑机器ID
优点设计巧妙,性能高效不依赖第三方,性能可用性好
缺点
强依赖时间戳,时间戳不准会导致重复ID
发现时间不准后,拒绝发号
QPS低的话,没毫秒只发一个ID,ID末尾永远是1
1.时间戳不记录毫秒,只记录秒
2.生成序列起始号做一下随机

是无序的,很难满足时间排序
无序ID会影响数据库写性能(会造成数的分裂,节点移动)
不具备业务含义
UUID是字符串,作为主键时比较耗费空间
适用场景可以用来表示traceid

image.png

image.png

3.课程小结

方案不在多,而在精,方案没有最好,只有最适合,真正弄懂方法背后的原理,并将它落地,才是你最佳的选择