`

分布式主键选择

 
阅读更多

实现动机

传统数据库软件开发中,主键自动生成技术是基本需求。而各个数据库对于该需求也提供了相应的支持,比如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生成器设计源码

    本分布式主键ID生成器基于多语言优化,包含204个文件,包括Markdown文档、Dockerfile、Go源代码、Java源代码、GIT忽略文件、Header文件、C#源代码、C源代码、Pascal源代码、Rust源代码。系统采用优化的雪花算法...

    迄今为止最全面的分布式主键ID生成器,多语言新雪花算法(SnowFlake IdGenerator).zip

    迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...

    20、详细分析ShardingSphere新接入的CosID分布式主键生成框架-ev.rar

    《深入剖析ShardingSphere新接入的CosID分布式主键生成框架》 在现代大数据处理与分布式系统中,主键生成策略是确保数据唯一性的重要环节。随着微服务和分布式数据库的发展,ShardingSphere作为一款开源的数据库...

    idgenerator分布式主键ID生成器

    迄今为止最全面的分布式主键ID生成器。优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...

    最全面的分布式主键ID生成器

    最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 Python、...

    分步式主键发生器,适合分布式应用的id唯一性

    分布式主键发生器是解决大型分布式系统中生成全局唯一ID的关键技术。在现代互联网应用中,数据量往往庞大,单个数据库或服务器无法承载所有的业务需求,因此采用分布式架构成为必然选择。在这种环境下,如何保证各个...

    迄今为止最全面的分布式主键ID生成器优化的雪花算法(SnowFlake)雪花漂移算法在缩短ID长度的同时具备高瞬时并发处理能力

    迄今为止最全面的分布式主键ID生成器。 优化的雪花算法(SnowFlake)——雪花漂移算法,在缩短ID长度的同时,具备极高瞬时并发处理能力(50W/0.1s)。 原生支持 C#/Java/Go/Rust/C/SQL 等多语言,且提供 PHP 扩展及 ...

    分布式ID生成策略_snowflake算法

    分布式ID生成策略是现代互联网应用中的重要组成部分,尤其是在大数据时代,每个数据实体通常都需要一个唯一标识符(ID)来区分其身份。Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用...

    分布式数据库唯一主键设计

    "分布式数据库唯一主键设计"涉及到如何在多节点、多表环境中创建并管理这种全局唯一的标识符。本文将深入探讨这一主题,旨在帮助读者理解如何在分布式环境中有效地设计和实现唯一主键。 一、主键的概念与重要性 ...

    mysql面试题100题,包含答案和解析.docx

    MySQL面试题涵盖了许多核心知识点,包括索引使用、死锁处理、SQL优化、数据库引擎对比、分布式主键选择以及事务管理等。以下是对这些主题的详细解析: 1. **索引使用注意事项**: - 索引在含有`OR`、`LIKE`通配符...

    sharding-jdbc分布式数据库培训方案

    **分布式主键** 在分布式环境中至关重要,需要保证全局唯一性。Sharding-JDBC 提供了去中心化的主键生成方案,如使用 snowflake 算法,生成的主键基本有序,有利于数据库性能。 **主要流程** 包括 SQL 解析、SQL ...

    sharding-jdbc-demo:基于sharding-jdbc实现的各种分库分表、读写分离、柔性事务、分布式主键、分布式治理等示例,持续更新中。。

    Adam Lu(刘亚壮),高级软件架构师,Java编程专家,开源分布式消息引擎Mysum发起者、首席架构师及开发者,Android开源消息组件Android-MQ独立作者,国内知名开源分布式数据库中间件Mycat核心架构师、开发者,精通Java...

    分布式日志结构数据库系统的主键维护方法研究.pdf

    然而,随着应用复杂度的增加,如何在分布式环境下维护数据库主键的唯一性、一致性和高效性成为了挑战。《分布式日志结构数据库系统的主键维护方法研究》这篇论文深入探讨了这一问题,并提出了相应的解决方案。 ...

    sqlserver主键设计的注意点

    常常有人称呼主键为内部标识,为什么会这样称呼,原因之一在于“内部”,所谓内部从某种程度上来说就是指表记录,从大的范围来说就是数据库,如果你在设计的时候选择了对用户来说有意义的信息来作为主键,那么迟早会...

    Mybatis返回插入主键id的方法

    在Mybatis中,当执行插入操作时,有时我们需要获取新插入记录的主键ID,以便进行后续的操作。Mybatis提供了一种便捷的方式,允许我们在插入数据后返回自动生成的主键值。以下将详细介绍如何在Mybatis中实现这一功能...

    oracle的分布式管理

    快照日志是在源表上创建的,记录了主键的变化,以便在刷新快照时只更新有变化的部分,降低网络负载。创建快照日志的命令是`CREATE SNAPSHOT LOG ON table3 WITH PRIMARY KEY`。接着,可以创建一个快照,如`CREATE ...

    java 分布式 代码生成器 唯一ID

    因此,在分布式系统中,UUID并不总是最佳选择。 3. **数据库序列号**:某些数据库系统如Oracle和PostgreSQL提供了序列号生成功能,可以在分布式环境中通过分布式事务来保证唯一性,但这种方法会增加数据库的负载,...

    分布式id服务-常见组件与中台化-如自增id,分段id,雪花算法等适用于分布式服务的使用场景

    雪花算法SNOWFLAKE ...比如采用UUID.randomUUID()的方式产生唯一且不重复的分布式主键。最终生成一个字符串类型的主键。缺点是生成的主键无序。 【趋势递增】简单说就是在一段时间内,生成的ID是递增的趋势

    分布式锁原理介绍.pptx

    3. **全局自增主键**:在分布式数据库系统中,为每条记录分配唯一ID时,需要使用分布式锁来避免ID冲突。 #### 四、分布式锁的实现 ##### 1. 基于数据库实现分布式锁 - **利用MySQL唯一索引特性**:通过在表中创建...

Global site tag (gtag.js) - Google Analytics