負載均衡一致性hash演算法一點總結

2021-08-26 20:35:55 字數 1202 閱讀 4841

參考:這篇寫的非常通俗易懂

大意:利用乙個環形的hash空間selectors(雜湊範圍0~(2^32)-1,實際上底層是乙個concurrentmap),按照hash演算法將乙個key雜湊到指定的位置。物件(o1,o2,o3)的雜湊與機器(node1,node2,node3)的雜湊演算法是一樣的。

形成過程:

1)考慮負載均衡演算法的一致性和分散性:o1,o2,o3順時針地去找離自己最近距離的機器位置。這樣的設

計就保證了機器的動態上下線後,僅有少量的資料需要遷移

2)考慮負載均衡演算法的平衡性:1)的方式會造成雜湊的不均衡,原本儲存在掛掉的機子上的資料都遷

移到了後一台機子上,造成了不平衡的結果。改進的做法是加入許多個「虛擬節點」,看做是機器的復

制點,虛擬節點在selectors上按照hash值排列,這樣就能相對平衡的平攤

一點總結:

1)虛擬節點的總數是一定的(預設160),虛擬節點的雜湊位置是根據  hash(機器ip+數字字尾)的方

式,假設node1的ip為192.168.1.100,根據設定的虛擬節點複製個數,比如2,那就分別對映到hash

(192.168.1.100#1)與hash(192.168.1.100#2)

2)一致性hash演算法能夠減少資料的遷移量,能夠使相同引數的請求總是被發到同一機器上

聯想:1)聯想到redis也可以使用一致性hash演算法來搭建集群。好處是,將資料平攤到各個機器了,某台機器宕機之後,所有的關聯「虛擬節點」都會消失,新新增的資料會順時針儲存到下乙個最近距離的機器中去,老的資料會被刪除,重新查詢該資料要到資料庫中去查,這個去資料庫中查的操作會比原先的hash演算法少很多!!;

為1)舉個例子,複製自haozi_ncepu有5臺伺服器,編號分別是0(a),1(b),2(c),3(d),4(e)  ,正常情況下,假設使用者資料hash值為12,那麼對應的資料應該快取在12%5=2號伺服器上,假設編號為3的伺服器此時掛掉,那麼將其移除後就得到乙個新的0(a),1(b),2(c),3(e)(注:這裡的編號3其實就是原來的4號伺服器)伺服器列表,此時使用者來取資料,同樣hash值為12,rehash後的得到的機器編號12%4=0號伺服器,可見,此時使用者到0號伺服器去找資料明顯就找不到,出現了cache不命中現象,如果不命中此時應用會從後台資料庫重新讀取資料再cache到0號伺服器上,如果大量使用者出現這種情況,那麼後果不堪設想。同樣,增加一台快取伺服器,也會導致同樣的後果。

2)資料庫的分庫分表也可以用一致性hash去做

一致性hash演算法 負載均衡

有沒有好奇過redis memcache等是怎麼實現集群負載均衡的呢?其實他們都是通過一致性hash演算法實現節點排程的。講一致性hash演算法前,先簡述一下求餘hash演算法 hash object n乙個快取伺服器宕機了,這樣所有對映到這台伺服器的物件都會失效,我們需要把屬於該伺服器中的快取移除...

一致性hash演算法 面試必備 一致性hash演算法

最近公司在招人,我們準備的問題中有一道是關於一致性hash演算法的問題,只有一些面試者能夠回答上來,而且答的也不是很全面,有的面試者只是聽說過,有的連聽都沒聽過,下面我把一致性hash演算法整理一下分享給大家 一致性雜湊演算法在1997年由麻省理工學院的karger等人在解決分布式cache中提出的...

一致性hash演算法虛擬節點 一致性hash演算法

hash 演算法也叫做雜湊演算法,他可以讓任意長度的資料m對映成為長度固定的值h。hash演算法的第乙個作用就是資料的快速儲存與查詢。寫過程式的人都知道,基本上主流的程式語言裡面都有個資料結構叫做map dictionary或者 hash table 它是根據key來直接訪問結果的資料結構。key的...