常見的負載均衡設備,有F5,Haproxy,lvs, nginx等。
F5是商用硬件負載均衡,性能很好,但是價格昂貴,除了負載均衡,還有應用交換、會話交換、狀態監控等眾多功能。
F5壹般做四層負載均衡,但也支持七層負載均衡。
Haproxy(以下簡稱ha)是軟件負載均衡,開源,壹般做七層負載均衡,但也支持四層負載均衡。
Linux Virtual Server(以下簡稱lvs)是軟件負載均衡,開源,二層或四層負載均衡,已集成到linux內核,自身有完備的熱備方案(keepalived+lvs),穩定性極強。
nginx也是軟件負載均衡,開源,通過反向代理實現負載均衡,是七層負載均衡,性能不如上面的幾個。
tips1
有些公司,測試環境用ha/lvs/nginx,生產環境用F5。
tips2
nginx做web服務器時,壹般做靜態資源服務器和php的web服務器,所以很多公司,會采用F5+nginx或者ha+nginx的架構
tips3
微服務中的ribbon屬於客戶端負載均衡,上面的幾種都是服務端負載均衡
二層負載均衡
在數據鏈路層通過修改mac地址實現,如lvs的DR模式(直接路由模式)
三層負載均衡
在網絡層通過DNAT協議修改目標地址實現
四層負載均衡
用ip+端口實現請求轉發
備註:tcp報文裏並沒有ip,但是四層負載均衡可以用ip+端口,是因為server可以拿到ip
七層負載均衡
通過重新發起http請求實現,即client把請求發給lb,lb把請求代發給server,再把server的響應返回給client,因此七層負載均衡也經常被稱為代理,七層負載均衡設備也被稱為代理設備。
七層負載均衡常用於內網與外網的通信,比如內網無法直接訪問外網,需要通過代理設備代發http請求,這種情況下,代理設備需要配置雙網卡,以同時與內外網絡通信。
由於需要重發http請求,七層負載均衡性能較差,但是更智能和安全,因為應用層可以獲取甚至修改請求的真實內容(即應用數據),比如cookie、url等,可以做壹些智能的操作,比如根據cookie/url轉發請求,也可以做壹些安全操作,比如過濾特定報文、防止SYN Flood攻擊等。
使用七層負載均衡時,服務的性能受限於代理設備的網卡帶寬。
常見的負載均衡策略,有輪詢、加權輪詢、ip_hash、cookie、url_hash,根據服務器響應時間轉發、根據最少連接轉發等等。
備註:nginx可以安裝第三方插件,使用第三方實現的策略
輪詢:按服務器列表順序轉發請求,輪詢是nginx默認的策略,本策略適合服務器配置相當、請求無狀態(即不依賴session)的場景
加權輪詢:如果不同服務器配置不同,可以為配置高的服務器增加權重
ip_hash:根據ip哈希結果轉發,可以實現同壹用戶持續請求同壹服務器(即會話保持),適合有狀態(即依賴session)的場景,對png、jpg、js、css等靜態資源的請求,不適合使用本策略
cookie:根據特定cookie轉發請求,壹般也是用於實現會話保持,比如為服務器A、B分別增加service-flag=a、service-flag=b的cookie,後續請求根據cookie轉發
可以參考 haproxy實現會話保持
url_hash:根據url哈希結果轉發,同壹個接口始終請求同壹臺服務器,壹般配合緩存使用,緩存接口返回結果
根據服務器響應時間轉發:優先轉發到響應時間較快的服務器
根據最少連接轉發:優先轉發到連接數較少的服務器
F5有壹些特有的負載均衡策略:利用從應用程序和服務器收集到的各項性能指標,分析並轉發
負載均衡有兩個步驟:
1.根據什麽算法選擇真實服務端,即負載均衡策略,如輪詢、加權輪詢、ip_hash、cookie、url_hash等;
2.把請求轉發到真實服務器,轉發方式有二層到七層負載均衡
keepalived軟件壹開始是專為lvs設計的,後來加入了可以實現高可用的VRRP (Virtual Router Redundancy Protocol ,虛擬路由器冗余協議)功能,因此,keepalived還可以作為nginx、haproxy、mysql等服務的高可用解決方案。
以nginx為例,為了防止nginx本身由於宕機等原因導致網站不可用,壹般會搭兩套nginx反向代理,用keepalived提供壹個VIP。
壹般情況下,VIP只在nginx主節點上工作,如果nginx主節點不可用了,VIP會自動漂移到從節點,自動漂移的原理即VRRP協議。
VIP漂移到從節點後,如果主節點恢復正常了,VIP是否漂移回主節點,取決於當前模式是搶占模式還是非搶占模式。
下圖是壹張簡單的架構圖,解釋如下:
以上觀點純屬個人意見,如果錯誤,歡迎指出,有些地方寫的很簡單,是因為我也不懂~