分布式系統(tǒng)設(shè)計(jì)之負(fù)載均衡算法
概述
在分布式系統(tǒng)設(shè)計(jì)當(dāng)中,一般會對服務(wù)進(jìn)行集群部署,集群中的多個節(jié)點(diǎn)提供相同的服務(wù),所以可以將對該服務(wù)的請求分發(fā)給集群的任意一個節(jié)點(diǎn)來處理。為了將請求合理分發(fā)給集群的節(jié)點(diǎn)進(jìn)行處理,即既要保證集群的每個節(jié)點(diǎn)都能夠分配到請求,又能夠?qū)崿F(xiàn)不會給某個節(jié)點(diǎn)分配過多請求,導(dǎo)致超過節(jié)點(diǎn)處理能力,所以需要基于一定的規(guī)則來進(jìn)行請求分發(fā),這個規(guī)則也稱為負(fù)載均衡算法。以下詳細(xì)分析幾種常見的負(fù)載均衡算法的工作原理。
1.輪詢
輪詢算法主要是將客戶端發(fā)送到負(fù)載均衡器的請求依次輪流地轉(zhuǎn)發(fā)給服務(wù)集群的某個節(jié)點(diǎn),而不需要考慮每個集群節(jié)點(diǎn)當(dāng)前的連接數(shù)和工作負(fù)載以及該節(jié)點(diǎn)的機(jī)器性能。該算法的好處是實(shí)現(xiàn)簡單,每個集群節(jié)點(diǎn)平均分擔(dān)所有的請求,缺點(diǎn)是當(dāng)集群節(jié)點(diǎn)對應(yīng)的機(jī)器存在性能差異時,可能會出現(xiàn)性能低的機(jī)器節(jié)點(diǎn)處理請求慢,而性能好的機(jī)器節(jié)點(diǎn)則存在空閑的系統(tǒng)資源沒有充分利用,所以一般用作集群所有節(jié)點(diǎn)的機(jī)器性能接近的情況。
2.隨機(jī)
隨機(jī)算法主要是隨機(jī)選取集群中的某個節(jié)點(diǎn)來處理該請求,由概率論的知識可知,隨著請求量的變大,隨機(jī)算法會逐漸演變?yōu)檩喸兯惴ǎ醇焊鱾€節(jié)點(diǎn)會處理差不多數(shù)量的請求。所以優(yōu)缺點(diǎn)也是與輪詢算法類似。
3.加權(quán)輪詢與加權(quán)隨機(jī)
加權(quán)算法主要是根據(jù)集群的節(jié)點(diǎn)對應(yīng)機(jī)器的性能的差異,給每個節(jié)點(diǎn)設(shè)置一個權(quán)重值,其中性能好的機(jī)器節(jié)點(diǎn)設(shè)置一個較大的權(quán)重值,而性能差的機(jī)器節(jié)點(diǎn)則設(shè)置一個較小的權(quán)重值。然后可以繼續(xù)基于輪詢或者隨機(jī)的算法來選取一個節(jié)點(diǎn)來處理請求,只是權(quán)重大的節(jié)點(diǎn)能夠被更多的選中。實(shí)現(xiàn)原理類似于在一個數(shù)組中選擇一個元素,而權(quán)重值就是對應(yīng)機(jī)器節(jié)點(diǎn)在數(shù)組中重復(fù)出現(xiàn)的次數(shù),如兩個節(jié)點(diǎn){ a,b },其中a節(jié)點(diǎn)的權(quán)重值為3,b節(jié)點(diǎn)的權(quán)重值為1,則數(shù)組的組成為:[a, a, a, b],所以不管是輪詢還是隨機(jī)選取都是a選擇的次數(shù)更多。
4. 哈希與一致性哈希
哈希算法主要將對請求的IP地址或者URL計(jì)算一個哈希值,然后與集群節(jié)點(diǎn)的數(shù)量進(jìn)行取模來決定將請求分發(fā)給哪個集群節(jié)點(diǎn)。這種哈希算法實(shí)現(xiàn)簡單并且在集群節(jié)點(diǎn)數(shù)量不變的情況下,能夠?qū)⑾嗤琁P地址的請求分發(fā)給相同的機(jī)器處理。但是如果集群節(jié)點(diǎn)發(fā)生變化,則會對集群的所有節(jié)點(diǎn)進(jìn)行影響,如可能導(dǎo)致某個機(jī)器性能較低的節(jié)點(diǎn)突然接收到大量請求,從而影響集群的整體穩(wěn)定性。
一致性哈希算法主要是基于一致性哈希函數(shù)來實(shí)現(xiàn),一致性哈希函數(shù)會將給定的參數(shù)映射到由2的32次方個點(diǎn)組成的環(huán)形槽的某個槽點(diǎn)上。
在使用一致性哈希函數(shù)來進(jìn)行負(fù)載均衡時,首先將集群的多個節(jié)點(diǎn)哈希到該環(huán)形槽的對應(yīng)的某個槽點(diǎn)上,然后當(dāng)負(fù)載均衡器接收到請求時,使用該請求的IP地址或者URL來作為一致性哈希函數(shù)的參數(shù),生成該請求對應(yīng)環(huán)形槽的某個槽點(diǎn),***從順時針方向找到***個位于該環(huán)形槽的集群節(jié)點(diǎn),則將該請求轉(zhuǎn)發(fā)給這個集群節(jié)點(diǎn)處理。
由一致性哈希算法的實(shí)現(xiàn)原理可知,如果集群節(jié)點(diǎn)的個數(shù)不變,則相同IP地址或者相同URL的請求都會轉(zhuǎn)發(fā)到相同的集群節(jié)點(diǎn)來處理;如果集群節(jié)點(diǎn)數(shù)量發(fā)生變化,則只會影響該增加或者刪除的節(jié)點(diǎn)按順時針方向的后一個節(jié)點(diǎn),所以能夠很方便的實(shí)現(xiàn)集群的拓容和縮容。
5.最少連接數(shù)
最少連接數(shù)負(fù)載均衡算法是一種智能、動態(tài)的負(fù)載均衡算法,主要是根據(jù)集群的每個節(jié)點(diǎn)的當(dāng)前連接數(shù)來決定將請求轉(zhuǎn)發(fā)給哪個節(jié)點(diǎn),即每次都將請求轉(zhuǎn)發(fā)給當(dāng)前存在最少并發(fā)連接的節(jié)點(diǎn)。
這種負(fù)載均衡算法的好處是可以根據(jù)集群節(jié)點(diǎn)的負(fù)載情況來進(jìn)行請求的動態(tài)分發(fā),即機(jī)器性能好,處理請求快,積壓請求少的節(jié)點(diǎn)分配更多的請求,反之則分配更少的請求,從而實(shí)現(xiàn)集群的整體穩(wěn)定性和將請求合理分發(fā)到每一個節(jié)點(diǎn),避免某個節(jié)點(diǎn)因?yàn)樘幚沓^自身所能承受的請求量而導(dǎo)致宕機(jī)或者響應(yīng)過慢。
6.最快響應(yīng)時間
最快響應(yīng)時間負(fù)載均衡算法也是一種智能、動態(tài)的負(fù)載均衡算法,與最少連接數(shù)類似,也是根據(jù)集群節(jié)點(diǎn)的負(fù)載情況來將請求合理分發(fā)到各個節(jié)點(diǎn),實(shí)現(xiàn)集群的整體穩(wěn)定性和機(jī)器資源的重復(fù)利用。與最少連接數(shù)不同的是,最快響應(yīng)時間是基于請求與響應(yīng)的時間延遲來衡量機(jī)器的負(fù)載情況的,即將請求分發(fā)給當(dāng)前處理請求最快,負(fù)載均衡器從該節(jié)點(diǎn)獲取響應(yīng)延遲最小的節(jié)點(diǎn),而響應(yīng)時間慢的節(jié)點(diǎn)則分配更少的請求。