關於分布式id生成器生成單調遞增id的思考

2022-07-11 01:51:11 字數 2793 閱讀 1774

目錄

約束條件:

1)集群中一台機器為master,僅master提供id生成服務

2)當獲取id的請求路由到master機器時,直接返回響應(一輪rpc)

當獲取id的請求路由到非master機器時,**至master機器(兩輪rpc)

評估效能

1)請求最終由master機器進行響應。單機能支援的最大qps即為集群最大qps。

2)請求路由到非master機器時,需兩輪rpc,會增加耗時。

3)請求最終由master機器進行響應,導致同機房優先路由策略不適用,某些情況下,請求耗時較長。

擴充套件性集群總qps無法隨集群機器數量的增加而線性擴充套件。

可用性1)當發生master切換時,會損失一定可用性

2)某些情況下,請求耗時較長,會導致可用性降低。

(1)當獲取id的請求最終由master進行響應。單機能支援的最大qps即為集群最大qps。

(2)由於僅master能夠提供id生成服務,同機房優先等路由規則不再適用

當獲取id的請求路由到master,直接返回響應,一輪rpc

case1:

client和master同城市,比如都在beijing

client(beijing)----->server(master,beijing)

case2:

client和master不同城市,比如乙個beijing,乙個shanghai

client(beijing)--(25ms+)--->server(master,shanghai)

跨城市呼叫,獲取id的耗時將達到25ms+。

當獲取id的請求路由到非master,**至master,兩輪rpc

case 1:

當client和master同城市,比如都在beijing

client(beijing)----->server(非master,beijing)----->server(master,beijing)

case2:

當client和master不同城市,比如乙個beijing,乙個shanghai

client(beijing)----->server(非master,beijing)--(25ms+)--->server(master,shanghai)

跨城市呼叫,獲取id的耗時將達到25ms+。

極端情況:第一次獲取id,master從db載入號段,跨城市

client(beijing)----->server(非master,beijing)--(25ms+)--->server(master,shanghai)--(25ms+)--->db(beijing)

當client和master機器在不同城市時,獲取id耗時較長。

集群總qps無法隨集群機器數量的增加而線性擴充套件。

無論集群中機器有多少臺,集群qps為單機最大qps

1)由於同機房優先等路由規則不再適用,耗時明顯增加,超時概率大大提高。

2)切換master期間,id生成服務會短暫不可用,且不可避免

可導致master切換的情況

1)禁用master機器

2)重啟master

3)機器宕機

1)探測到需要切換master

當禁用master機器的時候,怎麼探測到需要切換master?

2)選舉新的master

3)新master提供服務

新master從db獲取新號段,對於路由到非master的請求將**到新master

master切換期間,id生成服務短暫不可用,且不可避免,只能夠盡量做到client端無明顯感知

此處無明顯感知是指

1)master切換時,client端獲取id的耗時無明顯增加,否則導致超時增多

2)master切換時,獲取id服務短暫不可用,應保證獲取到異常的id的數量無明顯增加

實現唯一、遞增的約束條件:有且僅有一台server提供服務

圖 5. 兩台 allocsvr 服務同個 uid 造成 sequence 回退。client 讀取到的 sequence 序列為 101、201、102

解決方法:僅有一台master提供服務,master不可用時,切換新master

總結就是:

1)單台master提供id生成服務。

2)引入仲裁服務,仲裁服務探測master可用性,當master不可用時,指定新的master

3)其他機器定時檢測配置,判斷新master是不是自己,是的話,作為新master提供服務

為了避免master切換過程中,舊的master產生髒資料,引入了租約機制。

圖 6. 號段遷移示意。通過更新載入配置把 0~2 號段從 allocsvra 遷移到 allocsvrb

同時,為了避免失聯 allocsvr 提供錯誤的服務,返回髒資料,allocsvr 需要跟 storesvr 保持租約。這個租約機制由以下兩個條件組成:

租約失效:allocsvr n 秒內無法從 storesvr 讀取載入配置時,allocsvr 停止服務

租約生效:allocsvr 讀取到新的載入配置後,立即解除安裝需要解除安裝的號段,需要載入的新號段等待 n 秒後提供服務

圖 7. 租約機制。allocsvrb 嚴格保證在 allocsvra 停止服務後提供服務

分布式ID生成器

一 需求緣起 幾乎所有的業務系統,都有生成乙個唯一記錄標識的需求,例如 這個記錄標識往往就是資料庫中的主鍵,資料庫上會建立聚集索引 cluster index 即在物理儲存上以這個字段排序。這個記錄標識上的查詢,往往又有分頁或者排序的業務需求,例如 所以往往要有乙個time欄位,並且在time欄位上...

分布式 ID 生成器

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

自學 分布式ID生成器

最近在做乙個專案,遇到了乙個小問題 針對資料庫的主鍵自增這塊怎麼解決,前提是採用分片部署。如果還是用我們之前的方式主鍵自增,會造成乙個表中id的重複。舉例說明 比如有乙個商品表,將這個商品表部署在3臺伺服器上 server1 server2 server3。如果是以前的主鍵自增 server1中會從...