MySQL分布式實現ID自增

2022-03-02 10:11:22 字數 840 閱讀 5589

由於資料量以及io效率的因素,很多專案對資料支援的資料庫會採取分庫分表的方式。使用了分庫分表之後需要解決的乙個問題就是主鍵的生成。多個表之間的主鍵就不能用資料庫本身的自增主鍵來支援,因為不同表之間生成的主鍵會重複。所以需要其他的方式獲取主鍵id。

一般來說解決方案主要有三種:

oracle sequence : 基於第三方oracle的seq.nextval來獲取乙個id 優勢:簡單可用 缺點:需要依賴第三方oracle資料庫

mysql id區間隔離 : 不同分庫設定不同的起始值和步長,比如2臺mysql,就可以設定一台只生成奇數,另一台生成偶數. 或者1台用0~10億,另一台用10~20億. 優勢:利用mysql自增id 缺點:運維成本比較高,資料擴容時需要重新設定步長.

基於資料庫更新+記憶體分配: 在資料庫中維護乙個id,獲取下乙個id時,會對資料庫進行id=id+100 where id=xx,拿到100個id後,在記憶體中進行分配 優勢:簡單高效 缺點:無法保證自增順序

考慮到擴充套件性和維護性,我們採取了第三種方案。具體實現為:

我們設定獲取id步長為l,一共有n個表分配id。

初始化後,n個表中的id值分別為0,l, 2l,3l…

當應用從任意乙個表獲取id,這個表中的id會在原id值上增加nl。

舉例說明,步長為100,共4個id表

初始化後,4個表中的值分別為, 1:0, 2:100, 3:200, 4:300

假設應用從表2獲取了id,那麼四個表的值變為,1:0, 2:500, 3:200, 4:300

這樣一來有如下幾個好處:

實現了全域性唯一id。

不影響業務資料庫的擴充套件。

獲取id有容災,單個表無法訪問不影響全域性。

Twitter的分布式自增ID演算法

乙個唯一 id 在乙個分布式系統中是非常重要的乙個業務屬性,其中包括一些如訂單 id,訊息 id 會話 id,他們都有一些共有的特性 全域性唯一很好理解,目的就是唯一標識某個次請求,某個業務。通常有以下幾種方案 可以利用mysql中的自增屬性auto increment來生成全域性唯一 id,也能保...

分布式自增ID演算法snowflake的JAVA實現

分布式系統中,有一些需要使用全域性唯一id的場景,這種時候為了防止id衝突可以使用36位的uuid,但是uuid有一些缺點,首先他相對比較長,另外uuid一般是無序的。有些時候我們希望能使用一種簡單一些的id,並且希望id能夠按照時間有序生成。而twitter的snowflake解決了這種需求,最初...

分布式唯一ID自增(雪花演算法)

public class idworker if datacenterid maxdatacenterid datacenterid 0 this.workerid workerid this.datacenterid datacenterid methods 獲得下乙個id 該方法是執行緒安全的 ...