什么是負載均衡?
先舉個例子吧。以超市收銀為例,假設現在只有一個窗口、一個收銀員:
一般情況下,收銀員平均 2 分鍾服務一位顧客,10 分鍾可以服務 5 位顧客;
到周末高峰期時,收銀員加快收銀,平均 1 分鍾服務一位顧客,10 分鍾最多服務 10 位顧客,也就是說一個顧客最多等待 10 分鍾;
逢年過節,顧客數量激增,一下增加到 30 位顧客,如果仍然只有一個窗口和一個收銀員,那么所有顧客就只能排隊等候了,一個顧客最多需要等待 30 分鍾。這樣購物體驗,就非常差了。
那有沒有解決辦法呢?
當然有。那就是新開一個收銀窗口,每個收銀窗口服務 15 個顧客,這樣最長等待時間從30 分鍾縮短到 15 分鍾。但如果,這兩個窗口的排隊顧客數嚴重不均衡,比如一個窗口有5 個顧客排隊,另一個窗口卻有 25 個顧客排隊,就不能最大化地提升顧客的購物體驗。
所以,盡可能使得每個收銀窗口排隊的顧客一樣多,才能最大程度地減少顧客的最長排隊時間,提高用戶體驗。
看完這個例子,你是不是想到了一句話“不患寡,而患不均”?這,其實就是負載均衡的基本原理。
通常情況下,負載均衡可以分為兩種:
一種是請求負載均衡,即將用戶的請求均衡地分發到不同的服務器進行處理;
另一種是數據負載均衡,即將用戶更新的數據分發到不同的存儲服務器。
分布式系統中,服務請求的負載均衡是指,當處理大量用戶請求時,請求應盡量均衡地分配到多台服務器進行處理,每台服務器處理其中一部分而不是所有的用戶請求,以完成高並發的請求處理,避免因單機處理能力的上限,導致系統崩潰而無法提供服務的問題。
比如,有 N 個請求、M 個節點,負載均衡就是將 N 個請求,均衡地轉發到這 M 個節點進行處理。
服務請求的負載均衡方法
通常情況下,計算機領域中,在不同層有不同的負載均衡方法。比如,從網絡層的角度,通常有基於 DNS、IP 報文等的負載均衡方法;在中間件層(也就是我們專欄主要講的分布式系統層),常見的負載均衡策略主要包括輪詢策略、隨機策略、哈希和一致性哈希等策略。今天,我着重與你分析的就是,中間件層所涉及的負載均衡策略。
A.輪詢策略
輪詢策略是一種實現簡單,卻很常用的負載均衡策略,核心思想是服務器輪流處理用戶請求,以盡可能使每個服務器處理的請求數相同。生活中也有很多類似的場景,比如,學校宿舍里,學生每周輪流打掃衛生,就是一個典型的輪詢策略。
在負載均衡領域中,輪詢策略主要包括順序輪詢和加權輪詢兩種方式。
首先,我們一起看看順序輪詢。假設有 6 個請求,編號為請求 1~6,有 3 台服務器可以處理請求,編號為服務器 1~3,如果采用順序輪詢策略,則會按照服務器 1、2、3 的順序輪流進行請求。
如表所示,將 6 個請求當成 6 個步驟:
- 請求 1 由服務器 1 處理;
- 請求 2 由服務器 2 進行處理。
- 以此類推,直到處理完這 6 個請求。