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