一致性hash演算法,在維基百科的定義是:
翻譯過來的意思就是當hash表更新節點的數量時,只有k/n的關鍵字位置有變化,其他關鍵字的位置對映關係不變。與其他的hash演算法比,其他的演算法節點個數n變化後,更多的key關鍵字和節點的對映會發生變化。
一致性hash主要用在路由中,對有狀態的服務,根據key進行**到對應的服務中。保證相同的key一直落到同乙個伺服器,當有服務節點增減時,只有少量(k/n)的請求位置是變化的。減少重新建立快取或儲存的成本。
前提: 常規實現
取key所對映的所有值最大空間(2^32)個,組成乙個環,然後隨機在這個環上落n個點,相鄰的兩個點形成乙個左閉右開(關於左閉右開參考《聊聊左閉右開區間》)區間。共有n個區間。
對於每個key,一定只落在n個區間中的乙個,它屬於該區間所分配的節點。
當有服務節點增減時,會有區間新增或消失,平均只有k/n個key會受影響,變更屬於的節點。
如下圖,在插入nodec之前,2、3、8key都屬於nodea,當插入nodec後2、3歸屬c,屬於b的節點不會改變。
改進:增加虛節點
常規實現在實際應用中會遇到問題。當n的數量太少時,會導致n個節點所管轄的區間並不均勻。
既然是n的數量太少,那增加n的數量不就行了?正解,可以成倍地增加n的數量,乙個實際的節點擴充為100倍的虛節點,每個key先查詢屬於哪個虛節點,再檢視該虛節點屬於那個實節點。
由於眾多虛節點的引入,使每個實節點被分配到的key數量的差距變少。
從圖中可見,增加了nodea和noded的虛節點後,把區間分得更細小,會使分布更均勻。還可以通過設定權值,讓不同處理能力的實節點,處理不同量級的key。
通過上面的講解,可以熟悉一致性hash的演算法,但是在實際使用中,還是有很多需要注意的地方。
如何加入虛節點
加入虛節點能夠解決分布不均的問題,但是如何加入也是有技巧的。如果完全隨機,就是撞大運程式設計。要利用搜尋演算法,加入節點時要檢測,保證每個實節點的區間不能差異太大。必要時要回溯,剪枝,或者用啟發性搜尋。
節點配置同步
乙個大系統,每個真實節點有1000個虛節點,一共1000個實節點,有1m條目資料。每當更新節點資訊時,要保證快速更換、傳遞更新資料,而且要有檢查功能。節點配置的同步、檢測也會有很多細節問題。
了解一致性hash演算法
了解一致性hash演算法
看到一遍介紹consistent hashing 的文章,通俗易懂,特記錄 事情由來 常用的負載均衡演算法 在做伺服器負載均衡時候可供選擇的負載均衡的演算法有很多,包括 輪循演算法 round robin 雜湊演算法 hash 最少連線演算法 least connection 響應速度演算法 res...
了解一致性hash演算法
一致性hash演算法,在維基百科的定義是 翻譯過來的意思就是當hash表更新節點的數量時,只有k n的關鍵字位置有變化,其他關鍵字的位置對映關係不變。與其他的hash演算法比,其他的演算法節點個數n變化後,更多的key關鍵字和節點的對映會發生變化。一致性hash主要用在路由中,對有狀態的服務,根據k...
一致性hash演算法 面試必備 一致性hash演算法
最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...