Hash哈希(二)一致性Hash(C++實現)


一致性Hash

  一致性哈希算法在1997年由麻省理工學院提出的一種分布式哈希(DHT)實現算法,設計目標是為了解決因特網中的熱點(Hot spot)問題,經常用於分布式、負載均衡等。

原理

  一致哈希是一種特殊的哈希算法。在使用一致哈希算法后,哈希表中平均只需要對K/n 個關鍵字重新映射,其中 K是關鍵字的數量,n是映射節點數量。然而在傳統的哈希表中,添加或刪除一個映射節點的幾乎需要對所有關鍵字進行重新映射。

  原來的映射大概是這樣的,如下圖,沒當加入或刪除一個新的節點可能都會造成每個節點的映射發生變化,如果黃色的節點代表服務器,那么每一次更新服務器的數量都會造成每個服務器上藍色的映射節點都會發生變化,當集群數量龐大時每次增刪節點所需要的修改操作就會過於龐大。

  而在一致性哈希中映射是這樣的,如下圖,一般一致性hash取值范圍為-2^32~2^32,分布在一個圓上

  下面畫的比較丑,就湊合看吧~~

  黃色節點作為映射節點(實節點),藍色節點為需要映射到映射節點的key節點

  •   首先,看左邊的圖,把8個藍色的key通過hash取值散列在一個范圍為0~2^32的圓上

  •   其次,選擇三個黃色節點作為映射節點,按照圓的順時針方向,把藍色節點與黃色節點建立映射關系

  •   最后,由於1節點負載為4,最大,那么我們為了降低1節點的負載情況,增加黃色的映射節點4,依然按照順時針的方向修改原映射,那么只需要改變藍色的節點7、8以及黃色節點1

實現

  一般為了方便起見,我們把黃色的映射節點稱為實節點,也就是固定不變的,而藍色的節點稱為虛節點,虛節點需要映射到實節點,每次實節點的增刪只會影響距離它最近的節點。

  在這里使用C++實現了ConsistentHash算法

  在存儲節點方面,本程序只是簡單的使用鏈表,最好的方式當然是紅黑樹了,當然為了簡單起見,就用了鏈表,主要是理解一致性hash的原理~~

源碼下載:https://github.com/yxd123/algorithm-notes/tree/master/ConsistentHash

參考

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

http://zh.wikipedia.org/wiki/一致哈希

http://baike.baidu.com/view/1588037.htm?fr=aladdin

 

知識共享許可協議
本作品采用 知識共享署名-非商業性使用-相同方式共享 3.0 未本地化版本許可協議進行許可。歡迎轉載,請注明出處:
轉載自: cococo點點 http://www.cnblogs.com/coder2012


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM