看到一遍介紹consistent hashing 的文章,通俗易懂,特記錄
** 事情由來
常用的負載均衡演算法
在做伺服器負載均衡時候可供選擇的負載均衡的演算法有很多,包括:輪循演算法(round robin)、雜湊演算法(hash)、最少連線演算法(least- connection)、響應速度演算法(response time)、加權法(weighted )等。其中雜湊演算法是最為常用的演算法。那麼,如果換做是你,當乙個資料需要存入redis中,你會怎麼選擇儲存的redis?這裡我們假設有四台redis1,redis2,redis3,redis4。
1.hashresult = hash();//這裡hash演算法是你自定義演算法,總之會得出乙個unsigned int型的資料
2.hashresult % 4 = 1;//假如餘數為1,
好,當前這個要儲存的資料存放在第一台redis中。以此類推,把所有的資料分別進行hash和取模,存放到餘數的redis中。這樣的方法會有乙個致命的問題,當四台redis的其中一台redis1宕機(down了),那麼存放在這台redis1中的資料就丟失了,相當於有 (n-1)/ n,即 3/4 臺的資料需要重新計算存放位置。這對系統是致命的打擊。那麼怎麼能合理存放資料,並且能夠任意的增加或刪除redis機器呢?答案是一致性hash.
一致性hash介紹
關於一致性hash的介紹,網上有很多,大家自行google即可。這裡我簡單的盜圖說明一下,哈哈哈。省事!
由於hash演算法結果一般為unsigned
int型,
因此對於hash函式的結果應該均勻分布在[0,2
32-1]間
,如果我們把乙個圓環用2
32
個點來進行均勻切割
,首先按照hash(key)函式算出伺服器(節點)的雜湊值,
並將其分布到0~2
32的圓上。用同樣的hash(key)函式求出需要儲存資料的鍵的雜湊值,並映
射到圓上。然後從資料對映到的位置開始順時針查詢,將資料儲存到找到的第乙個伺服器(節點)上。如下
新增乙個redis節點的時候,只有在圓環上新增節點逆時針方向的第乙個redis節點的資料會受到影響。刪除乙個redis節點的時候,只有在圓環上原來刪除
節點順時針方
向的第乙個節點的資料會受到影響,因此通過consistent
hashing很好地解決了負載均衡中由於新增節點、刪除節點引起的hash值顛簸問題
。如下圖:
學習困惑
1.為什麼hash演算法結果會分布在1-2^32 -1的範圍呢?
2.那一般企業redis大多不超過十臺,因此每台redis之間的環的角度可能出現不平衡性(例如redis1占用了一半圓,其餘的redis來分剩餘一半圓環),所以當資料量較大的時候,運用一致性hash還是會出現資料分布不均勻的情況,從而破壞了hasn演算法的ping。怎麼辦?
這裡引入虛擬節點的概念:虛擬節點可以認為是實際節點的複製品(replicas),其實就是redis1又生了很多個孩子redis1-1,redis1-2,這樣redis1家族通過hash算出來的位置會均勻的分布在圓環中各個位置。在進行負載均衡時候,落到虛擬節點的雜湊值實際就落到了實際的節點上。由於所有的實際節點是按照相同的比例複製成虛擬節點的,因此解決了節點數較少的情況下雜湊值在圓環上均勻分布的問題。
3.我們運用一致性hash的演算法的最終目的是幹什麼?
簡單的說,是用來取出乙個節點。這個節點用來存放或者讀取你想要存放或者讀取的資料。
參考
了解一致性hash演算法
一致性hash演算法,在維基百科的定義是 翻譯過來的意思就是當hash表更新節點的數量時,只有k n的關鍵字位置有變化,其他關鍵字的位置對映關係不變。與其他的hash演算法比,其他的演算法節點個數n變化後,更多的key關鍵字和節點的對映會發生變化。一致性hash主要用在路由中,對有狀態的服務,根據k...
了解一致性hash演算法
一致性hash演算法,在維基百科的定義是 翻譯過來的意思就是當hash表更新節點的數量時,只有k n的關鍵字位置有變化,其他關鍵字的位置對映關係不變。與其他的hash演算法比,其他的演算法節點個數n變化後,更多的key關鍵字和節點的對映會發生變化。一致性hash主要用在路由中,對有狀態的服務,根據k...
一致性hash演算法 面試必備 一致性hash演算法
最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...