每日學習20170224-分庫分表全局ID生成

由於數據量以及IO效率的因素,很多項目對數據支持的數據庫會採取分庫分表的方式。使用了分庫分表之後需要解決的一個問題就是主鍵的生成。多個表之間的主鍵就不能用數據庫本身的自增主鍵來支持,因爲不同表之間生成的主鍵會重複。所以需要其他的方式獲取主鍵ID。

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

  1. oracle sequence : 基於第三方oracle的SEQ.NEXTVAL來獲取一個ID 優勢:簡單可用 缺點:需要依賴第三方oracle數據庫
  2. mysql id區間隔離 : 不同分庫設置不同的起始值和步長,比如2臺mysql,就可以設置一臺只生成奇數,另一臺生成偶數. 或者1臺用0~10億,另一臺用10~20億. 優勢:利用mysql自增id 缺點:運維成本比較高,數據擴容時需要重新設置步長.
  3. 基於數據庫更新+內存分配: 在數據庫中維護一個ID,獲取下一個ID時,會對數據庫進行ID=ID+100 WHERE ID=XX,拿到100個ID後,在內存中進行分配 優勢:簡單高效 缺點:無法保證自增順序

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

  1. 我們設置獲取ID步長爲l,一共有n個表分配id。
  2. 初始化後,n個表中的id值分別爲0,l, 2l,3l…
  3. 當應用從任意一個表獲取ID,這個表中的ID會在原ID值上增加nl。

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

  1. 初始化後,4個表中的值分別爲, 1:0, 2:100, 3:200, 4:300
  2. 假設應用從表2獲取了id,那麼四個表的值變爲,1:0, 2:500, 3:200, 4:300

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

  1. 實現了全局唯一ID。
  2. 不影響業務數據庫的擴展。
  3. 獲取ID有容災,單個表無法訪問不影響全局。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章