對一致性雜湊的理解

2021-08-27 17:35:41 字數 1997 閱讀 8107

前提準備

什麼是雜湊演算法?

以我自己的理解,雜湊演算法就是運用雜湊函式(即反映變數關係的數學公式)來解決事物之間對應關係的方法。

雜湊演算法產生的背景原因?

舉個例子來說。想象一下我們現在有100億本書(分別標記為book0~book10^10-1),卻只有1億個櫃子(分別標記為cupboard0~cupboard10^8-1)。現在要將這些書擺放到這些櫃子上,很顯然的是,如果每個櫃子上只放一本書的話,就會有剩下的99億本書還沒擺放。因此,必然有一些櫃子上擺放的書超過了一本,即乙個櫃子上有多本書,這就產生了在雜湊演算法中稱為「衝突」的現象。顯然,在這種書多櫃少的情況下,衝突是不可避免的。我們要做的就是,將這些書合理的分配到各個櫃子上,即規劃好書本和櫃子的對應關係(哪本書對應哪個櫃子)。而這種規劃就是所謂的雜湊演算法,找出書本和櫃子的對應關係(用雜湊函式來表示)。在這個例子中,我們比較容易想到的雜湊演算法就是:每個櫃子放100本書,將book0~book99放到cupboard0中,將book100~book199放到cupboard1中,依次類推,剛好這100億本書可以放到這1億個櫃子中。而這種對應關係用雜湊函式來表示就是:櫃子序號=書本序號/100 (求整運算),運用這種關係,我們很容易就能知道哪本書放在哪個櫃子中,方便快速。

評價雜湊演算法的好壞

當然上面這個例子的雜湊函式看起來還是挺不錯的,因為書本能比較均衡地放在各個櫃子上。但將這個雜湊函式改為:櫃子序號=書本序號/10000,這樣的話1個櫃子上就擺放了10000本書,這樣就只需要10^6個櫃子就夠了,還有10^8-10^6個櫃子沒有用到(相當於只用到了櫃子資源的10^6/10^8=1%),這大大的浪費了櫃子資源,使得書本資源過於集中在少數櫃子資源上,增加了單個櫃子的負載。因此乙個良好的雜湊函式要做到負載均衡。

一致性雜湊

經過上面的準備,下面就可以進入正題了。

什麼是一致性雜湊?

其實也就是一種雜湊演算法,只是它著重考慮到了容錯性和擴充套件性的一些問題。下面從它產生的背景來分析就會容易理解了。

一致性雜湊產生的背景原因?

就如上面舉的關於書本和櫃子的例子。網際網路世界也存在類似的現象。只需將書本換為客戶端(可以看作是我們的電腦或手機開啟的網頁瀏覽器),將櫃子換為伺服器(可以看作是web伺服器)。數量和上面的例子一樣,客戶端是100億,伺服器端是1億。實際上,客戶端和伺服器也是有標記的,那就是帶有唯一性的ip號(類似於我們的身份證號碼)。同樣的,由於客戶端多、伺服器少,有的單個伺服器肯定要服務於多個客戶端。那麼我們就需要乙個雜湊函式來分配他們之間的對應關係(哪個客戶端去訪問哪個伺服器)。如果按照像上面例子一樣的雜湊函式(當然ipv4協議的ip號是由4個位元組組成的,最多表示2^32個ip位址,對ip位址的使用也有相應的限制,不同於上面的例子,但這裡只是用來幫助理解,所以也無妨),ip號為0的伺服器對應於ip號為0~99的客戶端,ip號為1的伺服器對應於ip號為100~199的客戶端,依次類推。

現在容錯性的問題來了。那麼多伺服器,總會有部分伺服器由於各種原因崩潰掉,假設崩潰的是ip號為1的伺服器,那麼ip號為100~199的客戶端將無法訪問該伺服器。更何況一億台伺服器,掛掉的肯定不止這麼一兩個,那麼將會有許多使用者將不能通過客戶端訪問到伺服器。因此,怎樣處理這些掛掉的伺服器,怎樣讓這些不能連線上伺服器的客戶端能重新連上伺服器就成了要解決的問題。這也就一致性雜湊所強調的單調性。網上很多資料提到同一種方法,我也就簡單的介紹一下這種方法。通過將客戶端的ip號和伺服器的ip號對映到同乙個環形hash空間中,然後順時針將客戶端對應到相鄰的伺服器,如圖所示:

客戶端5將連線到順時針與其相鄰的伺服器0,客戶端155連線到伺服器1,客戶端370,350連線到伺服器4。如果此時伺服器0掛掉了,那麼客戶端將連線到下乙個存活的伺服器1。這樣保證了整個系統的容錯性。

由於伺服器的key值在伺服器1和伺服器4的key值之間,因此客戶端350將連線到伺服器x,其他的連線將保持不變。這保證了系統的擴充套件性。

一致性雜湊的理解

一致性雜湊 consistent hashing 首先,讓我們了解一下一致性雜湊解決了怎樣的實際問題,當我們有了n臺伺服器 cache 時,我們通常會採用如下的通用演算法 將物件 object 均勻對映分配到伺服器上,hash object n 試想一下,當其中的一台伺服器down機了,或是添置一台...

一致性雜湊的理解

參考 先說結論 一致性雜湊也是雜湊演算法的一種,只是為了解決普通雜湊因為節點的變動導致資料遷移過大的問題。其核心思想是將位址空間看做乙個環狀結構,將節點進行雜湊,使節點盡可能均勻的散落在環上。同時將資料進行雜湊,也將資料均勻的散落在環上,最後,將資料全都放置在離資料順時針方向 因為是混裝結構,順時針...

一致性雜湊

直接貼出一篇介紹的很清楚的博文。關鍵字一致性雜湊 平衡性,單調性,分散性,負載 其實說白了,就是解決把請求分散到不同的機器上運算,怎麼做分散的平均,機器少一台多一台,或者壞掉一台,成很好的自適應和拓展。最簡單的實現分布式演算法,取模嘛,但是它就上述的一些問題,所以不算好的雜湊函式。一致性雜湊演算法,...