一致性hash演算法的理解
用hash做快取,假如有三臺伺服器,1,2,3,有三萬張圖片,我想將圖片平均快取到我三臺伺服器上,一個伺服器大概一萬張,怎麼去實現這個辦法呢,可以用hash來取餘數進行操作,加入我們是以圖片的名字作為key進行hash計算,hash (圖片名稱)%N 其中N為我們伺服器的個數,我們將hash(圖片名稱)這一部分進行計算後得到的是一個正數,然後除以伺服器的數目進行取餘數,結果將會是0,1,2三個數,對應我們的伺服器的編號,當我們作為客戶端去請求圖片的時候,圖片已經進行過hash運算了,直接找到對應伺服器的編號進行圖片的訪問,這樣解決了我需要遍歷所有的伺服器進行查詢。
那如果我快取的伺服器的數量減少或者增加,如果還是按照原來的演算法走,必定會造成快取資料的丟失,會去向後端的伺服器去請求,如果有一臺快取伺服器發生了故障,那我原來快取的位置必定會發生改變,原來本該運算後要進行快取到某一臺伺服器的圖片,現在找不到對應快取伺服器,肯定會發生快取的雪崩
所以出現了一致性hash演算法相當於將伺服器和圖片分別hash到我的hash環上進行就近快取,hash環就是對2^32次方進行取模,從0開始一直到2^32,均勻分佈在一個圓環(一個比方),0的順時針方向的第一位為1,逆時針方向第一位為2^32,大概如下圖
具體就是比方我有三個伺服器A,B ,C對其進行 hash (伺服器Aip)%2^32 得出來的一定是一個整數,而且一定是在0--2^32之間,那麼這個數就會分佈在hash環上對應的位置,相同的B,C都一樣,假設我們hash過後ABC的位置如下圖
然後我們將需要快取圖片的key進行hash,它的hash值也會分佈在我的hash環上,
如上圖,我hash到了A和C之間,圖片的儲存規則是順時針方向的儲存,所以應該儲存到A,如果有四張的話如下圖
那如果我們的hash演算法將伺服器和hash的圖片存放位置比較相近,類似於;
所有的快取都集中儲存到了A一臺,只有5到了B,那麼這樣A的壓力就不言而喻,沒有均勻可言了,辛虧hash環可以新增快取伺服器的虛擬節點,類似於虛擬機器,一臺實機可以虛擬多臺,類似於這樣:
這樣的話就會盡可能的把快取都均衡放在各個伺服器
一致性hash演算法的優勢在哪:一個是當我有一臺快取節點掛了之後,快取的儲存不會受太大的影響,
我們將b節點拿走,本來要在B節點儲存的3,因為找不到B伺服器,而遵循規則快取到C,而4的快取節點不會發生改變,這就是一致hash的優點,如果發生伺服器的增加或者減少只有部分的快取會失效,不造成全盤皆輸的可能
一致hash到此結束。
本文轉自雲棲社群 作者:提利
原文連結:https://yq.aliyun.com/articles/629003?spm=a2c4e.11153940.bloghomeflow.55.4a0b291alaKm1U
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31137683/viewspace-2213068/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一致性hash演算法的一些理解演算法
- 分散式快取一致性hash演算法理解分散式快取演算法
- 一致性hash演算法演算法
- 【策略】一致性Hash演算法演算法
- PHP 之一致性 hash 演算法PHP演算法
- 【策略】一致性Hash演算法(Hash環)的java程式碼實現演算法Java
- 一致性 Hash 演算法的實際應用演算法
- 什麼是一致性Hash演算法?演算法
- 手動實現一致性 Hash 演算法演算法
- 10分鐘瞭解一致性hash演算法演算法
- 自己實現一個一致性 Hash 演算法演算法
- 五分鐘瞭解一致性hash演算法演算法
- 一致性hash演算法原理及go實現演算法Go
- 一致性 hash 演算法( consistent hashing )演算法
- phpmemcached一致性hashPHP
- 【轉】什麼是一致性hash演算法?(詳解)演算法
- Java實現一致性Hash演算法深入研究Java演算法
- 強一致性hash實現java版本及強一致性hash原理Java
- 一致性Hash學習
- 對一致性Hash演算法,Java程式碼實現的深入研究演算法Java
- Java教程分享:五分鐘瞭解一致性hash演算法Java演算法
- 一致性Hash的原理與實現
- 理解分散式一致性與Raft演算法分散式Raft演算法
- Hash演算法演算法
- 【轉載】對一致性Hash演算法,Java程式碼實現的深入研究演算法Java
- 深入淺出一致性Hash原理
- php memcache 一致性hash入門PHP
- Hash演算法的講解演算法
- 5分鐘理解一致性雜湊演算法演算法
- 一致性hash的c++簡單實現C++
- 一致性Hash在負載均衡中的應用負載
- 常見hash演算法的原理演算法
- hash join構建點陣圖的理解
- 深入理解HashMap(二): 關鍵原始碼逐行分析之hash演算法HashMap原始碼演算法
- 探索c#之一致性Hash詳解C#
- 閒聊 Hash 演算法演算法
- Hash join演算法原理演算法
- oracle -- Hash演算法原理Oracle演算法