怎樣才能「負載」均衡

2021-09-21 21:34:54 字數 2736 閱讀 6596

adc產品(應用交付控制器)主要實現負載均衡、應用和協議優化、安全防護等功能,其目的是實現伺服器和應用系統的高可靠可用性。其中負載均衡功能是adc的基本功能也是最重要的功能,但是基本不代表簡單,在實際使用中,我們總是會發現用了負載均衡裝置,但負載均衡並不均衡的現象。

為什麼負載會不均衡呢?請讓我們從技術角度來仔細**,相信大家會有清晰的認識。

欲要實現伺服器分配均衡,大家第乙個想到的選項是什麼?

很多人肯定回答是演算法,沒錯,是負載分配的演算法,但一台負載均衡裝置提供了很多的演算法,具體演算法應該如何選擇呢?

我的回答是具體需求具體考慮,我們

來一一討論。

負載均衡的分配演算法分為靜態演算法、動態演算法以及根據具體需求特定分發三大類。

配置過負載均衡裝置的人最熟悉的演算法應該是輪詢(round robin:對每個新建連線依次分發到服務組中的每台伺服器)。輪詢是靜態演算法,也是大家配置裝置時,往往會預設選擇的演算法。輪詢的結果是每台伺服器上連線的總數是一致的,但伺服器的硬體和軟體效能可能會不同,導致伺服器當前處理能力差別很大,也就是伺服器的負載差別很大,而隨著分發到伺服器的使用者連線越來越多,導致某些效能差的伺服器上當前處理的連線數越積越多,最終將導致該伺服器崩潰,而其他伺服器卻相對空閒,這顯然不是客戶想看到的。

這個時候有人會考慮選擇比例(ratio), 例如兩台伺服器一台效能是另一台的兩倍,那麼在分發的時候設定乙個比例2:1,效能高的伺服器分發到的連線數是效能低伺服器的兩倍。但是比例演算法仍然是乙個靜態演算法,比例的設定取決於人的經驗感知,不能代表裝置的真正負載和效能,導致實際的執行結果仍然會有比較大的偏差,伺服器負載仍然不均衡。

通過上面可以看出,靜態演算法無法實時感知伺服器的執行狀態,是一種比較死板的演算法,無法動態調整。因此對於處理起來比較複雜的應用,最好是考慮動態的演算法,例如最小連線數(least connection:adc實時統計當前每台伺服器上的連線數,新的連線將傳遞給當前連線數最少的伺服器),上面說過,輪詢是保證每台伺服器處理過的總連線數是均衡的,而最小連線數與輪詢恰好相反,最小連線數是保證每台伺服器當前正在處理的連線數是均衡的,這種動態演算法反映了伺服器的效能情況,例如伺服器1當前正在處理的連線數為50,伺服器2為49, 那麼下乙個新建連線會發給伺服器2,此時兩台伺服器都是50, 假設伺服器1處理比較慢,伺服器2處理比較快,那麼下一時刻可能伺服器2的當前連線數又變得比伺服器1少,結果新建連線會繼續發給伺服器2。所以從總數上來看,伺服器2處理過的連線數會遠遠高於伺服器1,但正在處理的連線數總是均衡的。

還有一種動態演算法是最快響應速度(fastest response : 新的連線傳遞給那些響應最快的伺服器)。這種演算法把新建連線總是傳送給響應最快的伺服器,它的表現是,各台伺服器上的總連線數和當前連線數從統計上都不一致,但是處理的連線數最多的那台,肯定是效能最好的伺服器。

通過以上的分析,通過配置最優的負載均衡演算法看似能夠保證伺服器的負載均衡,但實際上還不夠,現實中有很多情況會導致伺服器的負載失衡。有以下幾種情況:

1)應用無需配會話保持的情況,adc裝置把連線均衡分發到伺服器,但是某些連線訪問量比較大,有些連線訪問量比較小,導致的結果是伺服器上連線數看似均衡,但伺服器負載差別比較大。

解決辦法:基於請求來分發,使用者訪問的最小顆粒度是請求而不是連線(乙個連線中可能有n個請求),如果基於請求來分發,自然可以更深一步來均衡伺服器的負載。

2)應用需要配置會話保持的情況,很多應用都需要配置會話保持,假設配置的是源ip會話保持,那麼同乙個源ip的所有連線都會保持在一台伺服器上,假設某些源ip訪問量特別大,某些源ip訪問量比較少,就會導致某些伺服器負載比較高,某些又比較低?尤其是某些使用者的位址在出口是做了nat的,adc裝置看到的源ip是這個nat ip,但後面其實有很多個使用者在訪問,會導致伺服器連線數不均衡,並且負載差別很大。

解決辦法:

a)採用基於cookie的會話保持,cookie會話保持主要用於http協議的應用,使得每隔客戶端帶著相同cookie的會話才會分發並保持在一台伺服器上,它可以細分開同一源ip的多個連線,所以可以使得伺服器的負載更均衡。

b)基於session-id的會話保持,有些客戶端不支援cookie或者應用不支援cookie或者使用cookie會話保持後,伺服器負載仍然不均衡,我們可以考慮採用指令碼程式設計分析資料報的內容取得會話的session-id並以此做為保持選項,這是一種比cookie會話保持要求更高的保持策略,只有比較靈活的adc裝置才能實現。

c)基於使用者的某個關鍵字資訊進行保持,例如手機的應用,使用者的資料報中會帶有手機號資訊,通過程式設計分析資料報取得這個關鍵字資訊進行分發和保持,將使得伺服器的負載更均衡。

3)使用了各種方法負載都不均衡的情況,伺服器的負載高低不僅僅跟cpu,記憶體的使用率高低有關係,同時也跟應用系統程式的實現細節息息相關。這裡有乙個真實案例:客戶的應用部署多台小型機,同時每台小型機又劃分出多個虛擬機器,每台虛擬機器都安裝了乙個應用系統,通常負載均衡分發自然是針對這些虛擬機器進行分發,但是每台虛擬機器的應用系統有一些資源使用的上限,例如每台虛擬機器最多可執行50個應用執行緒,結果在cpu,記憶體占用並不高的情況下,執行緒用滿了,導致虛擬機器無法繼續處理新的請求。

解決辦法:這種情況極其特殊,任何adc裝置都無法設計出標準感知應用程式是否可用的選項。但是,是否無法解決呢?還是有辦法的,乙個人累不累自己最知道,應用系統自己是可以知道能否處理更多東西的,那麼辦法就是應用程式自己做乙個監控,把監控的結果寫到乙個檔案中,adc裝置通過健康檢查的功能定時取這個檔案判斷裡面的內容,如果內容指示為不可用,那麼後續使用者的訪問將傳送到其他的伺服器,當檢查到該台伺服器又可用了,可以把新的使用者請求繼續傳送到該台伺服器。這種方法同樣要求adc裝置能夠程式設計定製乙個健康檢查,這也是對adc裝置的更高要求。

怎樣才能學好linux

隨著linux應用的擴充套件許多朋友開始接觸linux,根據學習windwos的經驗往往有一些茫然的感覺 不知從何處開始學起。這裡介紹學習linux的一些建議。一 從基礎開始 常常有些朋友在linux論壇問一些問題,不過,其中大多數的問題都是很基礎的。例如 為什麼我使用乙個命令的時候,系統告訴我找不...

怎樣才能培養激情?

q 怎樣才能培養激情,找到自己真正的內在持續性動力呢?開復 如果你找到了興趣,你就會有激情。那麼如何找到興趣呢 以下是我過去針對這個問答的一些回答 1 我的 第三封信 可以給你一些啟示 如何尋找興趣和激情呢?首先,你要把興趣和才華分開。做自己有才華的事容易出成果,但不要因為自己做得好就認為那就是你的...

怎樣才能學好程式設計

本科四年,在碌碌無為中度過,不管是在誰的眼中,本科四年,渾渾噩噩就這麼走過,一路走來,想象自己到底學到了什麼,c語言就學會個printf,scanf語句,到了研究生,別人問,一涉及到自己的水平心就發虛,發現自己最大的缺點還是缺乏self confidence,從小就形成的壞毛病,怪不得自己屢戰屢敗,...