consistent hash : 一致性hash 簡單筆記

記得我人生第一次參加面試的時候,面試官問我的就是這樣一個問題: 你有很多臺服務器,每臺服務器上都存放着很多數據,現在要加一臺服務器,如何才能讓數據搬遷儘可能的少,同時能讓每臺服務器經可能的負載均衡。現在才發現,這就是可一致性hash 問題,當時我答了個hashMap中的rehash操作,給糊弄過去了…

具體的內容可見 reference,這裏大致記錄一下

問題定義

簡化問題如下:

mm 個item,有 nn 臺機器,將 mm 個item 儘量均勻的hash到每一臺服務器,同時,當機器出現刪減的時候應該能夠保證數據移動足夠小。

簡單實現

用兩個hash函數,

hashi(x)hash_i(x), 對 item 做hash

hashm(x)hash_m(x), 對 machine 做hash

hash的範圍是一個單位圓(e.g. [0,1] float /[0,2^32-1] int)

每個 item 的hash值所對應的順時針找到的第一個server,存儲這個item 對象,這就是 karger 論文中的核心思想

假設機器將圓平均分成 mm
這樣做很顯然,每臺機器的期望對象數目是 O(nm)O(\frac{n}{m}) 同時,同時新加入一臺機器的時候期望的移動數目是 O(nm+1)O(\frac{n}{m+1})

這樣做已經是很好的解決我們的那個問題了。

下面是用一個好的數據結構來維護查找一個item的時間,可以用一棵 BST 來維護這些機器
(e.g. rb-tree )<key: hash_m(server),value: (server)> 他們的key是 server 的hash 值,value 是每一個server對象。

看一下如下幾個操作:

  1. 插入/delete item

這樣插入一個 item 僅僅需要找到 hash(item) 在bst上的後繼節點就好了。刪除類似

  1. insert/delete machine

找到這臺機器 YY 的 後繼節點,將節點上 hash(item) 小於 hash(Y)hash(Y) 移動到 Y上。

分析

reference

  1. MIT adv algorithm lecture note
  2. stanford cs 168 lec note 1
  3. Karger, David, Eric Lehman, Tom Leighton, Rina Panigrahy, Matthew Levine, and Daniel Lewin. “Consistent hashing and random trees: Distributed caching protocols for relieving hot spots on the World Wide Web.” In Proceedings of the twenty-ninth annual ACM symposium on Theory of computing, pp. 654-663. ACM, 1997.

版權聲明

本作品爲作者原創文章,採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議

作者: taotao

轉載請保留此版權聲明,並註明出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章