欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一致性哈希算法以及其PHP實現(xiàn)詳細(xì)解析

 更新時間:2013年08月24日 09:39:41   作者:  
以下是對用PHP實現(xiàn)一致性哈希算法進行了詳細(xì)的介紹,需要的朋友可以過來參考下

在做服務(wù)器負(fù)載均衡時候可供選擇的負(fù)載均衡的算法有很多,包括:  輪循算法(Round Robin)、哈希算法(HASH)、最少連接算法(Least Connection)、響應(yīng)速度算法(Response Time)、加權(quán)法(Weighted )等。其中哈希算法是最為常用的算法.

典型的應(yīng)用場景是: 有N臺服務(wù)器提供緩存服務(wù),需要對服務(wù)器進行負(fù)載均衡,將請求平均分發(fā)到每臺服務(wù)器上,每臺機器負(fù)責(zé)1/N的服務(wù)。

常用的算法是對hash結(jié)果取余數(shù) (hash() mod N):對機器編號從0到N-1,按照自定義的hash()算法,對每個請求的hash()值按N取模,得到余數(shù)i,然后將請求分發(fā)到編號為i的機器。但這樣的算法方法存在致命問題,如果某一臺機器宕機,那么應(yīng)該落在該機器的請求就無法得到正確的處理,這時需要將當(dāng)?shù)舻姆?wù)器從算法從去除,此時候會有(N-1)/N的服務(wù)器的緩存數(shù)據(jù)需要重新進行計算;如果新增一臺機器,會有N /(N+1)的服務(wù)器的緩存數(shù)據(jù)需要進行重新計算。對于系統(tǒng)而言,這通常是不可接受的顛簸(因為這意味著大量緩存的失效或者數(shù)據(jù)需要轉(zhuǎn)移)。那么,如何設(shè)計一個負(fù)載均衡策略,使得受到影響的請求盡可能的少呢?

在Memcached、Key-Value Store、Bittorrent DHT、LVS中都采用了Consistent Hashing算法,可以說Consistent Hashing 是分布式系統(tǒng)負(fù)載均衡的首選算法。

1、Consistent Hashing算法描述

下面以Memcached中的Consisten Hashing算法為例說明。
由于hash算法結(jié)果一般為unsigned int型,因此對于hash函數(shù)的結(jié)果應(yīng)該均勻分布在[0,232-1]間,如果我們把一個圓環(huán)用232 個點來進行均勻切割,首先按照hash(key)函數(shù)算出服務(wù)器(節(jié)點)的哈希值, 并將其分布到0~232的圓上。

用同樣的hash(key)函數(shù)求出需要存儲數(shù)據(jù)的鍵的哈希值,并映射到圓上。然后從數(shù)據(jù)映射到的位置開始順時針查找,將數(shù)據(jù)保存到找到的第一個服務(wù)器(節(jié)點)上。

 Consistent Hashing原理示意圖

新增一個節(jié)點的時候,只有在圓環(huán)上新增節(jié)點逆時針方向的第一個節(jié)點的數(shù)據(jù)會受到影響。刪除一個節(jié)點的時候,只有在圓環(huán)上原來刪除節(jié)點順時針方向的第一個節(jié)點的數(shù)據(jù)會受到影響,因此通過Consistent Hashing很好地解決了負(fù)載均衡中由于新增節(jié)點、刪除節(jié)點引起的hash值顛簸問題。

 Consistent Hashing添加服務(wù)器示意圖

虛擬節(jié)點(virtual nodes):之所以要引進虛擬節(jié)點是因為在服務(wù)器(節(jié)點)數(shù)較少的情況下(例如只有3臺服務(wù)器),通過hash(key)算出節(jié)點的哈希值在圓環(huán)上并不是均勻分布的(稀疏的),仍然會出現(xiàn)各節(jié)點負(fù)載不均衡的問題。虛擬節(jié)點可以認(rèn)為是實際節(jié)點的復(fù)制品(replicas),本質(zhì)上與實際節(jié)點實際上是一樣的(key并不相同)。引入虛擬節(jié)點后,通過將每個實際的服務(wù)器(節(jié)點)數(shù)按照一定的比例(例如200倍)擴大后并計算其hash(key)值以均勻分布到圓環(huán)上。在進行負(fù)載均衡時候,落到虛擬節(jié)點的哈希值實際就落到了實際的節(jié)點上。由于所有的實際節(jié)點是按照相同的比例復(fù)制成虛擬節(jié)點的,因此解決了節(jié)點數(shù)較少的情況下哈希值在圓環(huán)上均勻分布的問題。

 

虛擬節(jié)點對Consistent Hashing結(jié)果的影響

從上圖可以看出,在節(jié)點數(shù)為10個的情況下,每個實際節(jié)點的虛擬節(jié)點數(shù)為實際節(jié)點的100-200倍的時候,結(jié)果還是很均衡的。

第3段中有這些文字:“但這樣的算法方法存在致命問題,如果某一臺機器宕機,那么應(yīng)該落在該機器的請求就無法得到正確的處理,這時需要將當(dāng)?shù)舻姆?wù)器從算法從去除,此時候會有(N-1)/N的服務(wù)器的緩存數(shù)據(jù)需要重新進行計算;”

為何是 (N-1)/N 呢?解釋如下:

比如有 3 臺機器,hash值 1-6 在這3臺上的分布就是:
host 1: 1 4
host 2: 2 5
host 3: 3 6
如果掛掉一臺,只剩兩臺,模數(shù)取 2 ,那么分布情況就變成:
host 1: 1 3 5
host 2: 2 4 6

可以看到,還在數(shù)據(jù)位置不變的只有2個: 1,2,位置發(fā)生改變的有4個,占共6個數(shù)據(jù)的比率是 4/6 = 2/3這樣的話,受影響的數(shù)據(jù)太多了,勢必太多的數(shù)據(jù)需要重新從 DB 加載到 cache 中,嚴(yán)重影響性能

【consistent hashing 的辦法】
上面提到的 hash 取模,模數(shù)取的比較小,一般是負(fù)載的數(shù)量,而 consistent hashing 的本質(zhì)是將模數(shù)取的比較大,為 2的32次方減1,即一個最大的 32 位整數(shù)。然后,就可以從容的安排數(shù)據(jù)導(dǎo)向了,那個圖還是挺直觀的。
以下部分為一致性哈希算法的一種PHP實現(xiàn)。點擊下載

相關(guān)文章

  • 利用PHP計算有多少小于當(dāng)前數(shù)字的數(shù)字方法示例

    利用PHP計算有多少小于當(dāng)前數(shù)字的數(shù)字方法示例

    這篇文章主要給大家介紹了關(guān)于利用PHP計算有多少小于當(dāng)前數(shù)字的數(shù)字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 字母順序顛倒而單詞順序不變的php代碼

    字母順序顛倒而單詞順序不變的php代碼

    一個英文語句怎樣把它的每個單詞的字母順序顛倒而單詞順序不變?
    2010-08-08
  • php計算兩個整數(shù)的最大公約數(shù)常用算法小結(jié)

    php計算兩個整數(shù)的最大公約數(shù)常用算法小結(jié)

    這篇文章主要介紹了php計算兩個整數(shù)的最大公約數(shù)常用算法,實例總結(jié)了求最大公約數(shù)的三種常用方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 使用PHP實現(xiàn)生成HTML靜態(tài)頁面

    使用PHP實現(xiàn)生成HTML靜態(tài)頁面

    在PHP網(wǎng)站開發(fā)中為了網(wǎng)站推廣和SEO等需要,需要對網(wǎng)站進行全站或局部靜態(tài)化處理,PHP生成靜態(tài)HTML頁面有多種方法,比如利用PHP模板、緩存等實現(xiàn)頁面靜態(tài)化,今天就以PHP實例教程形式討論PHP生成靜態(tài)頁面的方法。
    2015-11-11
  • php相當(dāng)簡單的分頁類

    php相當(dāng)簡單的分頁類

    代碼比較簡單,學(xué)習(xí)php類的朋友,可以看下
    2008-10-10
  • PHP使用flock實現(xiàn)文件加鎖的方法

    PHP使用flock實現(xiàn)文件加鎖的方法

    這篇文章主要介紹了PHP使用flock實現(xiàn)文件加鎖的方法,實例分析了flock文件鎖的使用技巧,需要的朋友可以參考下
    2015-07-07
  • PHP判斷變量是否為0的方法

    PHP判斷變量是否為0的方法

    這篇文章主要介紹了PHP判斷變量是否為0的方法,需要的朋友可以參考下
    2014-02-02
  • PHP中實現(xiàn)中文字符進制轉(zhuǎn)換原理分析

    PHP中實現(xiàn)中文字符進制轉(zhuǎn)換原理分析

    中文字符編碼研究系列第四期,PHP實現(xiàn)中文字符進制轉(zhuǎn)換原理分析,主要討論中文漢字轉(zhuǎn)換為十進制和十六進制的方法,并掌握轉(zhuǎn)換原理應(yīng)用于實際開發(fā)。本文以GBK編碼字符為例,討論GBK編碼的字符轉(zhuǎn)換原理
    2011-12-12
  • php知道與問問的采集插件代碼

    php知道與問問的采集插件代碼

    看過一個百度小偷的網(wǎng)站也達到了pr6。收錄十萬多!! 在經(jīng)過 薦禮啦 四十天的實踐之后 發(fā)現(xiàn)百度對這個確實挺友好的。
    2010-10-10
  • PHP 實現(xiàn)多服務(wù)器共享 SESSION 數(shù)據(jù)

    PHP 實現(xiàn)多服務(wù)器共享 SESSION 數(shù)據(jù)

    稍大一些的網(wǎng)站,通常都會有好幾個服務(wù)器,每個服務(wù)器運行著不同功能的模塊,使用不同的二級域名,而一個整體性強的網(wǎng)站,用戶系統(tǒng)是統(tǒng)一的,即一套用戶名、密碼在整個網(wǎng)站的各個模塊中都是可以登錄使用的。
    2009-08-08

最新評論