聊聊一致性雜湊

2021-10-10 12:35:47 字數 1863 閱讀 6762

既然有一致性雜湊,就肯定還有不一致雜湊,為啥平時沒人說不一致雜湊呢?因為常見的雜湊都是不一致的,所以就不修飾了,到了一致性雜湊才特殊加個描述詞修飾一下。

雜湊一般都是將乙個大數字取模然後分散到不同的桶裡,假設我們只有兩個桶,有 2、3、4、5 四個數字,那麼模 2 分桶的結果就是:

這時我們嫌桶太少要給雜湊表擴容加了乙個新桶,這時候所有的數字就需要模 3 來確定分在哪個桶裡,結果就變成了:

可以看到新加了乙個桶後所有數字的分布都變了,這就意味著雜湊表的每次擴充套件和收縮都會導致所有條目分布的重新計算,這個特性在某些場景下是不可接受的。比如分布式的儲存系統,每個桶就相當於乙個機器,檔案分布在哪台機器由雜湊演算法來決定,這個系統想要加一台機器時就需要停下來等所有檔案重新分布一次才能對外提供服務,而當一台機器掉線的時候儘管只掉了一部分資料,但所有資料訪問路由都會出問題。這樣整個服務就無法平滑的擴縮容,成為了有狀態的服務。

要想實現無狀態化,就要用到一致性雜湊了,一致性雜湊中假想我們有很多個桶,先定乙個小目標比如 7 個,但一開始真實還是只有兩個桶,編號是 3 和 6。雜湊演算法還是同樣的取模,只不過現在分桶分到的很可能是不存在的桶,那麼就往下找找到第乙個真實存在的桶放進去。這樣 2 和 3 都被分到了編號為 3 的桶, 4 和 5 被分到了編號為 6 的桶。

這時候再新增乙個新的桶,編號是 4,取模方法不變還是模 7:

因為 3 號桶裡都是取模小於等於 3 的,4 號桶只需要從 6 號桶裡拿走屬於它的數字就可以了,這種情況下只需要調整乙個桶的數字就可分成了重新分布。可以想象下即使有 1 億個桶,增加減少乙個桶也只會影響乙個桶的資料分布。

這樣增加乙個機器只需要和他後面的機器同步一下資料就可以開始工作了,下線乙個機器需要先把他的資料同步到後面一台機器再下線。如果突然掉了一台機器也只會影響這台機器上的資料。實現中可以讓每台機器同步乙份自己前面機器的資料,這樣即使掉線也不會影響這一部分的資料服務。

用一致性雜湊還能實現部分的分布式系統無鎖化,每個任務有自己的編號,由於雜湊演算法的確定性,分到哪個桶也是確定的就不存在爭搶,也就不需要分布式鎖了。

既然一致性雜湊有這麼多好的特性,那為啥主流的雜湊都是非一致的呢?主要乙個原因在於查詢效率上,普通的雜湊查詢一次雜湊計算就可以找到對應的桶了,演算法時間複雜度是 o(1),而一致性雜湊需要將排好序的桶組成乙個鍊錶,然後一路找下去,k 個桶查詢時間複雜度是 o(k),所以通常情況下的雜湊還是用不一致的實現。

當然 o(k) 的時間複雜度對於雜湊來說還是不能忍的,想一下都是o(k) 這個量級了用雜湊的意義在**?既然是在排好序的桶裡查詢,很自然的想法就是二分了,能把時間複雜度降到 o(logk),然而桶的組合需要不斷的增減,所以是個鍊錶的實現,二分肯定就不行了,還好可以用跳轉表進行乙個快速的跳轉也能實現 o(logk) 的時間複雜度。

在這個跳轉表中,每個桶記錄距離自己 1,2,4 距離的數字所存的桶,這樣不管查詢落在哪個節點上,對整個雜湊環上任意的查詢一次都可以至少跳過一半的查詢空間,這樣遞迴下去很快就可以定位到資料是存在哪個桶上。

一致性雜湊

直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...

一致性雜湊

from 學習分布式,一致性雜湊是最最基礎的知識,所以要理解好.那什麼是一致性雜湊呢?what 1.平衡性是指 hash的結果應該平均分配到各個節點,這樣從演算法上就解決了負載均衡問題.2.單調性是指 在新增或者刪減節點時,同乙個key訪問到的值總是一樣的.3.分散性是指 資料應該分散的存放在 分布...

一致性雜湊

一致性 雜湊演算法在1997年由 麻省理工學院提出 參見擴充套件閱讀 1 設計目標是為了解決網際網路中的熱點 hot spot 問題,初衷和 carp十分類似。一致性雜湊修正了carp使用的簡單雜湊演算法帶來的問題,使得dht可以在p2p環境中真正得到應用。雜湊演算法 編輯 一致性雜湊提出了在動態變...