一、負載均衡介紹
1.1 什麼是負載均衡
負載均衡(load balancing)
它是計算機的一種技術,用來在計算機集羣、網絡連接、CPU、磁盤驅動器或其他資源中分配負載,以達到優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。-來自 wikipedia
負載均衡主要作用是將多個連接或作業合理的分配到多個操作單元上執行,用於解決互聯網中高可用和高併發問題。
在互聯網應用程序服務中,負載均衡就是一種合理分配網絡流量到你後端執行程序的一種方法。
後端有多個相同程序提供服務,負載均衡器就可以把多個客戶端請求合理分配給後端服務器(應用程序在服務器裏)。
負載均衡器就像餐廳的前臺接待員,客人來了後,接待員就把客人引導到合適的臺桌和座位上,後續的服務員在爲客戶提供服務。
1.2 負載均衡作用
擴展性
你可以使用負載均衡器在多個服務器之間均衡的調度訪問流量。
你還可以添加或刪除你的後端服務器,只需要把這臺服務器的信息告訴負載均衡器。你可以放心擴展你的服務器。
可以同時應對訪問的流量高峯或流量低谷。
高可用性
第一:負載均衡器後面有多臺服務器,如果其中一臺服務器故障了,還有其它服務器可以提供後端服務。
第二:當你的應用程序升級或服務器需要維護時,不需要停機,因爲前面有負載均衡器,可以幫你摘除沒有提供服務的服務器。
第三:負載均衡器還可以幫你檢查後端服務健康情況,服務不可用時,可以摘除這個服務,等到服務可用後,又可以添加這個服務。
性能
負載均衡器可以提高後端服務程序性能。
它可以把訪問負載按照一定方式分配到後端不同服務器,以此來提高服務程序性能。
這個不同的方式指的是按照什麼算法什麼策略。
它也可以定位到較近的服務器以減少網絡延遲。
二、負載均衡算法
最常用的 Web 服務器 Nginx,我們經常拿它作爲 web 服務器的負載均衡器使用。
負載均衡有哪些算法呢?下面介紹,
2.1 輪詢算法RoundRobin
輪詢算法就是按照循環的方式來訪問後端服務器。
比如上面有 3 臺後端服務器,這種算法就是按照服務器1,服務器2,服務器3 依次輪詢一臺服務器提供服務。
2.2 加權輪詢算法
因爲每臺服務器可能性能不同、網絡帶寬不同,那性能好的服務器就可以多提供些訪問服務,性能差的就少提供。
那怎麼做?可以加一個權重指標,來標識服務器訪問性能好壞。權重較高,表示服務器性能好,就多接收一些訪問流量。權重低的就少接收訪問流量。
比如在 Nginx 裏,weight 就表示權重,weight 值越大表示權重越高,那麼後端服務器就可以多接收訪問流量。
平均加權輪詢算法:
每個服務器對應 2 個權重,爲 weight 和 currentWeight,weight 是固定,而 currentWeight 動態調整,初始值爲 0。
2.3 隨機選擇算法Random
隨機選擇算法就是隨機性的選擇一臺後端服務器提供服務。
比如有 3 臺服務器 1、2、3,每一次選擇有可能是 1,也可能是 2,也可能是 3,每次選擇都是隨機的。
隨機數也可以加個權重。
2.4 最少連接數
最少連接數算法,就是負載均衡器將檢查後端哪些服務器的活躍連接數最少,就將訪問流量發送給這些服務器。
這個活躍連接數一般就是指 TCP 連接數。
2.5 哈希算法hash
哈希算法一般有:ip 哈希,url 哈希,hash算法,一致性hash算法等算法。
2.6 最短響應時間
最短響應時間就是將服務器的響應時間和活躍連接數結合起來,用來確定一個最佳的服務器。
2.7 Power of Two Choices
Nginx 在 1.15.1 中增加了這種新的負載均衡算法 Power of Two Choices。
簡單理解就是隨機從所有可用節點中選擇兩個節點,然後計算這2個節點負載情況,計算出一個負載較低的服務器,就選擇這臺服務器處理本次請求。
具體可以看這篇文章:nginx-power-of-two-choices-load-balancing-algorithm
算法論文地址:The Power of Two Random Choices: A Survey of Techniques and Results
三、負載均衡類型
3.1 四層負載和七層負載
四層負載:在 OSI 七層模型來看,它工作在 TCP 層
七層負載:在 OSI 七層模型看,它工作在應用層
3.2 軟件負載和硬件負載
軟件負載:Nginx 和 LVS。
Nginx 工作在七層,LVS 工作在四層。
硬件負載:F5
它工作在四層。
3.3 應用程序、網絡、DNS負載
應用程序負載均衡:應用程序負載均衡就是負載均衡器查看請求內容,比如 HTTP 頭或會話 ID ,然後重新定向這個請求的流量。
網絡負載均衡:網絡負載均衡就是查看 IP 地址和其他網絡信息,然後根據這些信息來定向這個請求流量。
DNS 負載均衡:域名就是由 DNS 服務器解析成 IP,然後通過 IP 定位到提供服務的服務器。DNS 可以做到全局負載均衡。它的缺點就是修改 DNS 後,解析不能馬上生效。爲了改進這個缺點,就用 HTTPDNS。
四、參考
- https://www.nginx.com/blog/nginx-power-of-two-choices-load-balancing-algorithm/ nginx 的 p2c 算法
- https://nginx.org/en/docs/http/ngx_http_upstream_module.html nginx 模塊
- https://www.eecs.harvard.edu/~michaelm/postscripts/handbook2001.pdf The Power of Two Random Choices: A Survey of Techniques and Results,這個算法論文地址