分布式一致性雜湊分析

2021-08-20 17:22:44 字數 1703 閱讀 4481

​ 現在實際應用中,我們使用redis作為我們的快取伺服器,假如現在我們的使用三颱redis伺服器用來作為快取(redis01,redis02,redis03),現在我們需要把我們的資料均勻的存放到三個redis伺服器上

​ 對於redis伺服器來說,並沒有實現分布式集群,所謂的redis的分布式集群是指由客戶端所決定存資料存放到哪台伺服器以及從哪台伺服器上取獲取資料

同理,在取資料的時候,也是先根據key進行hash值的運算,然後取餘找到對應的redis伺服器進行資料的讀取

​ 問題:隨著業務的增長獲取伺服器的執行狀況,如果出現需要增加伺服器或者說有乙個redis伺服器宕機的話,那麼按照我們上面的取模運算還可以正常執行嗎?如果不行那麼我們有什麼樣的方案來解決呢?

​ 對於上面的問題,當伺服器其出現上/下線的時候,如果還是按照上述的取模運算的話,顯然是會出問題的

總是,在我們當對伺服器進行增減操作的時候,原來的所有的快取資料都需要從新分布排列,這樣帶代價比較大,有沒有一種方法讓我們在增減伺服器的時候,影響的只有一小部分資料,大部分資料是不需要進行改變的。要實現這個功能,就需要使用到一致性雜湊演算法

​ 一致性雜湊演算法大概實現的思路如下

參考上圖,接下來我們分析一下增減伺服器的情況

通過上面這種解決方案,基本上可以解決分布式的一致性雜湊的問題了,但是由於上面這種情況也會出翔一些情況

對於上面兩種情況,我們需要使用所謂的乙個虛擬節點的概念,在hash圓環上建立足夠多的虛擬節點,然後把虛擬節點和物理節點對映起來,這樣可以保證資源的平衡性

對於當乙個伺服器redis02宕機後,應該把redis02上的資源均勻的分布到redis01和redis03上面,這樣可以保證各個伺服器的負載均衡

1、平衡性(balance):平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。

2、分散性(spread) :在分布式環境中,終端有可能看不到所有的緩衝,而是只能看到其中的一部分。當終端希望通過雜湊過程將內容對映到緩衝上時,由於不同終端所見的緩衝範圍有可能不同,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端對映到不同的緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分散性的定義就是上述情況發生的嚴重程度。好的雜湊演算法應能夠盡量避免不一致的情況發生,也就是盡量降低分散性。

3、負載(load):負載問題實際上是從另乙個角度看待分散性問題。既然不同的終端可能將相同的內容對映到不同的緩衝區中,那麼對於乙個特定的緩衝區而言,也可能被不同的使用者對映為不同 的內容。與分散性一樣,這種情況也是應當避免的,因此好的雜湊演算法應能夠盡量降低緩衝的負荷。

4、單調性(monotonicity):單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的結果應能夠保證原有已分配的內容可以被對映到原有的或者新的緩衝中去,而不會被對映到舊的緩衝集合中的其他緩衝區。

分布式 一致性雜湊演算法

一致性雜湊演算法,作為分布式計算的資料分配參考,比傳統的取模,劃段都好很多 傳統雜湊取模,在資料需要遷移時代價巨大,因此需要優化。一致性雜湊 將雜湊值看作乙個環,順時針將雜湊值接近節點的物件存到對應節點,通過這種演算法做資料分布,在增減節點的時候,可以大大減少資料的遷移規模。此時,可能會出現乙個問題...

分布式與一致性雜湊

一致性雜湊演算法 一致性雜湊演算法主要用來解決分布式的問題。我們定義乙個圓環 0 2 32 1 我們根據一定的雜湊函式計算出資料的key然後利用hash結構儲存相應的val或這key val,如果 出現了hash衝突我們可以採用鏈位址法或者線性探測法加以解決,我們可以保證最大效率的 查詢到這個key...

分布式一致性

分布式一致性是指在分布式環境中對某個副本資料進行更新操作時,必須確保其他副本也會更新,避免不同副本資料不一致。分布式系統乙個重要的問題時解決資料複製,一是為了增加系統的可用性防止單點故障,二是提高系統可用性,通過負載聚恆,使分布在不同位置的資料副本能夠提供服務。理想狀態下,當然希望分布式系統能夠實現...