現在我們假設有100臺redis data伺服器,乙份資料101進來的時候,以雜湊公式hash(i)&100,計算所存放的伺服器,假設hash(i) = i,那麼資料被雜湊到標號為1的伺服器,然後這個時候伺服器新增了一台,然後雜湊公式為hash(i)%101,這個時候請求訪問資料101的時候,被分配至0號伺服器,但是其實這個時候資料是在1號伺服器的。
所以這個時候,我們假設是新增了伺服器,如果是持久化儲存的,我們可以讓伺服器集群對資料進行重新雜湊,進行資料遷移,然後進行恢復,但是這個時候就意味著每次增減伺服器的時候,集群就需要大量的通訊,進行資料遷移,這個開銷是非常大的。如果只是快取,那麼快取就都失效了。所以這個時候怎麼辦?
如上圖,我們有abcd四台伺服器,這四台伺服器被分配至0~232 的乙個環上,比如0~230的儲存在a伺服器,230 +1~231 儲存到b伺服器上.....cd按照這樣的進行均分。將我們的雜湊空間也劃為0~232 ,然後資料進來後對232 取模,得到乙個值k1,我們根據k1在環上所處的位置,得到所分配到的伺服器,如圖,k1被分配到b伺服器。 這個時候,我們有一台伺服器b失效了。
我們可以看到,如果是b失效了,那麼如果有持久化儲存的,需要做資料恢復,將b的資料遷移至c即可,對於原本雜湊在a和d的資料,不需要做任何改變。 同理,如果我們是新增了伺服器,那麼只需要對一台伺服器的資料遷移一部分至新加的伺服器即可。
而且這樣還有個好處,假設我們使用uid作為雜湊範圍(即上面的232 ),那麼假設有部分uid的訪問很頻繁,而且這部分uid集中在b伺服器上,那麼就造成了b的負載遠遠高於其他伺服器。這就是熱點資料的問題。這個時候我們可以向b所在的uid空間新增伺服器,減少b的壓力。
上面說的情況是,使用真實的伺服器作為節點雜湊在232 上。 我們假設,只有4臺伺服器(如上圖),然後a上面有熱點資料,結果a掛掉了,然後做資料恢復,a的資料遷移至b,然後b需要承受a+b的資料,也承受不住,也掛了。。。。然後繼續cd都掛了。這就造成了
上面會造成雪崩效應的原因分析:
如果不存在熱點資料的時候,每台機器的承受的壓力是m/2(假設每台機器的最高負載能力為m),原本是不會有問題的,但是,這個時候a伺服器由於有熱點資料掛了,然後a的資料遷移至b,導致b所需要承受的壓力變為m(還不考慮熱點資料訪問的壓力),所以這個失敗b是必掛的,然後c至少需要承受1.5m的壓力。。。。然後大家一起掛。。。
所以我們通過上面可以看到,之所以會大家一起掛,原因在於如果一台機器掛了,那麼它的壓力全部被分配到一台機器上,導致雪崩。
這裡引入虛擬節點,如圖:
環上的空間被劃分為8份,然後a儲存a1和a2。。。
這個時候,如果a伺服器掛了,訪問壓力會分配至c2和d1,也就是c和d伺服器,而不是像前面,全部被分配到b上。
tair的負載均衡就是採用的一致性hash演算法啦~~~
一致性hash演算法在分布式環境中應用的很廣,只要是涉及到分布式儲存的負載均衡問題,一致性hash都是很好的解決的方案。
一致性雜湊演算法
好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...
一致性雜湊演算法
在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...
一致性雜湊演算法
判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...