<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>雪花算法 on Lishengxie</title><link>https://lishengxie.top/tags/%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95/</link><description>Recent content in 雪花算法 on Lishengxie</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 25 Jun 2026 22:53:20 +0800</lastBuildDate><atom:link href="https://lishengxie.top/tags/%E9%9B%AA%E8%8A%B1%E7%AE%97%E6%B3%95/index.xml" rel="self" type="application/rss+xml"/><item><title>分布式ID生成方案全解析：从数据库到雪花算法</title><link>https://lishengxie.top/post/distributed-id-generator-algo/</link><pubDate>Thu, 25 Jun 2026 22:53:20 +0800</pubDate><guid>https://lishengxie.top/post/distributed-id-generator-algo/</guid><description>&lt;p&gt;在分布式系统中，全局唯一ID是一个常见的需求。无论是分库分表后的主键冲突，还是订单号、用户ID等需要唯一标识的场景，都离不开一个可靠的分布式ID生成器。本文将带你了解分布式ID的基本要求，并梳理多种实现方案，从简单的数据库自增到高性能的雪花算法，最后介绍各大厂的开源组件。&lt;/p&gt;&#10;&lt;h2 id="一什么是分布式id"&gt;一、什么是分布式ID？&lt;/h2&gt;&#10;&lt;p&gt;分布式ID是指在分布式环境下生成的全局唯一标识符。典型应用场景包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;分库分表&lt;/strong&gt;：数据量增长导致单库单表出现性能瓶颈时，分库分表后无法继续依赖数据库自增ID（会产生主键冲突），此时需要分布式ID保证全局唯一。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;业务标识&lt;/strong&gt;：订单号、用户ID、消息ID等需要全局唯一的场景。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="二分布式id的基本要求"&gt;二、分布式ID的基本要求&lt;/h2&gt;&#10;&lt;p&gt;一个合格的分布式ID生成器通常需要满足以下几点：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;全局唯一&lt;/strong&gt;：这是最基本的要求，ID必须在整个分布式系统中不重复。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;独立部署、高性能、高可用&lt;/strong&gt;：ID生成服务应独立部署，具备高并发下的低延迟响应能力（接近100%可用性），不能成为业务系统的瓶颈。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;安全&lt;/strong&gt;：ID中不应包含敏感信息，避免信息泄露。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;趋势递增&lt;/strong&gt;：尽可能保证ID趋势递增，这有利于数据库的索引插入和排序性能。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="三实现方案"&gt;三、实现方案&lt;/h2&gt;&#10;&lt;img src="https://lishengxie.top/uploads/2026/05/distribute-id.png" alt="分布式ID方案" style="zoom:50%;" /&gt;&#10;&lt;h3 id="1-数据库方案"&gt;1. 数据库方案&lt;/h3&gt;&#10;&lt;h4 id="11-基于数据库自增id"&gt;1.1 基于数据库自增ID&lt;/h4&gt;&#10;&lt;p&gt;使用MySQL的自增主键来充当分布式ID。创建一张专门用于生成ID的表，每次插入一条记录后获取返回的主键ID。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DATABASE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;SEQ_ID&lt;span style="color:#f92672"&gt;`&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; SEQID.SEQUENCE_ID (&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id bigint(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;) unsigned &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt; auto_increment, &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; value char(&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (id)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) ENGINE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;MyISAM;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;INSERT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INTO&lt;/span&gt; SEQUENCE_ID(value) &lt;span style="color:#66d9ef"&gt;VALUES&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;values&amp;#39;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：简单、天然有序。&#10;&lt;strong&gt;缺点&lt;/strong&gt;：单点故障风险、并发性能差、数据库写入压力大，且ID可反推出订单数量等敏感信息。&lt;/p&gt;&#10;&lt;h4 id="12-基于数据库集群模式"&gt;1.2 基于数据库集群模式&lt;/h4&gt;&#10;&lt;p&gt;为解决单点故障，可以采用多主模式，部署多个MySQL实例独立生成自增ID。通过设置不同的起始值和步长避免重复（以两个节点为例）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- MySQL实例1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#f92672"&gt;@@&lt;/span&gt;auto_increment_offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; &lt;span style="color:#75715e"&gt;-- 起始值&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#f92672"&gt;@@&lt;/span&gt;auto_increment_increment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;; &lt;span style="color:#75715e"&gt;-- 步长&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- MySQL实例2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#f92672"&gt;@@&lt;/span&gt;auto_increment_offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;; &lt;span style="color:#75715e"&gt;-- 起始值&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#f92672"&gt;@@&lt;/span&gt;auto_increment_increment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;; &lt;span style="color:#75715e"&gt;-- 步长&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：缓解单点并发压力。&#10;&lt;strong&gt;缺点&lt;/strong&gt;：不利于动态扩容，新增节点时需处理起始值冲突，甚至可能停机调整。&lt;/p&gt;&#10;&lt;h4 id="13-基于数据库号段模式"&gt;1.3 基于数据库号段模式&lt;/h4&gt;&#10;&lt;p&gt;号段模式的核心思想是批量获取自增ID：每次从数据库取出一个ID范围（如(1,1000]），然后在内存中递增分配，用完后再去数据库获取新的号段。&lt;/p&gt;</description></item></channel></rss>