Java教程分享:五分鐘瞭解一致性hash演算法
前言
一致性雜湊演算法的設計目標是為了解決因特網中的熱點問題,現在也被廣泛應用在分散式系統中。
比如針對負載均衡問題,對hash值取模的演算法擴充套件性差,當增加或者減少伺服器時,對映關係可能會出現問題,採用一致性hash演算法,就能較好的解決該問題。
Hash值取模演算法存在的問題
比如,我們有海量的圖片儲存在伺服器上,假如,現在有4臺伺服器,我們可以根據圖片名稱,採用hash演算法,決定圖片儲存在哪臺伺服器。
如果現在需要增加伺服器,那麼存取圖片的伺服器的演算法就會發生改變,比如增加一臺伺服器後,演算法變為hash(a.jpg)/5,這時候計算結果不一定還是2,那麼圖片的位置就要發生改變。同理,減少伺服器的話,也會存在相同問題。而且,所有的伺服器都會受到影響。
一致性Hash演算法
一致性Hash演算法將雜湊值對映的空間表示成一個虛擬圓環,一般可以設定對映值的範圍是0----232-1,也就是說,我們得到的hash值要對232取模。該hash環可表示如下:
假如我們有四臺伺服器,我們可以選擇伺服器的ip或主機名作為關鍵字進行雜湊,然後取模,每臺機器就能在hash環上確定固定位置。如下圖所示:
例如有Object A、Object B、Object C、Object D四個資料,經過雜湊運算及取模後,在環空間上的位置如下圖所示:
從此位置沿環順時針“行走”,第一臺遇到的伺服器就是其應該定位到的伺服器。也就是說Object A定位到Node A,Object B定位到Node B,Object C定位到Node C,Object D定位到Node D。
如果Node C這臺伺服器出現問題當機,那麼Objcet C定位到Node D這臺伺服器,所以當某臺伺服器出問題時,只會對順時針方向的前一臺機器產生影響,本例中,只會對Node D有影響。
同理,如果增加一臺伺服器Node X,計算後,定位到如下圖所示位置:
那麼Object C就會定位到Node X,這種情況,只會對順時針方向的Node C產生影響,不會影響其他伺服器。
一致性Hash的缺點
當伺服器節點比較少的時候會出現一致性hash演算法傾斜的問題(大部分資料存在一臺伺服器上)。在不改變伺服器節點個數的前提下,一般解決方案是增加虛擬節點(即對每一個伺服器根據一致性hash演算法計算多個值,每個計算結果在環上定位一個服務節點),在定位資料時,就可以根據虛擬節點,定位到實際伺服器。
總結
一致性雜湊演算法對於節點的增減都只需重定位環空間中的一小部分資料,具有較好的容錯性和可擴充套件性。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2770936/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 10分鐘瞭解一致性hash演算法演算法
- 五分鐘瞭解一致性hash演算法演算法
- 【策略】一致性Hash演算法(Hash環)的java程式碼實現演算法Java
- 一致性hash演算法演算法
- Java實現一致性Hash演算法深入研究Java演算法
- 【策略】一致性Hash演算法演算法
- 好程式設計師Java教程教你5分鐘瞭解快速排序程式設計師Java排序
- 【轉】什麼是一致性hash演算法?(詳解)演算法
- PHP 之一致性 hash 演算法PHP演算法
- 一致性hash演算法的理解演算法
- 強一致性hash實現java版本及強一致性hash原理Java
- 兩分鐘瞭解Java中volatile!Java
- 一分鐘瞭解JAVA語言Java
- 一分鐘瞭解降維演算法演算法
- 什麼是一致性Hash演算法?演算法
- 好程式設計師Java乾貨分享5分鐘瞭解折半插入排序程式設計師Java排序
- 一分鐘瞭解深度學習演算法深度學習演算法
- 好程式設計師Java教程分享詳細瞭解Javasax解析器程式設計師Java
- 手動實現一致性 Hash 演算法演算法
- 對一致性Hash演算法,Java程式碼實現的深入研究演算法Java
- 好程式設計師Java學習路線分享5分鐘瞭解基數排序程式設計師Java排序
- 好程式設計師Java學習路線分享5分鐘瞭解計數排序程式設計師Java排序
- 新手學習java一分鐘瞭解Java核心技術Java
- 一致性 Hash 演算法的實際應用演算法
- 自己實現一個一致性 Hash 演算法演算法
- 一致性hash演算法的一些理解演算法
- 一致性hash演算法原理及go實現演算法Go
- 一致性 hash 演算法( consistent hashing )演算法
- 分享一種最小 Perfect Hash 生成演算法演算法
- 探索c#之一致性Hash詳解C#
- 帶你真正的瞭解加密和Hash加密
- Hash演算法的講解演算法
- 【轉載】對一致性Hash演算法,Java程式碼實現的深入研究演算法Java
- phpmemcached一致性hashPHP
- [保姆教程] [Postgres] 1分鐘深入瞭解Postgres主鍵自增
- 分散式快取一致性hash演算法理解分散式快取演算法
- 30分鐘快速瞭解webpackWeb
- 5分鐘快速瞭解 RedisRedis