什么是負載均衡?
1、負載:就是后端系統的承載能力。比如同等條件下,一個1核cpu-1G內存的機器的承載能力一般會比8核cpu-8G內存的機器要差;相同配置下,一個cpu利用率為80%的機器比30%的承載能力一般要差等等。
2、均衡:保證后端請求的平衡。比如:在同等情況下,分配到多臺機器的請求要相當;有些情況下,同一用戶盡可能分配到同一臺機器等等。
為什么要有負載均衡呢?
很明顯,如果我們不去考慮后端的承載情況,有可能直接就把某臺機器壓垮了(比如cpu利用率已經80%了,再給大量的請求直接就干死了),更嚴重的會直接造成雪崩(一臺壓死了,對應的請求又壓倒其他某臺機器上,又干死一臺……),從而致使服務癱瘓。
2、如果我們均衡算法選的不好,就會導致后端資源浪費。比如:如果選擇一致Hash算法,可以很好利用cache的容量。而如果用隨機,有可能就會讓cache效果大打折扣(每臺機器上都要緩存幾乎相同的內容)。
負載均衡算法有哪些?
1輪詢法(Round Robin)
輪詢法是負載均衡中最常用的算法,它容易理解也容易實現。
輪詢法是指負載均衡服務器(load balancer)將客戶端請求按順序輪流分配到后端服務器上,以達到負載均衡的目的。
假設現在有6個客戶端請求,2臺后端服務器。當第一個請求到達負載均衡服務器時,負載均衡服務器會將這個請求分派到后端服務器1;當第二個請求到害時,負載均衡服務器會將這個請求分派到后端服務器2。然后第三個請求到達,由于只有兩臺后端服務器,故請求3會被分派到后端服務器1。
2加權輪詢法(Weighted Round Robin)
簡單的輪詢法并不考慮后端機器的性能和負載差異。給性能高、負載低的機器配置較高的權重,讓其處理較多的請求;而性能低、負載高的機器,配置較低的權重,讓其處理較少的請求。加權輪詢法可以很好地處理這一問題,它將請求順序且按照權重分派到后端服務器。
假設有6個客戶端請求,2臺后端服務器。后端服務器1被賦予權值5,后端服務器2被賦予賦予權值1。這樣一來,客戶端請求1,2,3,4,5都被分派到服務器1處理;客戶端請求6被分派到服務器2處理。接下來,請求7,8,9,10,11被分派到服務器1,請求12被分派到服務器2,依次類推。
3最小連接數法(Least Connections)
即使后端機器的性能和負載一樣,不同客戶端請求復雜度不一樣導致處理時間也不一樣。最小連接數法根據后端服務器當前的連接數情況,動態地選取其中積壓連接數最小的一臺服務器來處理當前的請求,盡可能提高后端服務器的利用效率,合理地將請求分流到每一臺服務器。
為什么根據連接數可以合理地利用服務器處理請求呢?
考慮一個客戶端請求的處理邏輯較復雜,需要服務器的處理時間較長,由于客戶端需要等待服務器的響應,故需要保持與服務器的連接,這樣一來,客戶端就需要與服務器保持較長時間的連接。
4隨機法(Random)
隨機法也很簡單,就是隨機選擇一臺后端服務器進行請求的處理。由于每次服務器被挑中的概率都一樣,客戶端的請求可以被均勻地分派到所有的后端服務器上。
5加權隨機法
與加權輪詢法一樣,加權隨機法也根據后端機器的配置,系統的負載分配不同的權重。不同的是,它是按照權重隨機請求后端服務器,而非順序。
6源地址哈希法(Source Hashing)
源地址哈希的思想是根據獲取客戶端的IP地址,通過哈希函數計算得到的一個數值,用該數值對服務器列表的大小進行取模運算,得到的結果便是客服端要訪問服務器的序號。采用源地址哈希法進行負載均衡,同一IP地址的客戶端,當后端服務器列表不變時,它每次都會映射到同一臺后端服務器進行訪問。
如果后端服務器是一緩存系統,當后端服務器增加或者減少時,采用簡單的哈希取模的方法,會使得命中率大大降低,這個問題可以采用一致性哈希的方法來解決。 關于一致性哈希的介紹,可以參考文件 五分鐘看懂一致性哈希算法