記得我人生第一次參加面試的時候,面試官問我的就是這樣一個問題: 你有很多臺服務器,每臺服務器上都存放着很多數據,現在要加一臺服務器,如何才能讓數據搬遷儘可能的少,同時能讓每臺服務器經可能的負載均衡。現在才發現,這就是可一致性hash 問題,當時我答了個hashMap中的rehash操作,給糊弄過去了…
具體的內容可見 reference,這裏大致記錄一下
問題定義
簡化問題如下:
有 個item,有 臺機器,將 個item 儘量均勻的hash到每一臺服務器,同時,當機器出現刪減的時候應該能夠保證數據移動足夠小。
簡單實現
用兩個hash函數,
, 對 item 做hash
, 對 machine 做hash
hash的範圍是一個單位圓(e.g. [0,1] float /[0,2^32-1] int)
每個 item 的hash值所對應的順時針找到的第一個server,存儲這個item 對象,這就是 karger 論文中的核心思想。
假設機器將圓平均分成 段
這樣做很顯然,每臺機器的期望對象數目是 同時,同時新加入一臺機器的時候期望的移動數目是
這樣做已經是很好的解決我們的那個問題了。
下面是用一個好的數據結構來維護查找一個item的時間,可以用一棵 BST 來維護這些機器
(e.g. rb-tree )<key: hash_m(server),value: (server)> 他們的key是 server 的hash 值,value 是每一個server對象。
看一下如下幾個操作:
- 插入/delete item
這樣插入一個 item 僅僅需要找到 hash(item) 在bst上的後繼節點就好了。刪除類似
- insert/delete machine
找到這臺機器 的 後繼節點,將節點上 hash(item) 小於 移動到 Y上。
分析
reference
- MIT adv algorithm lecture note
- stanford cs 168 lec note 1
- 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
轉載請保留此版權聲明,並註明出處