因爲NoSQL的興起,一致性哈希也處處被人提起,主要用來處理分佈式存儲的負載問題。sql
下面簡單介紹一下一致性哈希。假設咱們有一個0~232的圓環。全部的服務器節點分佈在圓環上。以下圖所示:服務器
接下來,咱們如何判斷一個數據要分佈到哪一個節點上呢?首先,計算一個數據的hash值,而後在圓環上找到這個值的位置,接下來順時針日後找最近的結點。把數據存儲到這個結點上。也就是說,一個結點存儲的數據範圍就是它前面的鄰居結點到它之間的這段範圍。如圖中的箭頭所示。負載均衡
因爲普通的一致性hash在負載均衡上效果不是很好,Amazon的dynamo提出了一個改進版的一致性hash。nosql
在dynamo系統中,爲每個物理結點定義了多個虛擬的結點。再把這些虛擬的結點分佈到圓環上。分佈式
這樣子的好處是,若是有一個物理結點掛掉,那麼這個結點的負載將分到多個物理結點了。若是新加一個物理結點,那麼這個物理結點能夠直接減小多個物理結點的負載。spa
假設咱們有A、B、C三臺機器,而後將咱們的分區定義了12個。get
如上圖所示,每一個區間表示一個物理結點所負責的數據範圍。hash
若是咱們加入一個機器D,那麼以下圖所示,機器D替換掉的數據範圍是原來ABC的一部分。固然,在機器D初始化的時候,咱們須要先從ABC把這些數據拷貝過來。pdf
這裏沒有提到dynamo中的數據複製的策略,有興趣的能夠本身看paperfile
http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf