「一致性hash的設計初衷是解決分布式快取問題,它不僅能起到hash作用,還可以在伺服器宕機時,盡量少地遷移資料。因此被廣泛用於狀態服務的路由功能」
假設有乙個訊息推送系統,其簡易架構如下
)裝置接入層不僅要接收裝置的登入、下線等狀態命令,還要把開發者的訊息推送給裝置。這個時候裝置接入層就需要維護裝置的狀態資訊(當然可以專門拆乙個狀態服務去維護這些資訊,要求這部分必須少有**更新,具體原因自己去想哦=_=)。這個時候裝置接入層的每台server都保留一批裝置的狀態資訊cache,裝置應該連線哪台server去獲取資料,同時中間層的訊息又該發往哪個server去推送呢?這就用到了一致性hash演算法。
一致性hash由物件、資源、演算法和機器組成。它要做的是:物件通過演算法判斷連哪台機器。在如上系統中:裝置id(userid)為物件;其對應的狀態資料(cache)為資源;伺服器為機器。
在一致性hash演算法中,這些資源圍成了乙個閉環,每台機器又儲存著乙個資源段,每個資源段對應一批物件/裝置;這樣如果某台機器掛了,那它對應的資源轉移到離它較近的機器x,這台dead server對應的裝置連線到機器x就行。
現在假設這四個資源段對應的裝置,活躍情況相差較大。比如說資源段1、2對應的裝置特別活躍,而資源段3和4幾乎沒活動。這樣機器1-2需要儲存大量的狀態資料,而3-4則有大量的空置,顯然是不合理的。改進版的一致性hash演算法是這樣操作的:它不再是每台機器去儲存乙個連續的資源段,而是讓每台機器都儲存多個區域的部分資源段。如機器1儲存每個資源段的1/4,機器2儲存每個資源段的1/4,機器3、4同樣如此。這樣即使個別號段有熱點,也會均攤到不同的機器。
如上介紹了一致性hash的概念和改進,在系統實踐中,我們使用者量非常大,往往不只乙個集群。我們是如此使用一致性hash:
以上介紹了一致性hash的原理和實踐,但不是所有的服務都適合用一致性hash來路由。比如01節中的訊息推送系統,中間層是無狀態的,開發者接入層請求cluter-a的哪台機器都行,它只要做完基本校驗後,把訊息非同步發給mq即可,無需等待結果直接返回; 而裝置接入層是有狀態的,且對較高時延無法忍受,更適合一致性hash選擇好server-instance,然後通過tcp/udp來通訊。
一致性hash演算法 面試必備 一致性hash演算法
最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...
一致性hash演算法虛擬節點 一致性hash演算法
hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...
一致性hash演算法
july部落格16章開始 第一題 全排列,輸入乙個字串,列印出該字串中字元的所有排列 1.個人思路 回溯法建立的排序樹 2.july部落格 遞迴實現,依次固定第乙個字母,後面的交換,和上面描述的使用回溯法相似 c stl 演算法 next permutation的思想,關於next permutat...