最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

1、Consistent Hashing算法描述

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

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

 Consistent Hashing原理示意圖

新增一個(gè)節(jié)點(diǎn)的時(shí)候,只有在圓環(huán)上新增節(jié)點(diǎn)逆時(shí)針?lè)较虻牡谝粋€(gè)節(jié)點(diǎn)的數(shù)據(jù)會(huì)受到影響。刪除一個(gè)節(jié)點(diǎn)的時(shí)候,只有在圓環(huán)上原來(lái)刪除節(jié)點(diǎn)順時(shí)針?lè)较虻牡谝粋€(gè)節(jié)點(diǎn)的數(shù)據(jù)會(huì)受到影響,因此通過(guò)Consistent Hashing很好地解決了負(fù)載均衡中由于新增節(jié)點(diǎn)、刪除節(jié)點(diǎn)引起的hash值顛簸問(wèn)題。

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

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

 

虛擬節(jié)點(diǎn)對(duì)Consistent Hashing結(jié)果的影響

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

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

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

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

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

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

相關(guān)文章

  • PHP實(shí)現(xiàn)動(dòng)態(tài)獲取函數(shù)參數(shù)的方法示例

    PHP實(shí)現(xiàn)動(dòng)態(tài)獲取函數(shù)參數(shù)的方法示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)動(dòng)態(tài)獲取函數(shù)參數(shù)的方法,結(jié)合實(shí)例形式分析了php針對(duì)函數(shù)參數(shù)操作func_num_args()、func_get_arg()及func_get_args()函數(shù)相關(guān)使用技巧,需要的朋友可以參考下
    2018-04-04
  • php 多個(gè)變量指向同一個(gè)引用($b = &$a)用法分析

    php 多個(gè)變量指向同一個(gè)引用($b = &$a)用法分析

    這篇文章主要介紹了php 多個(gè)變量指向同一個(gè)引用($b = &$a)用法,結(jié)合實(shí)例形式分析了PHP變量引用原理、優(yōu)缺點(diǎn)及相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • PhpStorm配置debug環(huán)境的詳細(xì)過(guò)程

    PhpStorm配置debug環(huán)境的詳細(xì)過(guò)程

    在開(kāi)發(fā)php項(xiàng)目的時(shí)候,有時(shí)候不知道明確的錯(cuò)誤在哪里,想要用java或者c#那樣能夠開(kāi)啟debug斷點(diǎn)分步調(diào)試,下面這篇文章主要給大家介紹了關(guān)于PhpStorm配置debug環(huán)境的詳細(xì)過(guò)程,需要的朋友可以參考下
    2023-01-01
  • php中使用array_filter()函數(shù)過(guò)濾數(shù)組實(shí)例講解

    php中使用array_filter()函數(shù)過(guò)濾數(shù)組實(shí)例講解

    在本篇文章里小編給大家分享的是一篇關(guān)于php中使用array_filter()函數(shù)過(guò)濾數(shù)組實(shí)例講解,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • PHP 利用Mail_MimeDecode類提取郵件信息示例

    PHP 利用Mail_MimeDecode類提取郵件信息示例

    重點(diǎn)為one_mail函數(shù)。利用Mail_mimeDecode類從郵件中提取郵件頭和郵件正文,具體實(shí)現(xiàn)如下
    2014-01-01
  • PHP關(guān)聯(lián)鏈接常用代碼

    PHP關(guān)聯(lián)鏈接常用代碼

    為了優(yōu)化內(nèi)鏈,我們需要將內(nèi)容添加上關(guān)鍵鏈接,那內(nèi)容如果添加關(guān)聯(lián)鏈接呢,怎么添加呢
    2012-11-11
  • php基礎(chǔ)字符串與數(shù)組知識(shí)點(diǎn)講解

    php基礎(chǔ)字符串與數(shù)組知識(shí)點(diǎn)講解

    通過(guò)老師的授課,發(fā)現(xiàn)JS的字符串與數(shù)組的操作與PHP的非常類似,可以相互借鑒學(xué)習(xí),一方面是可以快速理解函數(shù)用法,另一個(gè)是相互印證相互提高了
    2022-11-11
  • PHP翻頁(yè)跳轉(zhuǎn)功能實(shí)現(xiàn)方法

    PHP翻頁(yè)跳轉(zhuǎn)功能實(shí)現(xiàn)方法

    這篇文章主要介紹了PHP翻頁(yè)跳轉(zhuǎn)功能實(shí)現(xiàn)方法,下面就來(lái)介紹一下如何實(shí)現(xiàn)當(dāng)前頁(yè)面數(shù)據(jù)資料顯示數(shù)量及如何實(shí)現(xiàn)動(dòng)態(tài)的翻轉(zhuǎn)功能,需要的朋友可以參考下
    2015-11-11
  • php簡(jiǎn)單日歷函數(shù)

    php簡(jiǎn)單日歷函數(shù)

    這篇文章主要介紹了php簡(jiǎn)單日歷函數(shù),沒(méi)有選擇比較常見(jiàn)的用js生成的日歷,而是用php輸出了一個(gè)日歷表格,感興趣的小伙伴們可以參考一下
    2015-10-10
  • php實(shí)現(xiàn)singleton()單例模式實(shí)例

    php實(shí)現(xiàn)singleton()單例模式實(shí)例

    這篇文章主要介紹了php實(shí)現(xiàn)singleton()單例模式的方法,以實(shí)例形式簡(jiǎn)單講述了單例模式的實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下
    2014-11-11

最新評(píng)論

柞水县| 克东县| 扬州市| 禄劝| 洛阳市| 贡觉县| 栾川县| 长沙县| 土默特左旗| 定南县| 延川县| 九台市| 台州市| 海安县| 通山县| 临武县| 马龙县| 曲松县| 新和县| SHOW| 黄浦区| 洪江市| 布拖县| 外汇| 交城县| 松桃| 敦煌市| 青神县| 定安县| 桂林市| 清新县| 昭平县| 景宁| 通海县| 罗城| 新安县| 旬邑县| 乐陵市| 甘南县| 黄梅县| 汽车|