數據結構與演算法:大數據之一致性哈希演算法

工程師常使用伺服器集群來設計和實現數據緩存。

以下是常見的策略。

1.無論是添加、查詢還是刪除數據,都先將數據的ID通過哈希函數轉換成一個哈希值,記為key.

2.如果目前機器有N台,則計算key%N的值,這個值就是該數據所屬的機器編號,無論是添加、刪除或者查詢

操作,都只在這台機器上運行。

試分析這種緩存策略可能帶來的問題,並提出改進的方案。

潛在問題:如果增加或者刪除機器,數據遷移的代價很大。

根據哈希函數得到哈希值結果%N

當機器數N發生變化是,所有數據必須重新計算哈希值,以及對新的機器數M取余,來決定各自數據的歸屬。

解決辦法:

一致性哈希演算法:

數據id通過哈希值計算後結果為0-2^32。

把這些數字首尾相連想向成一個閉合的環形。

通過哈希函數計算後的哈希值一次映射到環上的位置。然後順時針尋找離自己最近的一台機器。

那麼這個數據就歸屬於該機器。

比如下圖:

順時針尋找離自己最近的機器

data1歸屬在machine2上

data2歸屬在machine3上

data3和data4歸屬在machine1上

進行添加刪除操作時

沒有添加m3之前,data1和data2都是屬於m2的(m1到m2 的這一段歸m2管理)

添加m3之後,計算m3的id,映射到相應的位置。

然後m1-m3這一段就歸屬於m3了,那麼我們只需要把data1數據放到m3機器上即可。

其他數據都不需要改變。

刪除數據也是一樣的,只需要把該機器上的數據順時針複製到下一台機器上即可,不會影響到其他的機器。


推薦閱讀:

幾何演算法:求多邊形面積
文本比較演算法——最小編輯距離、圖的最短路以及最長公共子序列
數據結構與演算法:動態規劃之LCS最長公共子序列
Leetcode每天兩題3-第167題和第170題
通俗理解 KMP 字元串匹配演算法

TAG:演算法與數據結構 |