分表分库下主键 ID 生成方案(从基础实现到美团 Leaf )

分表分库下主键 ID 生成方案(从基础实现到美团 Leaf )

一、分表分库中主键 ID 的核心要求

首先明确 ID 生成需满足的条件,不同方案适配不同要求:

核心要求说明
全局唯一性跨所有分表 / 分库的 ID 不能重复(最核心);
有序性(可选)ID 按时间递增,便于排序、分页、索引优化;
高性能生成 ID 的 QPS 需匹配业务(如秒杀场景每秒 10 万 +);
无中心依赖避免单点故障(如依赖单个数据库生成 ID);
趋势递增(可选)ID 不严格连续,但整体递增,便于索引存储;

二、主流主键 ID 生成方案(按落地难度 / 适用场景划分)

1. 方案 1:自增 ID + 分表偏移量(简单易落地,适合小型系统)

核心思路:利用数据库自增 ID,为每个分表设置不同的 “起始值 + 步长”,保证 ID 不重复。

示例:订单表拆分为 10 张分表(order_0~order_9):

  • order_0:自增 ID 起始值 1,步长 10(ID:1,11,21,31…);
  • order_1:自增 ID 起始值 2,步长 10(ID:2,12,22,32…);
  • order_9:自增 ID 起始值 10,步长 10(ID:10,20,30…)。

实现步骤(MySQL)

-- 创建分表时指定自增起始值和步长CREATETABLE`order_0`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`order_no`varchar(64)NOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4;ALTERTABLE`order_0`AUTO_INCREMENT=1;SET@@auto_increment_increment=10;-- 步长设为10CREATETABLE`order_1`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`order_no`varchar(64)NOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8mb4;

优缺点

优点缺点
实现简单,无需额外组件;ID 有序递增,索引友好;扩展性差(步长固定,新增分表需重新调整);分库场景下无法使用(跨库无法同步步长);ID 连续,易泄露业务数据(如通过 ID 推算订单量);

适用场景:仅水平分表(不分库)、分表数量固定的小型系统。


2. 方案 2:全局统一 ID 库(中等难度,适合中小系统)

核心思路:单独搭建一个 “ID 生成库”,用单表自增 ID 为所有分表 / 分库提供全局唯一 ID,业务侧先从 ID 库获取 ID,再写入分表。

示例:创建id_generator表,仅维护各业务的自增 ID:

-- 全局ID生成表CREATETABLE`id_generator`(`biz_type`varchar(32)NOTNULLCOMMENT'业务类型(如order、user)',`max_id`bigint(20)NOTNULLDEFAULT0COMMENT'当前最大ID',`step`int(11)NOTNULLDEFAULT1000COMMENT'步长',`update_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(`biz_type`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

实现逻辑(伪代码)

// 批量获取ID(减少数据库访问)publicsynchronizedLonggetOrderId(){// 1. 检查本地缓存的ID是否用完if(currentId>=maxId){// 2. 从ID库更新max_id,步长1000(如当前max_id=1000 → 更新为2000)Stringsql="UPDATE id_generator SET max_id = max_id + step WHERE biz_type = 'order'";jdbcTemplate.update(sql);// 3. 查询最新的max_idLongnewMaxId=jdbcTemplate.queryForObject("SELECT max_id FROM id_generator WHERE biz_type = 'order'",Long.class);maxId=newMaxId;currentId=newMaxId-1000+1;// 本次可用ID范围:1001~2000}// 4. 返回自增IDreturncurrentId++;}

优缺点

优点缺点
ID 全局唯一、有序递增;适配分表 + 分库场景;实现成本中等;存在单点故障(ID 库挂掉则无法生成 ID);批量获取 ID 可缓解性能,但高并发下仍有瓶颈;

适用场景:中小系统、并发量不高(QPS≤1 万)、要求 ID 严格有序的场景。


3. 方案 3:雪花算法(Snowflake)(推荐,适合高并发分布式系统)

核心思路:Twitter 开源的分布式 ID 生成算法,将 64 位bigintID 按位拆分,通过 “时间戳 + 机器 ID + 序列号” 保证全局唯一且趋势递增。

64 位 ID 结构(从高位到低位):

位段位数作用取值范围
符号位1 位固定为 0(保证 ID 为正数)0
时间戳41 位毫秒级时间戳(相对于自定义起始时间)可使用约 69 年(2^41/1000/3600/24/365≈69)
机器 ID10 位机房 ID + 服务器 ID支持 1024 台机器(2^10)
序列号12 位同一毫秒内的自增序列每台机器每毫秒可生成 4096 个 ID(2^12)

实现示例(Java)

publicclassSnowflakeIdGenerator{// 起始时间戳(2026-01-01 00:00:00),可自定义privatestaticfinallongSTART_TIMESTAMP=1777833600000L;// 机器ID位数(10位)privatestaticfinallongWORKER_ID_BITS=10L;// 序列号位数(12位)privatestaticfinallongSEQUENCE_BITS=12L;// 机器ID最大值(1023)privatestaticfinallongMAX_WORKER_ID=(1<<WORKER_ID_BITS)-1;// 序列号最大值(4095)privatestaticfinallongMAX_SEQUENCE=(1<<SEQUENCE_BITS)-1;// 机器ID左移位数(12位)privatestaticfinallongWORKER_ID_SHIFT=SEQUENCE_BITS;// 时间戳左移位数(22位=10+12)privatestaticfinallongTIMESTAMP_SHIFT=WORKER_ID_BITS+SEQUENCE_BITS;privatefinallongworkerId;// 机器IDprivatelongsequence=0L;// 序列号privatelonglastTimestamp=-1L;// 上一次生成ID的时间戳// 构造函数,传入机器ID(0~1023)publicSnowflakeIdGenerator(longworkerId){if(workerId<0||workerId>MAX_WORKER_ID){thrownewIllegalArgumentException("Worker ID超出范围(0~1023)");}this.workerId=workerId;}// 生成下一个IDpublicsynchronizedlongnextId(){longcurrentTimestamp=System.currentTimeMillis();// 时钟回拨处理(关键:避免时间倒退导致ID重复)if(currentTimestamp<lastTimestamp){thrownewRuntimeException("时钟回拨,无法生成ID:"+(lastTimestamp-currentTimestamp)+"ms");}// 同一毫秒内,序列号自增if(currentTimestamp==lastTimestamp){sequence=(sequence+1)&MAX_SEQUENCE;// 同一毫秒序列号用完,等待下一毫秒if(sequence==0){currentTimestamp=waitNextMillis(lastTimestamp);}}else{// 不同毫秒,序列号重置为0sequence=0L;}lastTimestamp=currentTimestamp;// 拼接ID:(时间戳-起始时间)<<22 | 机器ID<<12 | 序列号return((currentTimestamp-START_TIMESTAMP)<<TIMESTAMP_SHIFT)|(workerId<<WORKER_ID_SHIFT)|sequence;}// 等待下一毫秒privatelongwaitNextMillis(longlastTimestamp){longtimestamp=System.currentTimeMillis();while(timestamp<=lastTimestamp){timestamp=System.currentTimeMillis();}returntimestamp;}// 测试publicstaticvoidmain(String[]args){SnowflakeIdGeneratorgenerator=newSnowflakeIdGenerator(1);// 机器ID=1for(inti=0;i<10;i++){System.out.println(generator.nextId());}}}

优缺点

优点缺点
高性能(单机每秒生成百万级 ID);无中心依赖,分布式部署;ID 趋势递增,索引友好;适配高并发、分表分库场景;依赖服务器时钟,时钟回拨会导致 ID 生成失败;ID 非连续(但趋势递增,不影响大部分业务);需要提前规划机器 ID(避免重复);

适用场景:分布式系统、高并发(QPS≥1 万)、分表 + 分库场景(主流方案)。


4. 方案 4:UUID/GUID(最简单,适合对 ID 有序性无要求的场景)

核心思路:直接使用 UUID(32 位字符串)作为主键,全局唯一,无需依赖任何组件。

示例:

-- 创建表时用UUID作为主键CREATETABLE`user_0`(`id`varchar(36)NOTNULLCOMMENT'UUID主键',`username`varchar(64)NOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;-- 插入数据时生成UUIDINSERTINTO`user_0`(id,username)VALUES(UUID(),'zhangsan');

优缺点

优点缺点
实现极简单,无任何依赖;全局唯一,适配任意分表分库场景;ID 是字符串,存储占用空间大(varchar (36) vs bigint (20));无序且随机,索引插入效率低(InnoDB 主键是聚簇索引,随机 ID 会导致页分裂);无法通过 ID 排序 / 分页;

适用场景:对性能要求低、ID 有序性无要求的场景(如日志表、附件表)。

三、方案选型建议

场景推荐方案
仅分表、不分库、分表数量固定自增 ID + 分表偏移量
分表 + 分库、中小并发(QPS≤1 万)、要求 ID 严格有序全局统一 ID 库
分表 + 分库、高并发(QPS≥1 万)、分布式系统雪花算法
对 ID 有序性无要求、快速落地UUID(建议用 UUID 的数字形式,如将 UUID 转为 bigint,优化存储)

四、额外注意事项

1.ID 类型选择:

  • 雪花算法 / 自增 ID:优先用bigint(20)(8 字节),避免用varchar
  • UUID:若必须使用,建议用char(36)(固定长度,比varchar高效),或考虑 UUID 的优化版本(如 UUID_SHORT ()、基于时间的 UUID)。

2.时钟回拨处理:

雪花算法需规避时钟回拨问题,可通过 NTP 同步时钟、增加时钟回拨检测机制(如允许少量回拨,超出阈值则报警)。

3.批量生成 ID:

全局 ID 库方案中,批量获取 ID(如每次获取 1000 个)可减少数据库访问,提升性能。

4.索引优化:

若用 UUID 作为主键,建议新增一个create_time字段建立索引,用于排序 / 分页,避免用 UUID 排序。

总结

1.分表分库中主键 ID 的核心要求是全局唯一,有序性可根据业务选择;

2.中小系统优先选「自增 ID + 偏移量」或「全局 ID 库」,高并发分布式系统首选「雪花算法」,无有序性要求选「UUID」;

3.雪花算法是工业界主流方案,需注意时钟回拨问题,提前规划机器 ID 避免重复。

补充

美团用于分表分库场景的分布式 ID 方案是开源的 Leaf 服务,核心提供两种生产级 ID 生成模式 ——Leaf-segment(号段模式)与 Leaf-snowflake(雪花模式),满足全局唯一、趋势递增、高可用与高并发需求,同时适配不同业务场景。

1、Leaf 核心模式:原理与实现
(1) Leaf-segment(号段模式,全局有序)

核心思想:基于数据库预分配 ID 段,本地双 Buffer 缓存,降低 DB 压力并保证高可用美团技术。

核心表结构:

CREATETABLEleaf_alloc(biz_tagvarchar(128)NOTNULLCOMMENT'业务标识(如order、user)',max_idbigintNOTNULLCOMMENT'当前最大ID',stepintNOTNULLCOMMENT'号段步长(如1000)',descriptionvarchar(256)DEFAULTNULL,update_timetimestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,PRIMARYKEY(biz_tag))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='号段分配表';

生成流程:

  1. 服务启动时,为每个 biz_tag 从 DB 申请一段 ID(如 max_id=1000→2000),缓存到本地双 Buffer;
  2. 本地分配 ID,当当前 Buffer 用至阈值(如 90%),异步预取下一段 ID,避免 ID 耗尽阻塞;
  3. DB 宕机时,已缓存的 ID 仍可正常分配,容错窗口由步长决定美团技术。

关键优化:双 Buffer 机制、批量申请、异步预取,单机 QPS 可达 5W+,TP999≤1ms美团技术。

优缺点:

优点缺点
1. 全局唯一且严格有序,适配 InnoDB 聚簇索引,查询 / 写入性能友好2. 批量申请 ID 段,大幅降低数据库访问频率,DB 压力低3. 双 Buffer 缓存机制 + 本地 ID 分配,DB 宕机时仍可容错,高可用1. 依赖数据库,需部署主从 + 高可用架构,避免单点故障2. 扩容分表数量时需协调步长 / 号段规则,迁移数据成本高,更适合分表数量稳定的场景
(2) Leaf-snowflake(雪花模式,局部有序)

核心思想:基于雪花算法,64 位 ID 分段设计,通过 ZooKeeper 自动分配 WorkerID,优化时钟回拨处理。

64 位 ID 结构:

位段位数作用取值范围
符号位1固定 0(保证正数)0
时间戳41毫秒级(相对于自定义起始时间)约 69 年
WorkerID105 位数据中心 + 5 位机器 ID支持 1024 节点
序列号12同一毫秒内自增每节点每毫秒 4096 个 ID

关键优化:

  • 自动 WorkerID 分配:启动时向 ZooKeeper 注册节点,避免手动配置冲突;
  • 时钟回拨处理:短回拨(如 <5ms)等待,长回拨(如> 5ms)报警并降级,避免 ID 重复。

优缺点:

优点缺点
1. 无数据库依赖,纯内存生成 ID,性能极高2. 完全分布式架构,扩容灵活,无需协调号段 / 步长1. 依赖 ZooKeeper 集群,需部署高可用 ZooKeeper(≥3 节点)2. ID 仅局部递增,无法实现全局严格有序3. 依赖服务器时钟同步(NTP),时钟回拨会导致 ID 生成异常

2、美团 Leaf 的高可用与性能保障

(1) 服务架构:Leaf 以独立服务部署,业务通过 HTTP/RPC 调用获取 ID,支持多实例负载均衡,避免单点故障美团技术。

(2) 监控与告警:实时监控 ID 生成量、缓存命中率、时钟偏移,异常时自动切换模式或触发告警美团技术。

(3) 部署建议:

Leaf-segment:DB 主从 + 读写分离,步长按业务 QPS 调整(如高频业务步长 10000);

Leaf-snowflake:ZooKeeper 集群(≥3 节点),NTP 时钟同步误差控制在 5ms 内。


3、方案选型与业务适配
业务场景推荐模式理由
订单、支付等核心业务(需严格有序)Leaf-segment全局有序,便于对账 / 排序 / 分页
秒杀、商品 ID 等高并发场景Leaf-snowflake纯内存生成,QPS 高,无 DB 瓶颈
分表分库 + 动态扩容Leaf-snowflake无中心依赖,扩容无需协调号段
低并发、简单业务Leaf-segment实现简单,维护成本低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1204412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qwen3-Embedding-0.6B模型调用全过程演示

Qwen3-Embedding-0.6B模型调用全过程演示 1. 为什么你需要一个轻量又强效的嵌入模型 你有没有遇到过这样的问题&#xff1a;想给自己的知识库加个语义搜索&#xff0c;但发现主流大模型嵌入接口贵、慢、还受限于网络&#xff1b;或者在本地部署一个8B模型&#xff0c;结果显存…

CANN实现语音积分程序的测试

你需要一篇以CANN实现语音识别积分记录为核心的案例文章&#xff0c;文章会兼顾技术落地性和可读性&#xff0c;涵盖场景介绍、技术架构、实操步骤、核心代码和效果验证&#xff0c;让你既能理解整体逻辑&#xff0c;也能参考落地实际项目。 基于CANN的语音识别积分记录程序实战…

如何提升SGLang缓存命中率?实操经验分享

如何提升SGLang缓存命中率&#xff1f;实操经验分享 SGLang&#xff08;Structured Generation Language&#xff09;作为专为大模型推理优化的框架&#xff0c;其核心价值之一在于通过RadixAttention机制显著提升KV缓存复用效率。在实际部署中&#xff0c;我们发现&#xff1…

如何判断Live Avatar正常运行?日志输出关键信息解读

如何判断Live Avatar正常运行&#xff1f;日志输出关键信息解读 1. Live Avatar阿里联合高校开源的数字人模型 Live Avatar是由阿里巴巴与多所高校联合推出的开源数字人项目&#xff0c;旨在通过AI技术实现高质量、实时驱动的虚拟人物生成。该模型结合了文本、图像和音频输入…

IQuest-Coder-V1自动驾驶案例:感知模块代码生成实战

IQuest-Coder-V1自动驾驶案例&#xff1a;感知模块代码生成实战 你有没有想过&#xff0c;一个AI模型能自己写出一整段自动驾驶系统的代码&#xff1f;不是简单的“Hello World”&#xff0c;而是真实可用、结构完整、逻辑严密的感知模块实现。这听起来像科幻&#xff0c;但在…

如果您还有票,请为坚持——助力吧!

如果您有资格投票 如果您手上还有票 来吧&#xff0c;为他、为你投出一个神话 点我助力投票 不畏前方的艰险 创造一切的可能 助力梦想的启航 文章目录 如果您有资格投票 如果您手上还有票 来吧&#xff0c;为他、为你投出一个神话点我助力投票 不畏前方的艰险 创造一切的…

Spring Boot 数据访问:JPA 与 MyBatis 集成对比与性能优化深度解密

文章目录&#x1f4ca;&#x1f4cb; 一、 序言&#xff1a;持久层框架的“双雄会”&#x1f30d;&#x1f4c8; 二、 JPA 深度剖析&#xff1a;对象世界的“漏损抽象”&#x1f6e1;️⚡ 2.1 什么是 N1 问题&#xff1f;&#x1f504;&#x1f3af; 2.2 工业级解决方案&#x…

Qwen All-in-One高算力适配秘诀:零内存开销技术拆解

Qwen All-in-One高算力适配秘诀&#xff1a;零内存开销技术拆解 1. 什么是Qwen All-in-One&#xff1a;单模型多任务的底层逻辑 你有没有遇到过这样的问题&#xff1a;想在一台普通笔记本上跑AI服务&#xff0c;结果刚装完情感分析模型&#xff0c;显存就爆了&#xff1b;再加…

用Paraformer做中文语音识别,离线高精度转写实战应用

用Paraformer做中文语音识别&#xff0c;离线高精度转写实战应用 1. 为什么你需要一个离线语音识别方案&#xff1f; 你有没有遇到过这样的场景&#xff1a;手头有一段两小时的会议录音&#xff0c;想快速转成文字整理纪要&#xff0c;但市面上的在线语音识别工具要么按分钟收…

为什么Sambert部署总报错?依赖修复部署教程一文详解

为什么Sambert部署总报错&#xff1f;依赖修复部署教程一文详解 你是不是也遇到过这样的情况&#xff1a;下载了Sambert语音合成镜像&#xff0c;兴冲冲地执行docker run&#xff0c;结果终端里刷出一长串红色报错——ImportError: libttsfrd.so: cannot open shared object f…

NewBie-image-Exp0.1备份恢复:模型权重与配置持久化方案

NewBie-image-Exp0.1备份恢复&#xff1a;模型权重与配置持久化方案 你刚部署完 NewBie-image-Exp0.1 镜像&#xff0c;跑通了 test.py&#xff0c;看到 success_output.png 里那个蓝发双马尾角色跃然屏上——但下一秒&#xff0c;你删错了 models/ 目录&#xff0c;或者容器意…

Llama3-8B安全合规:数据隐私保护部署实战建议

Llama3-8B安全合规&#xff1a;数据隐私保护部署实战建议 1. 为什么Llama3-8B需要特别关注安全与合规 很多人一看到“Llama3-8B”就立刻想到性能、速度、效果&#xff0c;却容易忽略一个关键事实&#xff1a;模型越强大&#xff0c;数据风险越高。尤其是当它被部署在企业内部…

中小企业AI部署福音:SGLang低成本高吞吐实战指南

中小企业AI部署福音&#xff1a;SGLang低成本高吞吐实战指南 1. 为什么中小企业需要SGLang&#xff1f; 你是不是也遇到过这些情况&#xff1f; 想给客服系统加个大模型能力&#xff0c;但一跑Qwen2-7B就吃光80%显存&#xff0c;响应还卡顿&#xff1b;做数据分析时想让模型…

Google关键词能带来多少流量?看完这篇心里就有底了

做外贸或者做独立站的朋友&#xff0c;最常问我的一个问题就是&#xff1a;把这个词做到首页&#xff0c;我每天能有多少访客&#xff1f;这个问题太经典了&#xff0c;就像有人问开个面馆一天能卖多少碗面一样。虽然没有标准答案&#xff0c;但绝对有参考逻辑。今天我就把压箱…

EI_数据采集_种类和设备

人形机器人的数据采集&#xff08;数采&#xff09; 是实现运动控制、环境感知、行为决策的核心环节&#xff0c;其方法和设备需围绕运动状态、环境信息、人机交互三大类数据展开。以下是系统化的分类梳理&#xff0c;包含核心方法、对应设备及应用场景&#xff1a; 一、 运动…

全面解读:若道凝时NMN成分安不安全?是哪家公司的?一篇给你说清楚!

在考虑尝试NMN时,你的谨慎是对的。毕竟这是要长期服用的东西,搞清楚“谁生产的”、“安不安全”比单纯看宣传更重要。今天,我们就来把“若道凝时NMN”里里外外讲明白。 当你在搜索“若道凝时NMN成分安全吗”或“若道…

字节跳动verl框架深度解析:HybridFlow论文复现实战

字节跳动verl框架深度解析&#xff1a;HybridFlow论文复现实战 1. verl 介绍 verl 是一个灵活、高效且可用于生产环境的强化学习&#xff08;RL&#xff09;训练框架&#xff0c;专为大型语言模型&#xff08;LLMs&#xff09;的后训练设计。它由字节跳动火山引擎团队开源&am…

2026年热门的铝合金课桌椅/可升降课桌椅最新TOP厂家排名

开篇:行业现状与推荐逻辑随着教育装备行业的持续升级,铝合金课桌椅和可升降课桌椅已成为2026年学校采购的主流选择。这类产品凭借轻量化、耐用性强、环保健康等优势,正在快速替代传统钢木结构产品。本文基于对全国校…

2026年质量好的电气配电箱/低压配电箱厂家实力及用户口碑排行榜

在电气设备采购决策中,产品质量、技术实力和用户口碑是核心考量因素。本文基于2026年行业调研数据,从技术研发能力、生产规模、产品稳定性及售后服务四个维度,筛选出当前低压配电箱领域表现突出的五家生产企业。其中…

UNSLOTH入门指南:让深度学习训练不再痛苦

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向初学者的UNSLOTH教程代码&#xff0c;从安装开始&#xff0c;逐步演示如何用它优化一个简单的图像分类模型。代码应包含大量注释和解释&#xff0c;使用MNIST或CIFAR-…