運營研發團隊 施洪寶html
一. 基礎知識
1.1 基礎
- 什麼是負載均衡?
當單機提供的併發量不能知足需求時,咱們須要多臺服務器同時服務。當客戶請求到達時,如何爲客戶選擇最合適的服務器?這個問題就是負載均衡問題。
- 負載均衡主要須要解決的問題是哪些?
- 從客戶端的角度上看,客戶須要最快速的獲得服務器的相應,負載均衡時須要找出能最快相應客戶需求的服務器進行服務。
- 從服務端來看如何使得每臺服務器都能達到較高的利用率,最大限制的爲用戶提供快速、可靠的服務是服務端須要考慮的主要問題。
1.2 負載均衡分類
- 硬件
- 軟件
- dns負載均衡
- LVS負載均衡(4層)
- nginx, haproxy(7層)
二. F5負載均衡
- F5是一家美國的公司,該公司生產一些硬件設備能夠做爲負載均衡器使用(例如:big-ip), 本文後續部分所說的F5是指其負載均衡器產品。
- 不一樣的產品實現的功能不一致,具體狀況須要根據產品說明書。
- F5能夠在4-7層內作負載均衡,用戶能夠根據需求進行配置。
- 因爲F5能夠作7層負載均衡,故而能夠實現會話管理,http處理等。
2.1 數據轉發模式
- standard類型, 這種模式下,客戶端與F5服務器創建鏈接,F5服務器與真實服務器創建鏈接,F5服務器將客戶需求轉發給真實服務器,並將真實服務器的相應轉發給客戶端,此時F5能夠查看請求和相應的全部信息。
- 四層轉發模式(performance L4), 這種模式下,F5只處理4層如下的數據。客戶端將數據發送給F5, F5僅將數據轉發給真實服務器,包括TCP的握手數據包以及揮手數據包,真實服務器須要先將數據發送給F5服務器,F5將其轉發給客戶端。
- 路由模式, 這種模式與LVS的DR模式相似。
- ...
2.2 負載均衡算法
- 輪詢,加權輪詢。
- 源地址哈希
- ...
2.3 小結
F5的優點在於功能強大,併發量高,能知足客戶的大多數需求,但其成本較高,通常大型國企可能會使用。nginx
2.4 參考
三. dns負載均衡
- dns負載均衡由dns服務提供廠商提供。
- 最初的dns負載均衡提供簡單輪詢,不能根據客戶端或者服務端狀態進行選擇。
- 目前,有些dns服務廠商能夠提供智能dns服務,用戶能夠設置負載均衡方案,例如:根據客戶端ip地址,選擇就近的服務器。
- 對於目前大多數的公司而言,爲了更好的服務用戶,一般會使用dns負載均衡,將用戶按照就近原則,分配到某個集羣服務器上。以後,集羣內再採用其餘的負載均衡方案。
四. Linux Virtual Server(LVS)
- LVS經過修改數據包Ip地址,Mac地址實現負載均衡。
- LVS由ipvs(內核中), ipvsadm(用戶態)組成。LVS須要理解tcp,ip頭部。
- 當tcp握手信號,SYN數據包達到時,ipvs選擇一個後端服務器,將數據包進行轉發。在此以後,全部包含相同的ip,tcp頭部的數據包都會被轉發到以前選擇的服務器上。很明顯,ipvs沒法感知數據包內容。
4.1 分類
4.2 基本原理
4.2.1 LVS-DR
LVS-DR模式的基本原理以下圖所示:
算法
4.2.2 LVS-NAT
LVS-NAT模式的基本原理以下圖所示:
後端
4.3 負載均衡算法
4.3.1 靜態算法
- 輪詢(Round Robin, RR)
- 加權輪詢(Weight Round Robin, WRR)
- 源地址Hash(Source Hash, SH)
- 目的地址Hash(Destination Hash, DH), 能夠設置多個VIP
4.3.2 動態算法
- 最少鏈接(Least Connections, LC),找出當前鏈接數最小的服務器
- 加權最少鏈接(Weighted Least Connections, WLC)
- 最短時間望延遲(Shortest Expected Delay Scheduling, SED) 基於WLC。例如: 現有A, B, C三臺服務器,權重分別爲100,200,300,當前的鏈接數分別爲1,2,3,下一個鏈接到達時,經過計算指望時延選擇服務器(1+1)/100, (2+1)/200, (3+1)/300, 故而選擇C服務器。
- 永不排隊(Never Queue Scheduling, NQ), 改進的sed, 若是某臺服務器鏈接數爲0,直接鏈接過去,不在進行sed計算。
- 基於局部性的最少鏈接(locality-Based Least Connections, LBLC),根據目標ip, 找出目標ip最近使用的服務器,若是服務器存在而且負載沒有大於一個閾值,則將新的鏈接分配到這個服務器上,不然按照最少鏈接找出一個服務器處理該請求。
- 帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication, LBLCR),根據目標ip,維護一個服務器組,每次從組中挑選服務器,若是服務器不能夠處理,則從全部服務器中按照最少鏈接挑選出一臺服務器,並將其加入到目標ip的處理組服務器中。
4.3 參考
五. Nginx Load Balance
- nginx負載均衡工做在7層,它會與client、upstream分別創建tcp鏈接,nginx須要維護這兩個鏈接的狀態。
- nginx的stream模塊能夠用於4層負載均衡,但通常不多使用。
5.1 基本原理
nginx作7層負載均衡的基本原理以下圖所示:
服務器
5.2 負載均衡算法
- 輪詢(默認)
- 加權輪詢
- 源ip哈希
- 響應時間
- url 哈希