在電腦系統的術語裡,所謂的「負載平衡(Load Balancing)」,通常是指當利用多個計算資源來共同負擔計算所需的資源時,基於不同的目的和需求,透過特定的方式,來控制在不同計算資源上的負載量,進而達到最佳化系統的目的。

例如,系統可能會利用多個Web伺服器,來同時承接來自於外界的連線請求,藉以提供更大的服務能力;或者利用多個對外的網路,來得到更多對外的連線頻寬;也有可能透過合併多部電腦上的檔案系統,來得到更多的檔案儲存空間。

將工作或任務,以最佳方式分派到眾多的計算資源上
這種利用「分散式(Distributed)」的架構,透過組合多個個別的計算資源而成為一個更大的計算資源的方式,都會面臨到一個共通的課題,即是應該如何分配對諸多計算資源的使用。一個最常見到的需求,便是希望將使用量「平均」分散到所有的計算資源上,因為「平均的分配」是善用資源的最佳方式。

倘若有特定的資源被過度集中的使用,甚至飽和,那通常意謂著有一些資源的使用率不夠高,那麼就有可能導致整體的使用率受到限制,無法達到資源總和的量。

因此,避免分散式資源中特定的部份過載,是許多負載平衡系統的主要目標。

簡單來說,負載平衡系統可以說是一種工作或任務的分派系統,因為它的作用其實是將工作或任務分派到眾多的計算資源上,只不過它在分派的同時,有一些想要最佳化的目標。

有一種負載平衡系統設計的方式,是嘗試將相關的使用請求或工作任務,平均分配到系統中的每個資源上。

例如,我們很常看到系統中有多個Web伺服器,協力合作來處理系統中所有的Web請求,而所用的負載平衡機制,便是很簡單的DNS輪詢(round-robin)的方式。

透過設定同一個域名有多個對應的實體IP位址,那麼便可以利用DNS服務天生的機制,來達到負載平衡,當客戶端嘗試對此域名做連線時,便會查詢該域名對應的IP位址,而DNS服務的機制,便會依序回傳所設定的不同實體IP位址,這麼一來,不同的客戶端就會被導到不同的Web伺服器去,進而平衡不同Web伺服器的負載。

就DNS的輪詢機制而言,它的確是將不同的客戶端平均的導到不同的Web伺服器去,但是,即使每部Web伺服器上所服務的客戶端數量都相同,也並不意謂著每個Web伺服器的工作負載就會相同,因為每個客戶端所會造成的負載通常都不一樣。

舉例來說,不同的客戶端,可能使用的功能不同、使用的時間不同、甚至操作的資源也不同,因此,基於這些不同的使用特性,就不可能造成相同的工作負載。

對於客戶端數量大的系統來說,像DNS輪詢這樣子的機制,即使不能準確的依據客戶端實際的負載來將客戶端請求平均的分散到每部伺服器上,但是,因為數量大,所以實際上,還是會表現出一個平均性的行為,使得巨觀來看,每一部伺服器的負載也能呈現平均的態勢。不過,對於客戶端數量小的系統來說,就沒有辦法憑藉著這種量大時的平均行為,來得到平均的負載。但是像DNS輪詢的機制,它的優點是簡單,並不會因為要做工作分派而耗去太多的資源,甚至影響到處理的時間。在滿多的應用情境下,DNS輪詢對Web伺服器的負載平衡來說,不失為一個實用的方式。

確認工作負載
理論上,為了打造出更好的負載平衡系統,這個系統必須要能夠評估,可供分派的計算資源當前的負載究竟是多少,以及每一個新進的工作任務,它將造成的工作負載又有多少。

第一個能力通常是比較好達到的,我們通常可以不費太多功夫就知道每個計算資源的負載,例如每部伺服器的CPU負載為何、每個對外連線的網路其網路頻寬使用量為何、以及檔案空間的使用量有多少、…… 等等。

但是,我們不見得有能力「預測」一個新進的工作任務,究竟會增加多少工作負載。

一些複雜的負載平衡系統,甚至會動態的調整工作任務所耗用的計算資源,例如,將一個執行到一半的程序(Porcess)由一部伺服器上搬移到另一部伺服器上執行。

之所以需要動態的調整,有很大的原因,便是源自於對工作任務的實際負載無法做預測的關係,使得必須動態的視情況再做調整。

因此,綜合以上所言,負載平衡系統有可能需要收集它所負責平衡的諸多計算資源的實際負載、預測每個工作任務的負載、以及進行分派的工作,它甚至有可能必須持續做評估,必要時在資源間對工作任務做搬移。

單點失效的狀況要避免

以上所提到的每個動作,都關係到不同的額外負擔,為了收集實際的負載,你需要付出通訊,還有計算上的額外負擔;為了預測每個工作任務的負載,你也需要計算、做評估,甚至分派工作也會花去你一些時間和計算量,因為你必須不讓負載平衡系統造成太多的延遲。

另一方面,雖然負載平衡系統之後的計算資源是分散式的,而分散式架構的優點,除了增加資源總量之外,同時也提供了冗餘性(redundancy),這使得即使有部份的計算資源無法提供服務,例如損壞了,其餘的計算資源仍可擔負起服務的責任。

可是,很多的負載平衡系統本身卻不是分散式的,這使得它會成為所謂的「單點失效(Single Point Of Failure)」。

也就是說,即使只有它這一點故障、無法起作用,都會使得整個系統無法運作。這麼一來,從分散式架構中得到的重要好處,便會因為負載平衡系統的單點失效問題,而消失了一些。

而像前例中的DNS輪詢的機制,它一方面簡單,所以不會耗去太多時間,另一方面,由於DNS服務天生的特性,所以也不太有單點失效的問題。因此,它才會如此普及,成為許多系統採用的方式。但是,它即使有這樣的優點,還是免不了一個嚴重的問題,也就是當後端的伺服器出現無法提供服務的情況時,它並沒有辦法偵測,同時在指派新進的客戶端時,不能避免將它指派到故障的伺服器去,它還是會依序將新進的客戶端,指派到每個伺服器上。這麼一來,就會造成有些客戶端反而被指派到故障的伺服器去了。

此外,負載平衡系統也有可能因為它是單一點,而使得它的效能限制了整個系統的效能。如果負載平衡系統成為瓶頸,那麼即使後端的計算資源再怎麼多,也會因為負載平衡系統的能力,而限制了系統整體的能力。

在這種情況下,無論怎麼增加後端的計算資源,也無法讓系統的能力跟著提升,這當然是一件很不利的事情。

負載平衡系統對於要提供大規模服務的系統來說,當然是很重要的一件事,因為它是你透過分散式的架構來提升系統服務能力時不可或缺的一環。但是,一個負載平衡系統如何設計,也會隨著系統的特性或不同的應用目標而改變。在下回中,我們將更進一步探討細節。

 

專欄作者

熱門新聞

Advertisement