四种常见的分布式ID产生方式

·2595·7 分钟·
AI摘要: 本文介绍了四种常见的分布式ID生成方案,包括雪花算法、Redis、MySQL单机和MySQL号段模式。每种方案都详细描述了其生成逻辑、多节点唯一性保证机制以及特点。

产生原因就不多说了,单集数据库能力有限,开始数据库分库分表,那么唯一性ID就成为了需要解决的问题。

要求:

  1. 唯一性:任何时刻,任何节点都不允许出现重复的ID
  2. 高性能:高并发下也能快速生成,不能出现性能瓶颈
  3. 安全性:不能让用户猜测到id规律,避免安全隐患

雪花算法

   +---------------------+       +---------------------+
   |   Node A (Worker 1) | <---> |   Clock + Counter   |
   +---------------------+       +---------------------+
             |
             |--- ID1: 64-bit
             |    0      00001     00000001     000000000000
             |   |        |            |               |
             |   |        |            |               +-- 序列号(12位): 同一毫秒内计数器
             |   |        |            +------------------ 机器ID(10位)
             |   |        +------------------------------ 数据中心ID(5位)
             |   +---------------------------------------- 时间戳(41位)
             v
     ID: 64位整数,局部生成

生成逻辑

  • 每个节点配置唯一的机器 ID 和数据中心 ID。
  • 获取当前时间戳,拼接数据中心 ID、机器 ID 和序列号。
  • 同一毫秒内如果序列号溢出,则等待下一毫秒。

多节点如何唯一:靠不同的机器ID和时间戳组合保证唯一性。

特点:本地生成,无需中心节点,高性能低延迟

redis

   +-----------+         +-------------+
   | Node A    | ----+-> |             |
   |           |     |   |             |
   +-----------+     |   |             |
                     |   |  Redis主节点 |
   +-----------+     |   |   INCR key  |
   | Node B    | ----+-> |             |
   +-----------+         |             |
                         +-------------+
                               |
                               v
                        ID1: 10000000001
                        ID2: 10000000002

生成逻辑

  • 各节点通过 INCR my_id_key 获取自增整数。
  • Redis 保证原子性,每次加1,返回唯一 ID。

多节点如何唯一:所有节点访问同一个 Redis 实例,由 Redis 保证全局唯一。

特点:集中式生成,简洁可靠,但依赖 Redis 中心性能

MySQL单机

   +-----------+         +-------------------+
   | Node A    | ----+-> |                   |
   +-----------+     |   |  MySQL 单实例     |
                     |   |  INSERT 获取自增ID|
   +-----------+     |   | (auto_increment)  |
   | Node B    | ----+-> |                   |
   +-----------+         +-------------------+
                               |
                               v
                          ID1: 1
                          ID2: 2

生成逻辑

  • 所有节点向同一个 MySQL 表插入记录。
  • 使用 AUTO_INCREMENT 字段自动生成 ID。
  • 可配合 select last_insert_id() 获取本次插入的 ID。

多节点如何唯一:所有节点依赖同一个数据库实例,全局自增字段唯一。

特点:简单但不适合高并发,依赖数据库性能

MySQL号段模式

        +----------------------+
        |   MySQL Segment表   |
        |----------------------|
        | biz_tag | max_id     |
        | order   | 10500      |
        +----------------------+
               ^          |
               | 取出一个号段(10001 ~ 10500)
               |
   +-----------+-----------+
   |                       |
+--------+         +--------+
| Node A |         | Node B |
+--------+         +--------+
   |                    |
   | 本地自增: 10001++   | 本地自增: 10501++
   v                    v
ID1: 10001          ID2: 10501

生成逻辑

  • 每个节点从 MySQL 中申请一段号段(如一次1000个)。
  • MySQL表中维护每个业务的最大 ID。
  • 节点拿到号段后,在本地缓存、使用。

多节点如何唯一

  • 节点之间不通信,通过数据库号段表分配不重复的区间。

特点:中心协调,节点本地生成,性能好,适合高并发