一致性哈希解决的问题
假設,我們有三臺緩存服務器,用于緩存圖片,我們?yōu)檫@三臺緩存服務器編號為0號、1號、2號,現(xiàn)在,有3萬張圖片需要緩存,我們希望這些圖片緩存到這3臺服務器上,以便它們能夠分攤緩存的壓力。做法是對緩存項的鍵進行哈希,將hash后的結(jié)果對緩存服務器的數(shù)量進行取模操作,通過取模后的結(jié)果,決定緩存項將會緩存在哪一臺服務器上,這樣說可能不太容易理解,我們舉例說明,仍然以剛才描述的場景為例,假設我們使用圖片名稱作為訪問圖片的key,假設圖片名稱是不重復的,那么,我們可以使用如下公式,計算出圖片應該存放在哪臺服務器上。
hash(圖片名稱)% N
因為圖片的名稱是不重復的,所以,當我們對同一個圖片名稱做相同的哈希計算時,得出的結(jié)果應該是不變的,如果我們有3臺服務器,使用哈希后的結(jié)果對3求余,那么余數(shù)一定是0、1或者2,沒錯,正好與我們之前的服務器編號相同,如果求余的結(jié)果為0, 我們就把當前圖片名稱對應的圖片緩存在0號服務器上,如果余數(shù)為1,就把當前圖片名對應的圖片緩存在1號服務器上,如果余數(shù)為2,同理,那么,當我們訪問任意一個圖片的時候,只要再次對圖片名稱進行上述運算,即可得出對應的圖片應該存放在哪一臺緩存服務器上,我們只要在這一臺服務器上查找圖片即可,如果圖片在對應的服務器上不存在,則證明對應的圖片沒有被緩存,也不用再去遍歷其他緩存服務器了,通過這樣的方法,即可將3萬張圖片隨機的分布到3臺緩存服務器上了,而且下次訪問某張圖片時,直接能夠判斷出該圖片應該存在于哪臺緩存服務器上,這樣就能滿足我們的需求了。
但是,使用上述HASH算法進行緩存時,會出現(xiàn)一些缺陷,試想一下,如果3臺緩存服務器已經(jīng)不能滿足我們的緩存需求,那么我們應該怎么做呢?沒錯,很簡單,多增加兩臺緩存服務器不就行了,假設,我們增加了一臺緩存服務器,那么緩存服務器的數(shù)量就由3臺變成了4臺,此時,如果仍然使用上述方法對同一張圖片進行緩存,那么這張圖片所在的服務器編號必定與原來3臺服務器時所在的服務器編號不同,因為除數(shù)由3變?yōu)榱?,被除數(shù)不變的情況下,余數(shù)肯定不同,這種情況帶來的結(jié)果就是當服務器數(shù)量變動時,所有緩存的位置都要發(fā)生改變,換句話說,當服務器數(shù)量發(fā)生改變時,所有緩存在一定時間內(nèi)是失效的,當應用無法從緩存中獲取數(shù)據(jù)時,則會向后端服務器請求數(shù)據(jù),同理,假設3臺緩存中突然有一臺緩存服務器出現(xiàn)了故障,無法進行緩存,那么我們則需要將故障機器移除,但是如果移除了一臺緩存服務器,那么緩存服務器數(shù)量從3臺變?yōu)?臺,如果想要訪問一張圖片,這張圖片的緩存位置必定會發(fā)生改變,以前緩存的圖片也會失去緩存的作用與意義,由于大量緩存在同一時間失效,造成了緩存的雪崩,此時前端緩存已經(jīng)無法起到承擔部分壓力的作用,后端服務器將會承受巨大的壓力,整個系統(tǒng)很有可能被壓垮,所以,我們應該想辦法不讓這種情況發(fā)生,但是由于上述HASH算法本身的緣故,使用取模法進行緩存時,這種情況是無法避免的,為了解決這些問題,一致性哈希算法誕生了。
一致性哈希的原理:
https://www.zsythink.net/archives/1182/
總結(jié)
以上是生活随笔為你收集整理的一致性哈希解决的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cuda矩阵相乘_cuda初学(1):稀
- 下一篇: matplotlib的colorbar设