MySQL分布式實現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有容災,單個表無法訪問不影響全局。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM