如果我們用(使用者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 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...