`
scriptguy
  • 浏览: 35618 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

分布式主键生成策略

阅读更多

最近工作中需要手动生成主键,由于是分布式应用,多个应用对多个数据源进行操作,结构图如下:



 一个逻辑表可能sharding到多个数据库中,但是要保证在多个数据库中每一个记录的主键不能重复,利用数据库自身的自增策略已经不能满足需求。

 

借鉴IP网络的划分,可以将一段连续的序列切分为多个子序列,以1-20000000为例,切分长度为100000,可以切分为200个子序列,分别为:

 

001 000001-100000
002 100001-200000
003 200001-300000
n (n-1)*100000+1-n*1000000
200 19900001-20000000

 

 

 

 

 

 

 

 

把001、002、...、200看成网络号,对应的取值范围成为主机号。然后可以将这些网络号分配给不同的应用程序A、B:

 

1、A启动,检查配置文件中分配给自己的网络号(假如为001、002、003)和切分长度

2、连接数据库组,查询当前数据库主键在001段区间的最大值,如果该值到达001段的结尾,继续查询在002段区间的最大值,直到找到区间最大值不在该区间末尾的值,设该值为currentMaxValue

3、创建一个AtomicInteger,初始值为currentMaxValue,为上层提供主键生成服务

4、当AtomicInteger增长到当前区间的末尾时,转换到下一个分配的区段

 

如果为每个应用分配不重合的区间,每个应用都能生成区间连续的主键,各个应用之间也不会出现生成主键重复的现象。很好的解决了分布式情况下的主键生成问题,不需要应用之间协调,只需要预先规划分配一下区段即可。

  • 大小: 24 KB
1
3
分享到:
评论
5 楼 scriptguy 2012-11-30  
魔力猫咪 写道
scriptguy 写道
魔力猫咪 写道
UUID不是更好吗。而且你这个架构为什么这么混乱。整个数据库层就不能整合一下吗。


应用集群中的每一个应用通过SQL路由分发到多个数据源进行数据操作,SQL路由对DAO层是透明的。架构不是很混乱吧

即使架构不乱。日后数据库记录多了呢?主键变化就是个天大的麻烦

对,这是个问题,mysql中bigint最大值max=9223372036854775807,切分密集的话,可用主键接近于max个,超过就不行了,如果可以预见业务量会超过max,这种方法不可行,还得寻找其他办法。
4 楼 魔力猫咪 2012-11-30  
scriptguy 写道
魔力猫咪 写道
UUID不是更好吗。而且你这个架构为什么这么混乱。整个数据库层就不能整合一下吗。


应用集群中的每一个应用通过SQL路由分发到多个数据源进行数据操作,SQL路由对DAO层是透明的。架构不是很混乱吧

即使架构不乱。日后数据库记录多了呢?主键变化就是个天大的麻烦
3 楼 scriptguy 2012-11-30  
魔力猫咪 写道
UUID不是更好吗。而且你这个架构为什么这么混乱。整个数据库层就不能整合一下吗。


应用集群中的每一个应用通过SQL路由分发到多个数据源进行数据操作,SQL路由对DAO层是透明的。架构不是很混乱吧
2 楼 kidneyball 2012-11-30  
UUID +1
1 楼 魔力猫咪 2012-11-30  
UUID不是更好吗。而且你这个架构为什么这么混乱。整个数据库层就不能整合一下吗。

相关推荐

    分布式ID生成策略_snowflake算法

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

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

    在现代大数据处理与分布式系统中,主键生成策略是确保数据唯一性的重要环节。随着微服务和分布式数据库的发展,ShardingSphere作为一款开源的数据库中间件,其功能不断升级以适应新的需求。在最新的版本中,...

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

    04_JPA详解_第一个JPA实例与JPA主键生成策略.zip

    本压缩包文件"04_JPA详解_第一个JPA实例与JPA主键生成策略.zip"包含了关于如何在实际项目中运用JPA,以及理解JPA主键生成策略的详细教程。 ### JPA基础 1. **JPA简介**: JPA是Java EE的一部分,它提供了一套规范,...

    hibernate主键生成策略

    【hibernate主键生成策略】是Hibernate框架中用于生成持久化对象主键的重要机制,它决定了如何在数据库中创建唯一的标识符。在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,主键生成策略的...

    Hibernate各种主键生成策略与配置详解

    主键生成策略是Hibernate中一个重要的概念,因为它决定了如何为实体生成唯一的标识符。本文将详细解释Hibernate的几种主键生成策略及其配置。 1. assigned策略 assigned策略允许开发者在保存对象之前手动设置主键。...

    MybatisPlus主键生成策略方法详解.docx

    在主键生成策略方面,MybatisPlus提供了多种选择,以适应不同场景的需求。以下是关于MybatisPlus主键生成策略的详细说明: 1. **默认主键生成策略:雪花算法** 当MybatisPlus未进行任何主键策略配置时,它会默认...

    08_ibatis教程_sql主键生成方式.zip

    5. **雪花算法**:这是一种分布式主键生成策略,常用于分布式系统。雪花算法结合了时间戳、机器ID和序列号,确保全局唯一性。Ibatis可以借助第三方库如Snowflake或者Twitter的实现来应用此策略。 6. **UUID**:对于...

    mybatis-plus主键生成策略

    MyBatis-Plus主键生成策略是其框架中一个重要的特性,它提供了多种方式来生成主键ID,以便适应不同的数据库环境和业务需求。MyBatis-Plus的默认策略是Twitter的“Snowflake”算法,它能生成全局唯一的长整型ID。然而...

    细聊分布式ID生成方法.pdf

    通过对不同场景需求的分析,我们可以选择适合的ID生成策略。无论是基于时间戳排序还是利用数据库特性,亦或是采用高级算法如雪花算法,都应该根据具体的应用场景和技术栈来决定最佳实践方案。未来随着技术的发展,...

    Hibernate主键生成策略

    ### Hibernate主键生成策略 #### 一、概述 在Hibernate框架中,主键生成策略是对象持久化过程中不可或缺的一部分。合理的主键生成机制不仅能够确保数据的唯一性,还能够提高系统的性能和可扩展性。本文将详细介绍...

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

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

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

    结合上述信息,"idGenerate"这个文件很可能是包含了一个Java实现的分布式代码生成器项目,可能包含了Snowflake算法或者其他分布式ID生成策略的源代码。通过学习和理解这些代码,我们可以更好地掌握在Java环境中如何...

    shardingsphere_docs_cn.pdf

    ShardingSphere 提供了分布式主键生成策略,可以确保在各个分片之间生成不重复的主键,确保数据的一致性。 4. **事务支持** 面对分库分表后的事务处理,ShardingSphere 提供了柔性事务解决方案,即在无法实现强...

    3 Sharding-JDBC读写分离.pdf

    此外,Sharding-JDBC还提供了其他数据分片策略,以及在分布式环境下的分布式主键生成策略,这些策略可以根据应用的特定需求进行配置和优化,以达到最佳的数据处理效果。通过这些功能,Sharding-JDBC帮助开发者解决...

    Go-GolangMysql实现的分布式ID生成服务

    Twitter开源的Snowflake算法是一种常用的分布式ID生成策略,它将ID分为三部分:时间戳(41位)、工作机器ID(10位)和序列号(12位)。通过这种方式,可以保证ID的全局唯一性,并且有序。 #### 3.2 UUID UUID...

Global site tag (gtag.js) - Google Analytics