一致性 雜湊演算法在2023年由
麻省理工學院提出(參見擴充套件閱讀[1]),設計目標是為了解決網際網路中的熱點(hot spot)問題,初衷和
carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。
雜湊演算法 編輯
一致性雜湊提出了在動態變化的cache環境中,
雜湊演算法應該滿足的4個適應條件:
平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多
雜湊演算法都能夠滿足這一條件。
單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的
緩衝區加入到系統中,那麼雜湊的結果應能夠保證原有已分配的內容可以被對映到新的緩衝區中去,而不會被對映到舊的緩衝集合中的其他緩衝區。(這段翻譯資訊有負面價值的,當緩衝區大小變化時一致性雜湊(consistent hashing)盡量保護已分配的內容不會被重新對映到新緩衝區。)
簡單的 雜湊演算法往往不能滿足單調性的要求,如最簡單的線性雜湊:
在上式中,p表示全部緩衝的大小。不難看出,當緩衝大小發生變化時(從p1到p2),原來所有的雜湊結果均會發生變化,從而不滿足單調性的要求。
雜湊結果的變化意味著當緩衝空間發生變化時,所有的對映關係需要在系統內全部更新。而在p2p系統內,緩衝的變化等價於peer加入或退出系統,這一情況在p2p系統中會頻繁發生,因此會帶來極大計算和傳輸負荷。單調性就是要求
雜湊演算法能夠應對這種情況。
在分布式環境中,終端有可能看不到所有的緩衝,而是只能看到其中的一部分。當終端希望通過雜湊過程將內容對映到緩衝上時,由於不同終端所見的緩衝範圍有可能不同,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端對映到不同的
緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分散性的定義就是上述情況發生的嚴重程度。好的
雜湊演算法應能夠盡量避免不一致的情況發生,也就是盡量降低分散性。
負載問題實際上是從另乙個角度看待分散性問題。既然不同的終端可能將相同的內容對映到不同的
緩衝區中,那麼對於乙個特定的緩衝區而言,也可能被不同的使用者對映為不同的內容。與分散性一樣,這種情況也是應當避免的,因此好的
雜湊演算法應能夠盡量降低緩衝的負荷。
從表面上看,一致性雜湊針對的是分布式緩衝的問題,但是如果將緩衝看作p2p系統中的peer,將對映的內容看作各種共享的資源(資料,檔案,**流等),就會發現兩者實際上是在描述同一問題。
路由演算法
在一致性雜湊演算法中,每個節點(對應p2p系統中的peer)都有隨機分配的id。在將內容對映到
節點時,使用內容的
關鍵字和節點的id進行一致性雜湊運算並獲得鍵值。一致性雜湊要求鍵值和節點id處於同一值域。最簡單的鍵值和id可以是一維的,比如從0000到9999的整數集合。
根據鍵值儲存內容時,內容將被儲存到具有與其鍵值最接近的id的節點上。例如鍵值為1001的內容,系統中有id為1000,1010,1100的節點,該內容將被對映到1000節點。
為了構建查詢所需的路由,一致性雜湊要求每個節點儲存其上行節點(id值大於自身的節點中最小的)和下行節點(id值小於自身的節點中最大的)的位置資訊(ip位址)。當節點需要查詢內容時,就可以根據內容的鍵值決定向上行或下行節點發起查詢請求。收到查詢請求的節點如果發現自己擁有被請求的目標,可以直接向發起查詢請求的節點返回確認;如果發現不屬於自身的範圍,可以**請求到自己的上行/下行節點。
為了維護上述路由資訊,在
節點加入/退出系統時,相鄰的節點必須及時更新路由資訊。這就要求節點不僅儲存直接相連的下行節點位置資訊,還要知道一定深度(n跳)的間接下行節點資訊,並且動態地維護節點列表。當節點退出系統時,它的上行節點將嘗試直接連線到最近的下行節點,連線成功後,從新的下行節點獲得下行節點列表並更新自身的節點列表。同樣的,當新的節點加入到系統中時,首先根據自身的id找到下行節點並獲得下行節點列表,然後要求上行節點修改其下行節點列表,這樣就恢復了路由關係。 編輯
一致性雜湊基本解決了在p2p環境中最為關鍵的問題——如何在動態的網路拓撲中分布儲存和路由。每個
節點僅需維護少量相鄰節點的資訊,並且在節點加入/退出系統時,僅有相關的少量節點參與到拓撲的維護中。所有這一切使得一致性雜湊成為第乙個實用的dht演算法。
但是一致性雜湊的
路由演算法尚有不足之處。在查詢過程中,查詢訊息要經過o(n)步(o(n)表示與n成正比關係,n代表系統內的節點總數)才能到達被查詢的節點。不難想象,當系統規模非常大時,節點數量可能超過百萬,這樣的查詢效率顯然難以滿足使用的需要。換個角度來看,即使使用者能夠忍受漫長的時延,查詢過程中產生的大量訊息也會給網路帶來不必要的負荷。
一致性雜湊
直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...
一致性雜湊
from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...
一致性雜湊
首先我們可以看看為什麼需要一致性雜湊演算法。假設我們有3臺redis快取伺服器,編號為0,1,2.現在我們想將3萬張均勻的快取存到這3臺伺服器上。因為不想在快取中找某張時去遍歷3臺伺服器,所以我們原始的做法是對快取項的鍵進行雜湊,將雜湊後的結果對伺服器的數量進行取模操作。hash 名稱 3這樣當我們...