实现动机
传统数据库软件开发中,主键自动生成技术是基本需求。而各个数据库对于该需求也提供了相应的支持,比如MySQL的自增键,Oracle的自增序列等。 数据分片后,不同数据节点生成全局唯一主键是非常棘手的问题。同一个逻辑表内的不同实际表之间的自增键由于无法互相感知而产生重复主键。 虽然可通过约束自增主键初始值和步长的方式避免碰撞,但需引入额外的运维规则,使解决方案缺乏完整性和可扩展性。
目前有许多第三方解决方案可以完美解决这个问题,如UUID等依靠特定算法自生成不重复键,或者通过引入主键生成服务等。 但也正因为这种多样性导致了Sharding-Sphere如果强依赖于任何一种方案就会限制其自身的发展。
基于以上的原因,Sharding-Sphere最终采用以接口来实现对于生成主键的访问,而将底层具体的主键生成实现分离出来。
默认分布式主键生成器
Sharding-Sphere提供灵活的配置分布式主键生成策略方式。 在分片规则配置模块可配置每个表的主键生成策略,默认使用雪花算法(snowflake)生成64bit的长整型数据。
雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同进程主键的不重复性,以及相同进程主键的有序性。
在同一个进程中,它首先是通过时间位保证不重复,如果时间相同则是通过序列位保证。 同时由于时间位是单调递增的,且各个服务器如果大体做了时间同步,那么生成的主键在分布式环境可以认为是总体有序的,这就保证了对索引字段的插入的高效性。例如MySQL的Innodb存储引擎的主键。
使用雪花算法生成的主键,二进制表示形式包含4部分,从高位到低位分表为:1bit符号位、41bit时间戳位、10bit工作进程位以及12bit序列号位。
- 符号位(1bit)
预留的符号位,恒为零。
- 时间戳位(41bit)
41位的时间戳可以容纳的毫秒数是2的42次方减1,一年所使用的毫秒数是:365 * 24 * 60 * 60 * 1000。通过计算可知:
(Math.pow(2, 42) -1) / (365 * 24 * 60 * 60 * 1000L);
结果约等于139.46年。Sharding-Sphere的雪花算法的时间纪元从2016年11月1日零点开始,可以使用到2156年,相信能满足绝大部分系统的要求。
- 工作进程位(10bit)
该标志在Java进程内是唯一的,如果是分布式应用部署应保证每个工作进程的id是不同的。该值默认为0,可通过调用静态方法DefaultKeyGenerator.setWorkerId(“xxxx”)设置。
- 序列号位(12bit)
该序列是用来在同一个毫秒内生成不同的ID。如果在这个毫秒内生成的数量超过4096(2的12次方),那么生成器会等待到下个毫秒继续生成。
雪花算法主键的详细结构见下图。
相关推荐
本分布式主键ID生成器基于多语言优化,包含204个文件,包括Markdown文档、Dockerfile、Go源代码、Java源代码、GIT忽略文件、Header文件、C#源代码、C源代码、Pascal源代码、Rust源代码。系统采用优化的雪花算法...
迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...
迄今为止最全面的分布式主键ID生成器。优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...
最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 Python、...
20、详细分析ShardingSphere新接入的CosID分布式主键生成框架_ev.rar
分布式ID生成,主键生成,Java实现的snowflake算法
基于java的分布式主键发生器,使用ice通讯,实现从单服务器到多层的大规模主键发生器,可以保持ID的唯一性.
迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...
分布式数据库唯一主键设计
Adam Lu(刘亚壮),高级软件架构师,Java编程专家,开源分布式消息引擎Mysum发起者、首席架构师及开发者,Android开源消息组件Android-MQ独立作者,国内知名开源分布式数据库中间件Mycat核心架构师、开发者,精通Java...
常常有人称呼主键为内部标识,为什么会这样称呼,原因之一在于“内部”,所谓内部从某种程度上来说就是指表记录,从大的范围来说就是数据库,如果你在设计的时候选择了对用户来说有意义的信息来作为主键,那么迟早会...
分布式数据库中全局唯一主键生成策略的设计与实现,胡云亭,王晶,随着互联网的发展以及数据的爆炸式增长,集中式数据库已经无法满足海量数据快速存储和查询的要求了,这时分布式数据库应运而生。
雪花算法SNOWFLAKE ...比如采用UUID.randomUUID()的方式产生唯一且不重复的分布式主键。最终生成一个字符串类型的主键。缺点是生成的主键无序。 【趋势递增】简单说就是在一段时间内,生成的ID是递增的趋势
主要介绍了 Mybatis返回插入主键id的方法,在文章底部给大家补充了Mybatis中insert中返回主键ID的方法,非常不错,需要的朋友可以参考下
分布式分区视图可以将来自一个或多个SQL Server数据库中的数据连接起来。当开发一个水平分区数据库环境时,你可以使用分布式分区视图将来自不同服务器的分区表连接起来,使得这些数据看起来像来自同一个服务器。 你...
(3)不相交原则:关系分片后的各个片断不能重叠或只包含主键重叠。 DATAID-D相对于DATAID-1增加哪两个阶段,这两个阶段的具体工作是什么 答:(1)分布要求分析阶段:收集关于分布的信息,如水平分片的划分谓词,...
Ceph 就是一个分布式存储系统,近年来其影响主键扩大。Rook 是一个编排器,能够支持包括 Ceph 在内的多种存储方案。Rook 简化了 Ceph 在 Kubernetes 集群中的部署过程。 本教程基于rook1.8.1实现,已经过物理机、...
分布式主键将给你答案。 分库后事务如何保证?事务支持将介绍Sharding-JDBC如何通过使用柔性事务的方式来实现分布式事务。 分页是否影响性能?Oracle和SQLServer的分页涉及到子查询又该如何处理?请阅读分页及子查询...
1.这么多种分布式ID生成方式,应该选择哪种呢? 2.雪花算法底层实现原理是什么? 4、分库分表 1.当数据量大了之后,我们应该如何选择分库分表的解决方案? 2.做分库分表,是应该垂直切分还是水平切分? 带着这些...
如何选择合适的分布式主键方案 选择合适的数据存储方案 常见的几种分布式ID的设计方案 常见的数据库优化方案,在你的项目中数据库如何进行优化的 什么是索引下推 Hash索引和B+树所有有什么区别或者说优劣呢? 说说...