簡明講解一致性雜湊演算法

2022-01-18 04:04:38 字數 1672 閱讀 1982

如果我們用(使用者id)%伺服器機器數這樣的方法來分配伺服器。

雖然我們能保證資料的均勻性,但穩定性差,比如我們增加乙個節點,會導致大量的對映失效。

這就難搞了,3之後的全亂了,直接體驗了一把快取雪崩。

所以雜湊演算法只適用於節點數比較固定的情況,並不能很好的應對節點的變化。

這個時候一致性演算法就來了,你看這個雜湊環它是又大又圓,用它來降低對映關係大量失效的可能性剛剛好。

任何一條線段都有無數個點,這個大家應該沒什麼意見吧?所以理論上這個雜湊圈是能儲存無限多的東西的。

那資料該如何儲存呢?一致性雜湊演算法也是取模,一般來說落在圓環上的點是順時針儲存在離他最近的那個伺服器。

如果此時我們增加一台伺服器e在cd之間,那麼受影響的只有d。

也就是說當伺服器數量發生改變時,受影響的只有順時針相鄰的後續節點,後端不至於短時間內承擔大量的壓力,不會發生大規模資料遷移。這也是一致性雜湊演算法的優點。

但abcd一定會在環上均勻分布嗎?完全有可能四台伺服器的ip hash取模之後出現下圖的情況,出現hash環的偏斜。

如果運氣特別好,請求全集中在左邊的圓弧上,a就直接炸了。

最簡單的辦法就是根據當前負載情況對所有節點限制乙個最大負載,防止某個節點承擔大部分的壓力。

當要儲存資料時,先判斷是否已經達到上限。如果已經滿了,那麼接著順時針尋找下乙個節點。

不過如果各台伺服器效能不一的話,這樣做也不是太好。

解決辦法我相信你也想到了,只是沒敢說。如果伺服器夠多,不就不存在分布不均的問題了嗎?

沒錯,就是這樣,但問題是從哪來找那麼多伺服器呢?

根據你想要要加倍的伺服器倍數,搞虛擬節點即可。節點越多,對映到環上就越均勻。比如說你可以由a對映出a1-a(223),bcd也是如此。這4*223個伺服器對映到雜湊環上,環都直接長成小煤球了。絕對的均勻,偏斜問題得到了極大的解決。

也就是將雜湊取模的n進行固定,但多一步虛擬節點對映到物理機上的步驟。這樣就可以確保相同的key必然是相同的位置,從而避免之前牽一髮而動全身的問題。

並且我們還可以根據各台伺服器的效能來設定不同數量的虛擬節點。

引入虛擬節點的另外乙個好處就是當某台機器扛不住崩了,可以防止環上的下個機器要扛2倍的流量。

不過虛擬節點的引入在提高了穩定性的同時,也增加了維護和管理的複雜度,也算是有利有弊吧。

一致性雜湊演算法

好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...

一致性雜湊演算法

在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...

一致性雜湊演算法

判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...