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

·2847·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。

  • 节点拿到号段后,在本地缓存、使用。

多节点如何唯一

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

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