目錄
約束條件:
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中會從...