高并發(fā)系列: 垂直性能優(yōu)化之細(xì)說(shuō)負(fù)載均衡

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














