1. 程式人生 > >一致性雜湊演算法(consistent hashing)

一致性雜湊演算法(consistent hashing)

本文要解決的問題:

從原理上理解一致性雜湊演算法。

轉自:http://blog.csdn.net/cywosp/article/details/23397179/

一致性雜湊演算法在1997年由麻省理工學院提出的一種分散式雜湊(DHT)實現演算法,設計目標是為了解決因特網中的熱點(Hot spot)問題,初衷和CARP十分類似。一致性雜湊修正了CARP使用的簡 單雜湊演算法帶來的問題,使得分散式雜湊(DHT)可以在P2P環境中真正得到應用。      一致性hash演算法提出了在動態變化的Cache環境中,判定雜湊演算法好壞的四個定義:
1、平衡性(Balance):平衡性是指雜湊的結果能夠儘可能分佈到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。
2、單調性(Monotonicity):單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的結果應能夠保證原有已分配的內容可以被對映到原有的或者新的緩衝中去,而不會被對映到舊的緩衝集合中的其他緩衝區。簡單的雜湊演算法往往不能滿足單調性的要求,如最簡單的線性雜湊:x = (ax + b) mod (P),在上式中,P表示全部緩衝的大小。不難看出,當緩衝大小發生變化時(從P1到P2),原來所有的雜湊結果均會發生變化,從而不滿足單調性的要求。雜湊結果的變化意味著當緩衝空間發生變化時,所有的對映關係需要在系統內全部更新。 
3、分散性(Spread)
:在分散式環境中,終端有可能看不到所有的緩衝,而是隻能看到其中的一部分。當終端希望通過雜湊過程將內容對映到緩衝上時,由於不同終端所見的緩衝範圍有可能不同,從而導致雜湊的結果不一致,最終的結果是相同的內容被不同的終端對映到不同的緩衝區中。這種情況顯然是應該避免的,因為它導致相同內容被儲存到不同緩衝中去,降低了系統儲存的效率。分散性的定義就是上述情況發生的嚴重程度。好的雜湊演算法應能夠儘量避免不一致的情況發生,也就是儘量降低分散性。 
4、負載(Load):負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內容對映到不同的緩衝區中,那麼對於一個特定的緩衝區而言,也可能被不同的使用者對映為不同 的內容。與分散性一樣,這種情況也是應當避免的,因此好的雜湊演算法應能夠儘量降低緩衝的負荷。
      在分散式叢集中,對機器的新增刪除,或者機器故障後自動脫離叢集這些操作是分散式叢集管理最基本的功能。如果採用常用的hash(object)%N演算法,那麼在有機器新增或者刪除後,很多原有的資料就無法找到了,這樣嚴重的違反了單調性原則。接下來主要講解一下一致性雜湊演算法是如何設計的:
環形Hash空間 按照常用的hash演算法來將對應的key雜湊到一個具有2^32次方個桶的空間中,即0~(2^32)-1的數字空間中。現在我們可以將這些數字頭尾相連,想象成一個閉合的環形。如下圖                                                                           把資料通過一定的hash演算法處理後對映到環上 現在我們將object1、object2、object3、object4四個物件通過特定的Hash函式計算出對應的key值,然後雜湊到Hash環上。如下圖:     Hash(object1) = key1;     Hash(object2) = key2;     Hash(object3) = key3;     Hash(object4) = key4;                                                            
將機器通過hash演算法對映到環上 在採用一致性雜湊演算法的分散式叢集中將新的機器加入,其原理是通過使用與物件儲存一樣的Hash演算法將機器也對映到環中(一般情況下對機器的hash計算是採用機器的IP或者機器唯一的別名作為輸入值),然後以順時針的方向計算,將所有物件儲存到離自己最近的機器中。 假設現在有NODE1,NODE2,NODE3三臺機器,通過Hash演算法得到對應的KEY值,對映到環中,其示意圖如下: Hash(NODE1) = KEY1; Hash(NODE2) = KEY2; Hash(NODE3) = KEY3;                                                              
通過上圖可以看出物件與機器處於同一雜湊空間中,這樣按順時針轉動object1儲存到了NODE1中,object3儲存到了NODE2中,object2、object4儲存到了NODE3中。在這樣的部署環境中,hash環是不會變更的,因此,通過算出物件的hash值就能快速的定位到對應的機器中,這樣就能找到物件真正的儲存位置了。 機器的刪除與新增 普通hash求餘演算法最為不妥的地方就是在有機器的新增或者刪除之後會照成大量的物件儲存位置失效,這樣就大大的不滿足單調性了。下面來分析一下一致性雜湊演算法是如何處理的。 1. 節點(機器)的刪除     以上面的分佈為例,如果NODE2出現故障被刪除了,那麼按照順時針遷移的方法,object3將會被遷移到NODE3中,這樣僅僅是object3的對映位置發生了變化,其它的物件沒有任何的改動。如下圖:                                                               
2. 節點(機器)的新增      如果往叢集中新增一個新的節點NODE4,通過對應的雜湊演算法得到KEY4,並對映到環中,如下圖:                                                               
    通過按順時針遷移的規則,那麼object2被遷移到了NODE4中,其它物件還保持這原有的儲存位置。通過對節點的新增和刪除的分析,一致性雜湊演算法在保持了單調性的同時,還是資料的遷移達到了最小,這樣的演算法對分散式叢集來說是非常合適的,避免了大量資料遷移,減小了伺服器的的壓力。 平衡性 根據上面的圖解分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1儲存到了NODE1中,而object2、object3、object4都儲存到了NODE3中,這樣就照成了非常不平衡的狀態。在一致性雜湊演算法中,為了儘可能的滿足平衡性,其引入了虛擬節點。     ——“虛擬節點”( virtual node )是實際節點(機器)在 hash 空間的複製品( replica ),一實際個節點(機器)對應了若干個“虛擬節點”,這個對應個數也成為“複製個數”,“虛擬節點”在 hash 空間中以hash值排列。 以上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖)為例,之前的物件在機器上的分佈很不均衡,現在我們以2個副本(複製個數)為例,這樣整個hash環中就存在了4個虛擬節點,最後物件對映的關係圖如下:                                                                  
根據上圖可知物件的對映關係:object1->NODE1-1,object2->NODE1-2,object3->NODE3-2,object4->NODE3-1。通過虛擬節點的引入,物件的分佈就比較均衡了。那麼在實際操作中,正真的物件查詢是如何工作的呢?物件從hash到虛擬節點到實際節點的轉換如下圖:                                          
“虛擬節點”的hash計算可以採用對應節點的IP地址加數字字尾的方式。例如假設NODE1的IP地址為192.168.1.100。引入“虛擬節點”前,計算 cache A 的 hash 值: Hash(“192.168.1.100”); 引入“虛擬節點”後,計算“虛擬節”點NODE1-1和NODE1-2的hash值: Hash(“192.168.1.100#1”); // NODE1-1 Hash(“192.168.1.100#2”); // NODE1-2

相關推薦

每天進步一點點——五分鐘理解一致性演算法(consistent hashing)

根據上面的圖解分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1

一致性演算法(consistent hashing)

本文要解決的問題: 從原理上理解一致性雜湊演算法。 轉自:http://blog.csdn.net/cywosp/article/details/23397179/ 一致性雜湊演算法在1997年由麻省理工學院提出的一種分散式雜湊(DHT)實現演算法,設計目標是為了解決

詳解一致性演算法(consistent hashing)

根據上面的圖解分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1

[轉]理解一致性演算法(consistent hashing)

[size=medium]一致性雜湊演算法原理[url]http://www.cnblogs.com/lpfuture/p/5796398.html[/url]白話解析一致性雜湊演算法(Excellent)[url]http://www.zsythink.net/archiv

每天進步一點點——一致性演算法(consistent hashing)

根據上面的圖解分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1

理解一致性演算法(consistent hashing)(轉)

根據上面的圖解分析,一致性雜湊演算法滿足了單調性和負載均衡的特性以及一般hash演算法的分散性,但這還並不能當做其被廣泛應用的原由,因為還缺少了平衡性。下面將分析一致性雜湊演算法是如何滿足平衡性的。hash演算法是不保證平衡的,如上面只部署了NODE1和NODE3的情況(NODE2被刪除的圖),object1

一致性Consistent Hashing)原理

-轉自【http://afghl.github.io/2016/07/04/consistent-hashing.html】,僅供學習 看一些分散式相關的技術文章或書籍時,經常看到一個詞,一致性雜湊。對於這個技術一直似懂非懂。今天花了半天的時間好好研究了它的原理和實現,發現

分散式一致性演算法(一)一致性演算法consistent hashing

一 基本場景 比如你有 N 個 cache 伺服器(後面簡稱 cache ),那麼如何將一個物件 object 對映到 N 個 cache 上呢,你很可能會採用類似下面的通用方法計算 object 的 hash 值,然後均勻的對映到到 N 個 cache ; hash(o

Consistent Hashing 一致性演算法

按照我的理解方式 就是將所有的cache伺服器的標識分別hash到的值分佈到0-pow(2,32)中. 然後將你要取的key的hash值進行比較。取第一個大於key的hash值的伺服器。 如果從0-pow(2,32)也沒有找到,那麼則取最小hash值的伺服器。例如 上圖中, 伺服器 a 的hash值 為 1,

一致性演算法consistent hashing)

    一致性雜湊演算法在1997年由麻省理工學院提出的一種分散式雜湊(DHT)實現演算法,設計目標是為了解決因特網中的熱點(Hot spot)問題,初衷和CARP十分類似。一致性雜湊修正了CARP使用的簡單雜湊演算法帶來的問題,使得分散式雜湊(DHT)可以在P2P環境

一致性演算法consistent hashing

應用場景: 在做伺服器負載均衡時候可供選擇的負載均衡的演算法有很多,包括: 輪循演算法( RoundRobin)、雜湊演算法( HASH)、最少連線演算法( Least Connection)、響應速度演算法( ResponseTime)、加權法( Weight

LintCode Consistent Hashing一致性演算法

一般的資料庫進行horizontal shard的方法是指,把 id 對 資料庫伺服器總數 n 取模,然後來得到他在哪臺機器上。這種方法的缺點是,當資料繼續增加,我們需要增加資料庫伺服器,將 n 變為 n+1 時,幾乎所有的資料都要移動,這就造成了不 consistent。為了減少這種 naive 的 ha

Consistent Hashing一致性演算法

一、簡單介紹一致性雜湊演算法分散式儲存中,常常涉及到負載均衡問題,由於有多個數據儲存伺服器。因此當一個物件被儲存時候,它究竟應該存放到哪個資料儲存伺服器上面呢?這就是負載均問題。         又例如:現在假設有一個網站,最近發現隨著流量增加,伺服器壓力越來越大,之前直接

一致性演算法consistent hashing)例子+測試。

一個簡單的consistent hashing的例子,很容易理解。 首先有一個裝置類,定義了機器名和ip: public class Cache { public String name; public String ipAddress; } 然後是主要的實現: pub

一致性演算法consistent hash)的黑科技

這是一個來自Google的零記憶體消耗、均勻、快速、簡潔的一致性雜湊演算法 – Jump Consistent Hash 演算法的作者是Google的John Lamping和Eric Veach,論文原文連結 – 點這裡,一些討論 – 點這裡 整篇文章基於對論文原文的翻譯,摻雜自己的

關於一致性演算法

假設我們有 K 個機器,資料的雜湊值的範圍為 [0, MAX]。我們將整個範圍劃分為 m 個小區間(m 遠大於 K),每個機器負責 m/K 個小區間。當有新機器加入的時候,我們就將某幾個小區間的資料搬移到新機器上去。這樣,既不用全部重新計算雜湊值,搬移資料,也保持了各個機器上資料數量的均衡。 1

【轉】一致性演算法

在瞭解一致性雜湊演算法之前,最好先了解一下快取中的一個應用場景,瞭解了這個應用場景之後,再來理解一致性雜湊演算法,就容易多了,也更能體現出一致性雜湊演算法的優點,那麼,我們先來描述一下這個經典的分散式快取的應用場景。 場景描述 假設,我們有三臺快取伺服器,用於快取圖片,我們為這三臺快取伺服器編號為0

一致性演算法的基本原理-如何解決傾斜問題

在日常工作中,經常有這樣的情況,我們需要做hash,雜湊開資料到不同的區或節點。目標要的結果是要均勻雜湊,避免某個節點積累大量的資料,出現傾斜情況。 比如目前有N臺機器,過來的資料key,需要做雜湊key%N,分發到對應的節點上。 一致性雜湊演算法原理  為了解決has

一致性演算法原理

2018年11月12日 14:01:38 he582754810 閱讀數:6 個人分類: 分散式

分散式memcache 一致性演算法(採用環狀資料結構)

  <?php #分散式memcache 一致性雜湊演算法(採用環狀資料結構) class ConsistentHashMemcache { private $virtualNode=''; #用於儲存虛擬節點個數 private $realN