0.簡介
在分布式系統中,生成全局唯一的id是一個常見的需求。由于分布式系統的特性(多節點,網絡分區,時鐘不同步等),傳統的單機ID生成方式不再適用,所以一些分布式生成方式應運而生,本文將對常見的幾種分布式ID生成方法的原理和應用進行介紹。
1.分布式ID的生成要求
分布式ID的生成一般要滿足以下要求:
1)全局唯一:生成的 ID 必須在整個系統中唯一。
2)高性能:ID 生成的速度要快,不能成為系統的瓶頸。
3)高可用:ID 生成服務必須高可用,不能因為單點故障導致系統不可用。
4)趨勢遞增:生成的 ID 最好具有遞增趨勢,便于數據庫索引和排序。
2.數據庫自增方式
數據庫的自增方式生成分布式ID就是使用數據庫的自增列來實現,其優缺點如下:
優點:
1)使用簡單,直接使用數據庫已有的自增功能;
2)能夠保證唯一性和遞增性;
缺點:
1)性能瓶頸,在高并發場景下,數據庫可能成為性能瓶頸;
2)可用性問題,存在單點故障可能;
使用場景:主要適用小規模分布式系統,對性能要求不高的場景。
改進方式:
1)冗余主節點,避免單點寫入。
2)批量生成id,降低讀寫頻率。其不需要挨個獲取,一次獲取多個同時更新max-id,下次就繼續在max-id增加。
3.UUID
UUID(Universally Unique Identifier)是一個 128 位的全局唯一標識符,通常表示為 32 個十六進制字符,例如:
550e8400-e29b-41d4-a716-446655440000
優點:
1)簡單易用:無需中心化服務,每個節點都可以獨立生成 UUID。
2)全局唯一:UUID 的生成基于時間戳、隨機數和 MAC 地址,幾乎不可能重復。
3)性能個擴展性好:本地生成,沒有擴展和性能瓶頸。
缺點:
1)長度較長:128 位的 UUID 存儲和傳輸以及查詢開銷較大,可以拆成兩個uint64整數存儲。
2)無序性:UUID 是隨機生成的,不具備遞增趨勢,不利于數據庫索引。
適用場景:對ID長度以及有序性要求不高的場景。
改進方式:
1)可以增加時間信息,如在開頭增加毫秒數,優點就是能保證遞增;缺點就是可能在同一時間的話可能會出現沖突。
4.Snowflake算法
4.1 原理
Snowflake 是 Twitter 開源的分布式 ID 生成算法,生成的 ID 是一個 64 位的整數,結構如下:
1 bit | 41 bits | 10 bits | 12 bits |
---|---|---|---|
sign | timestamp | machine ID | sequence |
sign:符號位,固定為 0。
timestamp:41 位的時間戳,表示從某個起始時間到當前時間的毫秒數。
machine ID:10 位的機器 ID,用于區分不同的節點。
sequence:12 位的序列號,用于同一毫秒內生成多個 ID。
優點:
1)高性能:本地生成 ID,無需網絡通信。
2)趨勢遞增:ID 按時間戳遞增,便于數據庫索引。
3)高可用:無中心化服務,每個節點獨立生成 ID。
缺點:
1)時鐘回撥問題:如果系統時鐘回撥,可能導致 ID 重復。
2)機器 ID 分配:需要手動或通過外部服務分配機器 ID。
適用場景:大規模分布式系統,對性能和有序性要求較高的場景。
改進方式:可以通過等待時間同步解決時鐘回撥,通過擴展時間位來解決時間一出,通過動態機器id分配解決手動分配問題。
5.Redis自增ID
該方法是利用 Redis 的原子操作 INCR 或 INCRBY 生成全局唯一的 ID。
使用 Redis 的 INCR 命令生成自增 ID:
INCR id_generator
如果需要生成更長的 ID,可以使用
INCRBY id_generator 1000
優點:
1)高性能:Redis 的 INCR 操作是原子性的,性能較高。
2)簡單易用:實現簡單,無需復雜的算法。
缺點:
1)依賴 Redis:需要維護 Redis 服務,存在單點故障風險。
2)ID 長度有限:Redis 的 INCR 生成的 ID 是 64 位整數,可能不夠用。
適用場景:中小規模分布式系統,對性能和有序性有一定要求的場景。
改進方式:可以參考數據庫自增id方式優化。
6.Leaf算法
Leaf 是美團開源的分布式 ID 生成服務,結合了數據庫和 Snowflake 算法的優點。它支持兩種模式:
1)號段模式:從數據庫批量獲取 ID 段,緩存在本地。
2)Snowflake 模式:基于 Snowflake 算法生成 ID。
優點:
1)高性能:號段模式減少了數據庫訪問次數,Snowflake 模式本地生成 ID。
2)高可用:支持多節點部署,無單點故障。
3)靈活配置:支持號段模式和 Snowflake 模式切換。
缺點:
1)復雜度較高:需要部署和維護 Leaf 服務。
適用場景:大規模分布式系統,對性能和可用性要求較高的場景。
分布式id生成的五種方法