高併發系列: 垂直性能優化之細說負載均衡
高併發是業務發展到一定階段必須面對的問題,那麼面對高併發的問題,我們可以從哪些方面入手優化呢?
垂直性能優化 [包含整體層面的負載均衡、中間件異步化、存儲優化、代碼層面調優、jvm 容器調優等等]
整體可用性優化 [包含服務治理、服務保護、可靠性保障、生產驗證、故障演練等等]
水平擴展提升 [包含分層架構、彈性架構、服務拆分及單元化等等]
從這篇開始將對上述問題進行逐點闡述,歡迎大家一起交流討論~
前言
性能爲王。可用性和水平擴展,都要建立在性能優良的基礎上纔會去考慮。
性能是高併發的基礎,而且涉及面極廣,也是需要我們投入更多的精力去對待;同時,大部分優化點也是我們一線研發日常可以直接接觸的模塊。也是大廠面試的時候會經常涉及到的模塊。
所以第一部分大概十幾篇可能都會在垂直性能優化上。第一篇,垂直性能優化之細說集羣部署和負載均衡。
從阿里架構演變來看負載均衡
我們將淘寶網的架構演進(即時通訊網 [1])整理到一個滑動圖裏,如下圖所示:
當然,比如中臺建設、上雲等更高級演進就在此忽略了;
可以更清晰的看到,在集羣部署和負載均衡,幾乎分佈在了整個演進鏈路上最關鍵的節點上:
-
當解決了本地存儲的性能瓶頸,新的瓶頸出現在了 web 容器的單體性能上。因此,使用 nginx 反向代理來實現多個 web 容器負載均衡
-
當數據庫和 tomcat 都達到水平擴容,可支撐的併發大幅提升時,單體 nginx 代理的性能成了新的瓶頸。因此,使用 F5 或 LVS 來實現多個 nginx 反向代理服務器負載均衡
-
當業務進一步發展,達到多地多機房部署,垮地域訪問延遲成了新的瓶頸。因此,使用 DNS 來實現地域機房間的負載均衡。
細說負載均衡方案
常見的實現方案,其實從上面的演進鏈路中也已經可以基本瞭解到各個方案適用的發展階段和應對常見,這裏再系統的總結下:
-
基於 DNS 的負載
-
基於硬件的負載,如 F5
-
基於軟件的負載,如 Nginx/Squid
DNS 負載
上面兩副圖,可以看到 DNS 的解析過程和負載均衡的原理。天然的優勢就是配置簡單,實現成本非常低,無需額外的開發和維護工作。
而缺點也比較明顯:
-
目前的 DNS 是多級解析的,每一級都可能緩存。所以生效不及時。
-
不能按服務器的處理能力來分配負載。DNS 負載均衡採用的是簡單的輪詢算法,不能區分服務器之間的差異和運行狀態,不靈活
-
額外的網絡問題。爲了使本 DNS 服務器和其他 DNS 服務器及時交互,保證數據及時更新,一般都要將刷新時間設置的較小,可能造成流量增大。
基於硬件的負載均衡
「F5 Network Big-IP」 是一個網絡設備,可以簡單的認爲是一個網絡交換機一類的東西,性能非常好,百萬級 TPS。
性能優良、功能強大,多種均衡算法都可以支持,還有防火牆等安全功能。但,非常貴,一般小公司可用不起。
基於軟件的負載均衡
軟件負載均衡都是以 TCP/IP 協議的 OSI 模型的運用:(即時通訊網 [4])
-
二層負載均衡(一般是用虛擬 mac 地址方式,外部對虛擬 MAC 地址請求,負載均衡接收後分配後端實際的 MAC 地址響應);
-
三層負載均衡(一般採用虛擬 IP 地址方式,外部對虛擬的 ip 地址請求,負載均衡接收後分配後端實際的 IP 地址響應);
-
四層負載均衡(在三次負載均衡的基礎上,用 ip+port 接收請求,再轉發到對應的機器);
-
七層負載均衡(根據虛擬的 url 或是 IP,主機名接收請求,再轉向相應的處理服務器)。
常見的其實只有 4 層和 7 層負載。
四層和七層的橫向對比
-
四層 七層
- 原理 基於 IP + 端口 基於虛擬的 URL 或主機 IP
- 分析內容 IP 層及 TCP/UDP 層 應用層信息,如 HTTP 協議 URI 或 Cookie 信息
- 複雜度 架構簡單、管理容易、問題定位方便 比較複雜
- 靈活性 僅支持基於網絡層的需求轉發 可對所有跟服務端的請求進行修改
- 安全性 無法直接抵禦網絡攻擊 更容易抵禦來自網絡的攻擊
- 效率 基於更底層設置,效率高 需要更多的資源損耗
常見的負載均衡算法
- 算法名 優點 缺點
- 輪詢 簡單高效,兼顧所有節點 集羣性能瓶頸更多的會受性能差的服務器影響
- 隨機 同輪詢類似
- 一致性 hash 相同來源請求落點相同,有利於灰度發佈等功能 遇到熱點會對節點有衝擊;節點故障影響上游調用
- 加權輪詢 將機器性能考慮在內,集羣性能最大化 生產環境複雜多變,無法動態調整權重,只能粗略預先優化
- 動態連接數、最快響應 動態,根據節點狀況實時變化 增大的複雜度和資源消耗
廣義的負載均衡
上述內容基本都是基於服務級別來敘述的負載均衡的概念。其實,負載被運用的場景還很多,比如,服務端 rpc 選址、以及一些中間件的投遞和請求分發,再有一些彈性架構下的彈性路由,單元化下的單元路由,其實也是更高層面的負載均衡。相應的,也有很多特定的負載算法,比如 rpc 中的本地優先負載等等。
結束語
負載均衡是業務發展到一定階段必經的優化過程。掌握負載相關的原理和算法,對我們日常業務問題排查甚至是架構設計都可以起到很好的幫助。
本篇是高併發系列中垂直性能優化的第一篇,從服務的整體優化爲出發點敘述了主要技術手段 -- 負載均衡的主要內容,下一篇,將從中間件的應用入手,再聊性能優化。歡迎大家來一起交流。
Reference
[1] 從 100 到 1000 萬高併發的架構演進之路: http://www.52im.net/thread-2665-1-1.html
[2] 頭條號: 程序員小新人學習
[3] 知乎: foxgab:DNS 如何實現全局負載均衡
[4] 一篇讀懂分佈式架構下的負載均衡技術: http://www.52im.net/thread-2494-1-1.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/FEbR0JyKfYMY-8IypmXVig