0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

重新思考邊緣負(fù)載均衡

馬哥Linux運(yùn)維 ? 來(lái)源:簡(jiǎn)書(shū)-DeepNoMind ? 2023-06-05 14:48 ? 次閱讀

目標(biāo)

Netflix的云網(wǎng)關(guān)團(tuán)隊(duì)一直致力于幫助系統(tǒng)減少錯(cuò)誤,獲得更高的可用性,并提高故障恢復(fù)能力。因?yàn)镹etflix每秒有超過(guò)一百萬(wàn)次請(qǐng)求,即使是很低的錯(cuò)誤率也會(huì)影響到會(huì)員體驗(yàn),所以每一點(diǎn)提升都有幫助。

因此,我們向Zuul和其他團(tuán)隊(duì)學(xué)習(xí),改進(jìn)負(fù)載均衡實(shí)現(xiàn),以進(jìn)一步減少由服務(wù)器過(guò)載引起的錯(cuò)誤。

背景

Zuul以前用基于輪詢的Ribbon負(fù)載均衡器[3],并基于某些過(guò)濾機(jī)制將連接失敗率高的服務(wù)器列入黑名單。

過(guò)去幾年里,我們做了一些改進(jìn)和定制,比如向最近上線的服務(wù)器發(fā)送較少流量,以避免過(guò)載。這些改進(jìn)已經(jīng)取得了顯著效果,但對(duì)于某些問(wèn)題比較多的原始集群,還是會(huì)看到與負(fù)載相關(guān)的錯(cuò)誤率遠(yuǎn)高于預(yù)期。

如果集群中所有服務(wù)器都過(guò)載,那選擇哪一臺(tái)服務(wù)器幾乎沒(méi)有什么區(qū)別,不過(guò)現(xiàn)實(shí)中我們經(jīng)常看到只有某個(gè)服務(wù)器子集過(guò)載的情況。例如:

服務(wù)器冷啟動(dòng)后(在紅黑部署和觸發(fā)自動(dòng)伸縮期間)。

由于大量動(dòng)態(tài)屬性/腳本/數(shù)據(jù)更新或大型GC事件,服務(wù)器暫時(shí)變慢/阻塞。

服務(wù)器硬件問(wèn)題。經(jīng)常會(huì)看到某些服務(wù)器運(yùn)行得總是比其他服務(wù)器慢,有可能是由于鄰居節(jié)點(diǎn)占用太多資源,也可能因?yàn)橛布煌?/p>

指導(dǎo)原則

在開(kāi)始一個(gè)項(xiàng)目時(shí),需要記住一些原則,從而幫助指導(dǎo)在設(shè)計(jì)軟件時(shí)需要做出的大大小小的決定,這個(gè)項(xiàng)目基于的原則如下。

在現(xiàn)有負(fù)載均衡器框架的約束下工作

我們已經(jīng)將之前定制的負(fù)載均衡器集成到了Zuul代碼庫(kù)中,從而使得無(wú)法與Netflix的其他團(tuán)隊(duì)共享這些定制。因此,我們決定這次基于約束條件并做出額外投資,從一開(kāi)始就考慮復(fù)用,從而能夠直接在其他系統(tǒng)中使用,減少重新發(fā)明輪子的代價(jià)。

向他人學(xué)習(xí)

嘗試在他人的想法和實(shí)現(xiàn)基礎(chǔ)上構(gòu)建,例如之前在Netflix其他IPC棧中試用的"二選一(choice-of-2)"和"試用期(probation)"算法。

避免分布式狀態(tài)

選擇本地決策,避免跨集群協(xié)調(diào)狀態(tài)的彈性問(wèn)題、復(fù)雜性和滯后。

避免客戶端配置和手動(dòng)調(diào)優(yōu)

多年來(lái)基于Zuul的操作經(jīng)驗(yàn)表明,將服務(wù)配置的部分置于不屬于同一團(tuán)隊(duì)的客戶服務(wù)中會(huì)導(dǎo)致問(wèn)題。

一個(gè)問(wèn)題是,客戶端配置往往與服務(wù)端不斷變化的現(xiàn)實(shí)不同步,或者在不同團(tuán)隊(duì)擁有的服務(wù)之間引入耦合的變更管理。

例如,用于服務(wù)X的EC2實(shí)例類(lèi)型升級(jí),導(dǎo)致該集群所需節(jié)點(diǎn)減少。因此,現(xiàn)在服務(wù)Y中的"每臺(tái)主機(jī)最大連接數(shù)"客戶端配置應(yīng)該增加,以反映新增加的容量。應(yīng)該先對(duì)客戶端進(jìn)行更改,還是先對(duì)服務(wù)端進(jìn)行更改,還是同時(shí)對(duì)兩者進(jìn)行更改?更有可能的是,完全忘了要改配置,從而導(dǎo)致更多問(wèn)題。

盡可能不要配置靜態(tài)閾值,而是采用基于當(dāng)前流量、性能和環(huán)境變化的自適應(yīng)機(jī)制。

當(dāng)需要靜態(tài)閾值時(shí),與其讓服務(wù)團(tuán)隊(duì)將閾值配置協(xié)調(diào)到每個(gè)客戶端,不如讓服務(wù)在運(yùn)行時(shí)進(jìn)行通信,以避免跨團(tuán)隊(duì)邊界推動(dòng)更改的問(wèn)題。

負(fù)載均衡方法

主要的想法是,雖然服務(wù)器延遲的最佳數(shù)據(jù)來(lái)源是客戶端視圖,但服務(wù)器利用率的最佳數(shù)據(jù)來(lái)源是服務(wù)器本身。結(jié)合這兩種數(shù)據(jù)源,可以得到最有效的負(fù)載均衡。

我們基于一組互補(bǔ)機(jī)制,其中大多數(shù)已經(jīng)被其他人開(kāi)發(fā)和使用過(guò),只是以前可能沒(méi)有以這種方式組合。

用于在服務(wù)器之間進(jìn)行選擇的二選一算法(choice-of-2 algorithm)。

基于服務(wù)器利用率的負(fù)載均衡器視圖進(jìn)行主負(fù)載均衡。

基于服務(wù)器利用率的服務(wù)器視圖進(jìn)行二次均衡。

基于試用期和基于服務(wù)器世代的機(jī)制,避免新啟動(dòng)的服務(wù)器過(guò)載。

隨著時(shí)間推移,收集的服務(wù)器統(tǒng)計(jì)數(shù)據(jù)衰減為零。

Join-the-Shortest-Queue和服務(wù)器報(bào)告利用率相結(jié)合

我們選擇支持常用的Join-the-shortest-queue(JSQ)算法,并將服務(wù)器報(bào)告的利用率作為第二算法,以嘗試結(jié)合兩者達(dá)到最佳效果。

JSQ的問(wèn)題

Join-the-shortest-queue對(duì)于單個(gè)負(fù)載均衡器非常有效,但如果跨負(fù)載均衡器集群使用,則會(huì)出現(xiàn)嚴(yán)重問(wèn)題。負(fù)載均衡器會(huì)傾向于在同一時(shí)間選擇相同的低利用率服務(wù)器,從而造成超載,然后轉(zhuǎn)移到下一個(gè)利用率最低的服務(wù)器并造成超載,以此類(lèi)推……

通過(guò)結(jié)合使用JSQ和二選一算法,可以在很大程度上消除羊群?jiǎn)栴},除了負(fù)載均衡器沒(méi)有完整的服務(wù)器使用信息之外,其他方面都很好。

JSQ通常僅從本地負(fù)載均衡器計(jì)算到服務(wù)器的正在使用的連接數(shù)量來(lái)實(shí)現(xiàn),但是當(dāng)有10到100個(gè)負(fù)載均衡器節(jié)點(diǎn)時(shí),本地視圖可能會(huì)產(chǎn)生誤導(dǎo)。

f1cfdb6e-025c-11ee-90ce-dac502259ad0.png

單個(gè)負(fù)載平衡器的觀點(diǎn)可能與實(shí)際情況大不相同

例如,在上圖中,負(fù)載均衡器A有一個(gè)到服務(wù)器X的請(qǐng)求和一個(gè)到服務(wù)器Z的請(qǐng)求,但沒(méi)有到服務(wù)器Y的請(qǐng)求。所以當(dāng)它收到新請(qǐng)求時(shí),基于本地?cái)?shù)據(jù),選擇利用率最小的服務(wù)器,會(huì)選擇服務(wù)器Y,但這不是正確的選擇。服務(wù)器Y實(shí)際上負(fù)載最重,其他兩個(gè)負(fù)載均衡器目前都有請(qǐng)求發(fā)送到服務(wù)器Y上,但負(fù)載均衡器A沒(méi)有辦法知道。

這說(shuō)明單個(gè)負(fù)載均衡器的觀點(diǎn)與實(shí)際情況完全不同。

在只依賴客戶端視圖時(shí)遇到的另一個(gè)問(wèn)題是,對(duì)于大型集群(特別是與低流量相結(jié)合時(shí)),負(fù)載均衡器通常只有幾個(gè)活躍連接,和集群中的某個(gè)子集交互。因此,當(dāng)它選擇哪個(gè)服務(wù)器負(fù)載最少時(shí),通常只是在若干個(gè)它認(rèn)為負(fù)載都是0的服務(wù)器之間進(jìn)行選擇,而并沒(méi)有關(guān)于所選服務(wù)器的利用率的數(shù)據(jù),所以只能盲猜。

這個(gè)問(wèn)題的解決方案是與所有其他負(fù)載均衡器共享所有活躍連接數(shù)狀態(tài)……但這樣就需要解決分布式狀態(tài)問(wèn)題。

考慮到獲得的好處要大于付出的成本,因此我們通常只將分布式可變狀態(tài)作為最后手段:

分布式狀態(tài)增加了部署和金絲雀發(fā)布等任務(wù)的運(yùn)維開(kāi)銷(xiāo)和復(fù)雜性。

彈性風(fēng)險(xiǎn)與數(shù)據(jù)損壞的爆炸半徑相關(guān)(1%負(fù)載均衡器上數(shù)據(jù)損壞讓人煩惱,但100%負(fù)載均衡器上數(shù)據(jù)損壞會(huì)造成停機(jī))。

在負(fù)載均衡器之間實(shí)現(xiàn)P2P分布式狀態(tài)系統(tǒng)的成本,或者運(yùn)維一個(gè)具有處理大量讀寫(xiě)流量所需的性能和彈性憑證的單一數(shù)據(jù)庫(kù)的成本。

另一種更簡(jiǎn)單的解決方案(也是我們選擇的),是依賴于服務(wù)器向每個(gè)負(fù)載均衡器報(bào)告資源使用情況……

服務(wù)器報(bào)告使用率

服務(wù)器主動(dòng)上報(bào)其使用率的好處是可以提供所有使用了該服務(wù)器的負(fù)載均衡器的完整信息,從而避免JSQ的不完整問(wèn)題。

對(duì)此有兩種實(shí)現(xiàn)方式:

運(yùn)行狀況檢查端點(diǎn)主動(dòng)輪詢每個(gè)服務(wù)器的當(dāng)前利用率。

被動(dòng)跟蹤來(lái)自服務(wù)器的響應(yīng),并標(biāo)注其當(dāng)前利用率數(shù)據(jù)。

我們選擇第二種方式,其實(shí)現(xiàn)簡(jiǎn)單,可以頻繁更新數(shù)據(jù),避免了N個(gè)負(fù)載均衡器每隔幾秒鐘輪詢M個(gè)服務(wù)器所帶來(lái)的額外開(kāi)銷(xiāo)。

被動(dòng)策略的影響是,負(fù)載均衡器向一臺(tái)服務(wù)器發(fā)送請(qǐng)求的頻率越高,獲得的該服務(wù)器的利用率數(shù)據(jù)就越新。因此RPS越高,負(fù)載均衡的有效性就越高。但反過(guò)來(lái),RPS越低,負(fù)載均衡的效果就越差。

這對(duì)我們來(lái)說(shuō)不是問(wèn)題,但對(duì)于通過(guò)特定負(fù)載均衡器處理低RPS(同時(shí)通過(guò)另一個(gè)負(fù)載均衡器處理高RPS)的服務(wù)來(lái)說(shuō),主動(dòng)輪詢運(yùn)行狀況檢查可能更有效。臨界點(diǎn)是負(fù)載均衡器向每個(gè)服務(wù)器發(fā)送的RPS低于運(yùn)行狀況檢查的輪詢頻率。

服務(wù)端實(shí)現(xiàn)

我們?cè)诜?wù)端通過(guò)簡(jiǎn)單跟蹤活躍請(qǐng)求計(jì)數(shù)來(lái)實(shí)現(xiàn),將其轉(zhuǎn)換為該服務(wù)器配置的最大百分比,并將其作為HTTP響應(yīng)報(bào)頭:

X-Netflix.server.utilization: [, target=]

服務(wù)器可以指定可選的目標(biāo)利用率,從而標(biāo)識(shí)預(yù)期在正常條件下運(yùn)行的利用率百分比,負(fù)載均衡器基于這一數(shù)據(jù)進(jìn)行粗粒度過(guò)濾,后面會(huì)詳細(xì)介紹。

我們嘗試使用活躍計(jì)數(shù)以外的指標(biāo),例如操作系統(tǒng)報(bào)告的cpu利用率和平均負(fù)載,但發(fā)現(xiàn)它們會(huì)引起振蕩,原因似乎是因?yàn)樗鼈兪腔跐L動(dòng)平均值計(jì)算的,因此有一定的延遲。所以我們決定現(xiàn)在只用相對(duì)簡(jiǎn)單的實(shí)現(xiàn),即只計(jì)算活躍請(qǐng)求。

用二選一算法代替輪詢

由于我們希望能夠通過(guò)比較服務(wù)器的統(tǒng)計(jì)數(shù)據(jù)來(lái)選擇服務(wù)器,因此不得不拋棄現(xiàn)有的簡(jiǎn)單輪詢實(shí)現(xiàn)。

我們?cè)赗ibbon算法中嘗試的一個(gè)替代方案是JSQ與ServerListSubsetFilter相結(jié)合,以減少分布式JSQ的羊群?jiǎn)栴}。這樣可以得到合理的結(jié)果,但是結(jié)果在目標(biāo)服務(wù)器之間的請(qǐng)求分布仍然過(guò)于分散。

因此,我們參考了Netflix另一個(gè)團(tuán)隊(duì)的早期經(jīng)驗(yàn),并實(shí)現(xiàn)了"二選一(Choice-of-2)"算法。這樣做的優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,使負(fù)載均衡器的cpu成本較低,并能提供良好的請(qǐng)求分布。

根據(jù)綜合因素進(jìn)行選擇

為了在服務(wù)器之間進(jìn)行選擇,我們比較了3個(gè)不同的因素:

客戶端運(yùn)行狀況: 該服務(wù)器連接相關(guān)錯(cuò)誤的滾動(dòng)百分比。

服務(wù)器利用率: 該服務(wù)器的最新利用率數(shù)據(jù)。

客戶端利用率: 從當(dāng)前負(fù)載均衡器發(fā)送到該服務(wù)器的活躍請(qǐng)求數(shù)。

這3個(gè)因素被用來(lái)為每個(gè)服務(wù)器計(jì)算分?jǐn)?shù),然后比較總分?jǐn)?shù)選擇獲勝者。

像這樣使用多個(gè)因素確實(shí)會(huì)使實(shí)現(xiàn)更加復(fù)雜,但可以避免僅依賴一個(gè)因素可能出現(xiàn)的邊際問(wèn)題。

例如,如果一臺(tái)服務(wù)器開(kāi)始出現(xiàn)故障并拒絕所有請(qǐng)求,那么上報(bào)的利用率將會(huì)低得多(因?yàn)榫芙^請(qǐng)求比接受請(qǐng)求開(kāi)銷(xiāo)更小),如果這是唯一考慮的因素,那么所有負(fù)載均衡器將開(kāi)始向那臺(tái)壞服務(wù)器發(fā)送更多請(qǐng)求??蛻舳诉\(yùn)行狀況因素緩解了這種情況。

過(guò)濾

當(dāng)隨機(jī)選擇2臺(tái)服務(wù)器進(jìn)行比較時(shí),會(huì)過(guò)濾掉任何超過(guò)安全利用率配置和運(yùn)行狀況閾值的服務(wù)器。

每個(gè)請(qǐng)求都會(huì)進(jìn)行這種過(guò)濾,以避免定期過(guò)濾會(huì)出現(xiàn)的過(guò)時(shí)問(wèn)題。為了避免在負(fù)載均衡器上造成較高的cpu負(fù)載,我們盡力而為(best-effort)嘗試N次來(lái)隨機(jī)選擇一個(gè)可用服務(wù)器,然后在必要時(shí)回退到未篩選的服務(wù)器。

當(dāng)服務(wù)器池中有很大一部分存在長(zhǎng)期問(wèn)題時(shí),這樣的篩選非常有用。在這種情況下,隨機(jī)選擇2個(gè)服務(wù)器通常會(huì)出現(xiàn)選擇了2個(gè)壞服務(wù)器進(jìn)行比較的情況。

但缺點(diǎn)是這依賴于靜態(tài)配置閾值,而這是我們?cè)噲D避免的。測(cè)試結(jié)果讓我們相信這點(diǎn)依賴是值得的,即使只依賴一些通用(非特定于服務(wù)的)閾值。

試用期

對(duì)于任何沒(méi)有發(fā)送響應(yīng)給負(fù)載均衡器的服務(wù)器,一次只允許一個(gè)活躍請(qǐng)求,隨后會(huì)過(guò)濾掉這些試用服務(wù)器,直到收到來(lái)自它們的響應(yīng)。

這有助于避免新啟動(dòng)的服務(wù)器還沒(méi)有機(jī)會(huì)顯示使用率數(shù)據(jù)之前就因大量請(qǐng)求而超載。

基于服務(wù)器世代的預(yù)熱

我們基于服務(wù)器世代在服務(wù)器啟動(dòng)的前90秒內(nèi)逐步增加流量。

這是另一種有用的機(jī)制,就像試用期一樣,可以在微妙的發(fā)布后增加一些關(guān)于服務(wù)器過(guò)載的警告。

統(tǒng)計(jì)衰變

為確保服務(wù)器不會(huì)被永久列入黑名單,我們將衰減率應(yīng)用到所有用于負(fù)載均衡的統(tǒng)計(jì)數(shù)據(jù)上(目前是30秒的線性衰減)。例如,如果一個(gè)服務(wù)器的錯(cuò)誤率上升到80%,停止向它發(fā)送流量,使用的數(shù)據(jù)將在30秒內(nèi)衰減為零,比方說(shuō)15秒后是會(huì)是40%)。

運(yùn)維影響

差距更大的請(qǐng)求分布

不用輪詢進(jìn)行負(fù)載均衡的負(fù)面影響是,以前服務(wù)器之間的請(qǐng)求分布非常均衡,現(xiàn)在服務(wù)器之間的負(fù)載差距更大。

"二選一"算法在很大程度上能緩解這種情況(與跨集群中所有服務(wù)器或服務(wù)器子集的JSQ相比),但不可能完全避免。

因此,在運(yùn)維方面確實(shí)需要考慮這一點(diǎn),特別是在金絲雀分析中,我們通常比較請(qǐng)求計(jì)數(shù)、錯(cuò)誤率、cpu等的絕對(duì)值。

越慢的服務(wù)器接收的流量越少

顯然這是預(yù)期效果,但對(duì)于習(xí)慣于輪詢的團(tuán)隊(duì)來(lái)說(shuō),流量是平等分配的,這對(duì)運(yùn)維方面會(huì)產(chǎn)生連鎖反應(yīng)。

由于跨原始服務(wù)器的流量分布現(xiàn)在依賴于它們的利用率,如果一些服務(wù)器正在運(yùn)行效率更高或更低的不同構(gòu)建,那么將接收到更多或更少的流量。所以:

當(dāng)集群采用紅黑部署時(shí),如果新的服務(wù)器組性能下降,那么該組的流量比例將小于50%。

同樣的效果可以在金絲雀集群中看到,基線組可能會(huì)接收到與金絲雀組不同的流量。所以當(dāng)我們著眼于指標(biāo)時(shí),最好著眼于RPS和CPU的組合(例如RPS在金絲雀中可能更低,而CPU相同)。

更低效的異常值檢測(cè)。我們通常會(huì)自動(dòng)監(jiān)控集群中的異常服務(wù)器(通常是由于硬件問(wèn)題導(dǎo)致啟動(dòng)速度變慢的虛擬機(jī))并終止它們,當(dāng)由于負(fù)載均衡而接收較少流量時(shí),這種檢測(cè)就更加困難。

滾動(dòng)動(dòng)態(tài)數(shù)據(jù)更新

從輪詢遷移到新的負(fù)載均衡器取得了很好的效果,可以很好的配合動(dòng)態(tài)數(shù)據(jù)和屬性的分階段更新。

最佳實(shí)踐是每次在一個(gè)區(qū)域(數(shù)據(jù)中心)部署數(shù)據(jù)更新,以限制意外問(wèn)題的爆發(fā)半徑。

即使數(shù)據(jù)更新本身沒(méi)有引起任何問(wèn)題,服務(wù)器應(yīng)用更新的行為也會(huì)導(dǎo)致短暫的負(fù)載高峰(通常與GC相關(guān))。如果此峰值同時(shí)出現(xiàn)在集群中所有服務(wù)器上,則可能導(dǎo)致負(fù)載下降以及向上游傳播大量錯(cuò)誤。在這種情況下,因?yàn)樗蟹?wù)器的負(fù)載都很高,負(fù)載均衡器幾乎無(wú)法提供幫助。

然而,如果考慮與自適應(yīng)負(fù)載均衡器結(jié)合使用,一個(gè)解決方案是在集群服務(wù)器之間進(jìn)行滾動(dòng)數(shù)據(jù)更新。如果只有一小部分服務(wù)器同時(shí)應(yīng)用更新,那么只要還有足夠服務(wù)器能夠承載流量,負(fù)載均衡器就可以短暫減少到這些服務(wù)器的流量。

合成負(fù)載測(cè)試結(jié)果

在開(kāi)發(fā)、測(cè)試和調(diào)優(yōu)負(fù)載均衡器時(shí),我們廣泛使用了合成負(fù)載測(cè)試場(chǎng)景,這在使用真實(shí)集群和網(wǎng)絡(luò)驗(yàn)證有效性時(shí)非常有用,可以作為單元測(cè)試之后的可重復(fù)步驟,但還沒(méi)有使用真實(shí)用戶流量。

測(cè)試的更多細(xì)節(jié)在后面的附錄中列出,現(xiàn)總結(jié)要點(diǎn)如下:

與輪詢實(shí)現(xiàn)相比,啟用了所有功能的新負(fù)載均衡器在負(fù)載下降和連接錯(cuò)誤方面降低了幾個(gè)數(shù)量級(jí)。

平均和長(zhǎng)尾延遲有了實(shí)質(zhì)性改善(與輪詢實(shí)現(xiàn)相比減少了3倍)。

服務(wù)器本身由于添加了特性,顯著增加了價(jià)值,減少了一個(gè)數(shù)量級(jí)的錯(cuò)誤以及大部分延遲。

f1f5ca2c-025c-11ee-90ce-dac502259ad0.png

結(jié)果比較

對(duì)實(shí)際生產(chǎn)流量的影響

我們發(fā)現(xiàn),只要服務(wù)器能夠處理,新負(fù)載均衡器就能非常有效的將盡可能多的流量分配到每個(gè)服務(wù)器。這對(duì)于在間歇和持續(xù)降級(jí)的服務(wù)器之間進(jìn)行路由具有很好的效果,無(wú)需任何人工干預(yù),從而避免工程師在半夜被叫醒處理重大生產(chǎn)問(wèn)題。

很難說(shuō)明在正常運(yùn)行時(shí)的影響,但在生產(chǎn)事故中甚至在某些服務(wù)的正常穩(wěn)態(tài)運(yùn)行中,可以看到對(duì)應(yīng)的影響。

事故發(fā)生時(shí)

最近的事故涉及到服務(wù)中的錯(cuò)誤,該錯(cuò)誤導(dǎo)致越來(lái)越多的服務(wù)器線程隨著時(shí)間的推移而阻塞。從服務(wù)器啟動(dòng)的那一刻起,每小時(shí)都會(huì)阻塞幾個(gè)線程,直到最終達(dá)到最大負(fù)載并造成負(fù)載下降。

在下面的服務(wù)器RPS圖表中,可以看到在凌晨3點(diǎn)之前,服務(wù)器負(fù)載分布差距較大,這是由于負(fù)載均衡器向阻塞線程數(shù)量較多的服務(wù)器發(fā)送較少流量的緣故。然后,在凌晨3點(diǎn)25分之后,自動(dòng)縮放啟動(dòng)更多服務(wù)器,由于這些服務(wù)器還沒(méi)有任何線程阻塞,每個(gè)服務(wù)器收到的RPS大約是現(xiàn)有服務(wù)器的兩倍,可以成功處理更多流量。

f21a28b8-025c-11ee-90ce-dac502259ad0.png

每服務(wù)器RPS

現(xiàn)在,如果我們看一下同一時(shí)間范圍內(nèi)每臺(tái)服務(wù)器的錯(cuò)誤率圖表,可以看到,在整個(gè)事故過(guò)程中,所有服務(wù)器的錯(cuò)誤分布是相當(dāng)均勻的,盡管某些服務(wù)器的容量比其他服務(wù)器小得多。這表明負(fù)載均衡器在有效工作,而由于集群整體可用容量太小,因此所有服務(wù)器都被推到稍稍超過(guò)其有效容量的位置。

然后,當(dāng)自動(dòng)縮放啟動(dòng)新服務(wù)器時(shí),新服務(wù)器處理了盡可能多的流量,以至于出現(xiàn)了與集群其他部分相同的錯(cuò)誤。

f24fd9e0-025c-11ee-90ce-dac502259ad0.png

每服務(wù)器每秒錯(cuò)誤

因此,綜上所述,負(fù)載均衡器在向服務(wù)器分配流量方面非常有效,但在這種情況下,沒(méi)有啟動(dòng)足夠的新服務(wù)器,從而導(dǎo)致沒(méi)法將整體錯(cuò)誤水平降至零。

穩(wěn)態(tài)

我們還看到,在某些服務(wù)中,由于GC事件而出現(xiàn)幾秒鐘的負(fù)載下降,因此穩(wěn)態(tài)噪聲顯著降低。從這里可以看出,啟用新的負(fù)載均衡器后,錯(cuò)誤大幅減少:

f28818b4-025c-11ee-90ce-dac502259ad0.png

啟用新負(fù)載均衡器前后數(shù)周內(nèi)與負(fù)載相關(guān)的錯(cuò)誤率

告警中的差距

一個(gè)意料之外的影響是突出了我們自動(dòng)告警中的一些差距。一些基于服務(wù)錯(cuò)誤率的現(xiàn)有告警,以前會(huì)在漸進(jìn)式問(wèn)題只影響到集群的一小部分時(shí)發(fā)出告警,現(xiàn)在因?yàn)殄e(cuò)誤率一直很低,告警會(huì)晚得多,或者根本不發(fā)出告警。這意味著,有時(shí)沒(méi)法將影響集群的大問(wèn)題通知給團(tuán)隊(duì)。解決方案是增加對(duì)利用率指標(biāo)的偏差而不僅僅是錯(cuò)誤指標(biāo)的額外告警來(lái)彌補(bǔ)這些差距。

結(jié)論

本文并不是為Zuul做宣傳(盡管它是一個(gè)偉大的系統(tǒng)),只是為代理/服務(wù)網(wǎng)格/負(fù)載均衡社區(qū)分享和增加了一個(gè)有趣的方法。Zuul是測(cè)試、實(shí)施和改進(jìn)這些類(lèi)型負(fù)載均衡方案的偉大系統(tǒng),以Netflix的需求和規(guī)模來(lái)運(yùn)行,使我們有能力證明和改進(jìn)這些方法。

有許多不同方法可以改善負(fù)載均衡,而這個(gè)方法對(duì)我們來(lái)說(shuō)效果很好,大大減少了與負(fù)載有關(guān)的錯(cuò)誤率,并極大改善了真實(shí)流量的負(fù)載均衡。

然而,對(duì)于任何軟件系統(tǒng)來(lái)說(shuō),都應(yīng)該根據(jù)自己組織的限制和目標(biāo)來(lái)做決定,并盡量避免追求完美。

附錄--合成負(fù)載測(cè)試的結(jié)果

測(cè)試場(chǎng)景

這個(gè)負(fù)載測(cè)試場(chǎng)景重現(xiàn)了這樣一種情況: 小型原始集群正在進(jìn)行紅黑部署,而新部署的集群存在冷啟動(dòng)問(wèn)題或某種性能退化(通過(guò)人為在新部署的服務(wù)器上為每個(gè)請(qǐng)求注入額外延遲和cpu負(fù)載來(lái)模擬)。

該測(cè)試將4000 RPS發(fā)送到一個(gè)大型Zuul集群(200個(gè)節(jié)點(diǎn)),該集群反過(guò)來(lái)代理到一個(gè)小型Origin集群(20個(gè)實(shí)例),幾分鐘后,啟用第二個(gè)緩慢的Origin集群(另外20個(gè)實(shí)例)。

啟用所有功能

以下是啟用了所有功能的新負(fù)載均衡器的指標(biāo)圖表。

f2bb6a66-025c-11ee-90ce-dac502259ad0.png

啟用新負(fù)載均衡器所有功能進(jìn)行負(fù)載測(cè)試

作為參考,看看流量是如何在較快和較慢的服務(wù)器組之間分配的,可以看到,負(fù)載均衡器把發(fā)送到較慢組的比例減少到15%左右(預(yù)期50%)。

f2eb9452-025c-11ee-90ce-dac502259ad0.png

正常集群和慢速集群之間的流量分布

禁用服務(wù)器利用率

還是新負(fù)載均衡器,但禁用了服務(wù)器利用率功能,因此只有客戶端數(shù)據(jù)被用于均衡。

f30c7b68-025c-11ee-90ce-dac502259ad0.png

使用新負(fù)載均衡器進(jìn)行負(fù)載測(cè)試,但禁用了服務(wù)器利用率特性

原始實(shí)現(xiàn)

這是最初的輪詢負(fù)載均衡器與服務(wù)器黑名單功能。

f3448198-025c-11ee-90ce-dac502259ad0.png

使用原始負(fù)載均衡器進(jìn)行負(fù)載測(cè)試

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 均衡器
    +關(guān)注

    關(guān)注

    9

    文章

    215

    瀏覽量

    30355
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9165

    瀏覽量

    85437
  • 負(fù)載均衡
    +關(guān)注

    關(guān)注

    0

    文章

    111

    瀏覽量

    12368
  • Netflix
    +關(guān)注

    關(guān)注

    0

    文章

    90

    瀏覽量

    11216

原文標(biāo)題:重新思考邊緣負(fù)載均衡

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    負(fù)載均衡(Load Balance)

    負(fù)載均衡(Load Balance)   &nbs
    發(fā)表于 01-08 14:39 ?853次閱讀

    什么是服務(wù)器網(wǎng)絡(luò)負(fù)載均衡

    什么是服務(wù)器網(wǎng)絡(luò)負(fù)載均衡 什么是負(fù)載均衡?
    發(fā)表于 01-11 10:58 ?1803次閱讀

    負(fù)載均衡是什么意思?負(fù)載均衡器有什么用

    負(fù)載平衡也稱負(fù)載共享,是指對(duì)系統(tǒng)中的負(fù)載情況進(jìn)行動(dòng)態(tài)調(diào)整,以盡量消除或減少系統(tǒng)中各節(jié)點(diǎn)負(fù)載均衡的現(xiàn)象。
    發(fā)表于 12-21 09:48 ?1.9w次閱讀
    <b class='flag-5'>負(fù)載</b><b class='flag-5'>均衡</b>是什么意思?<b class='flag-5'>負(fù)載</b><b class='flag-5'>均衡</b>器有什么用

    負(fù)載均衡服務(wù)器有哪些

    負(fù)載均衡服務(wù)器是進(jìn)行負(fù)載分配的服務(wù)器。通過(guò)負(fù)載均衡服務(wù)器,將服務(wù)請(qǐng)求均衡分配到實(shí)際執(zhí)行的服務(wù)中,
    發(fā)表于 12-21 10:02 ?1167次閱讀
    <b class='flag-5'>負(fù)載</b><b class='flag-5'>均衡</b>服務(wù)器有哪些

    基于C-V2X邊緣服務(wù)器的動(dòng)態(tài)負(fù)載均衡算法及研究

    為更好地解決蜂窩車(chē)聯(lián)網(wǎng)與移動(dòng)邊緣計(jì)算融合應(yīng)用場(chǎng)景下邊緣服務(wù)器資源負(fù)載分配不均、資源利用率較低等問(wèn)題,提岀一種動(dòng)態(tài)負(fù)載均衡算法。通過(guò)監(jiān)測(cè)
    發(fā)表于 03-15 17:17 ?16次下載
    基于C-V2X<b class='flag-5'>邊緣</b>服務(wù)器的動(dòng)態(tài)<b class='flag-5'>負(fù)載</b><b class='flag-5'>均衡</b>算法及研究

    服務(wù)器負(fù)載均衡有幾種類(lèi)型,做負(fù)載均衡好在哪

    對(duì)于服務(wù)器負(fù)載均衡可能很多朋友并不了解是什么,服務(wù)器負(fù)載均衡的簡(jiǎn)單理解就是指對(duì)系統(tǒng)中的負(fù)載情況進(jìn)行動(dòng)態(tài)調(diào)整,以盡量消除或減少系統(tǒng)中各節(jié)點(diǎn)
    的頭像 發(fā)表于 09-02 17:57 ?3279次閱讀

    apache反向代理和負(fù)載均衡總結(jié)

    apache反向代理和負(fù)載均衡總結(jié)(5g電源技術(shù)要求)-apache反向代理和負(fù)載均衡總結(jié) ? ? ? ? ? ? ? ?
    發(fā)表于 08-31 12:27 ?0次下載
    apache反向代理和<b class='flag-5'>負(fù)載</b><b class='flag-5'>均衡</b>總結(jié)

    Apacheproxy負(fù)載均衡和Session復(fù)制

    Apacheproxy負(fù)載均衡和Session復(fù)制(電源技術(shù)交流群)-Apacheproxy負(fù)載均衡和Session復(fù)制? ? ? ? ? ? ? ? ? ??
    發(fā)表于 08-31 12:29 ?0次下載
    Apacheproxy<b class='flag-5'>負(fù)載</b><b class='flag-5'>均衡</b>和Session復(fù)制

    解密負(fù)載均衡技術(shù)和負(fù)載均衡算法

    負(fù)載均衡器是一種軟件或硬件設(shè)備,它起到了將網(wǎng)絡(luò)流量分散到一組服務(wù)器的作用,可以防止任何一臺(tái)服務(wù)器過(guò)載。負(fù)載均衡算法就是負(fù)載
    的頭像 發(fā)表于 11-12 09:16 ?1132次閱讀

    高性能負(fù)載均衡的分類(lèi)和算法

    高性能集群之所以復(fù)雜,主要原因是增加了任務(wù)分配器,以及為任務(wù)選擇合適的分配算法。負(fù)載均衡器就是任務(wù)分配器,負(fù)載均衡這個(gè)名稱已經(jīng)成為事實(shí)標(biāo)準(zhǔn),但負(fù)載
    的頭像 發(fā)表于 05-31 09:56 ?748次閱讀
    高性能<b class='flag-5'>負(fù)載</b><b class='flag-5'>均衡</b>的分類(lèi)和算法

    負(fù)載均衡是如何工作的?

    負(fù)載均衡是在多個(gè)物理服務(wù)器之間智能分配流量以最大化資源利用率的過(guò)程。換句話說(shuō),在兩臺(tái)或多臺(tái)計(jì)算機(jī)/服務(wù)器之間共享計(jì)算工作負(fù)載的過(guò)程就是負(fù)載均衡
    的頭像 發(fā)表于 06-15 17:26 ?689次閱讀

    SDWAN和負(fù)載均衡的關(guān)系

    SDWAN和負(fù)載均衡的關(guān)系
    的頭像 發(fā)表于 07-21 14:28 ?571次閱讀

    常見(jiàn)的幾種負(fù)載均衡技術(shù)介紹

    在大力建設(shè)算力網(wǎng)絡(luò)的大背景下,隨著SDN思潮的深入推進(jìn)、網(wǎng)絡(luò)集群的部署,負(fù)載均衡成為了一種不可或缺的技術(shù),它在云,網(wǎng),邊都起了至關(guān)重要的作用。本文會(huì)對(duì)常見(jiàn)的幾種負(fù)載均衡技術(shù)進(jìn)行介紹,同
    的頭像 發(fā)表于 09-25 10:30 ?1712次閱讀
    常見(jiàn)的幾種<b class='flag-5'>負(fù)載</b><b class='flag-5'>均衡</b>技術(shù)介紹

    如何確定適合的負(fù)載均衡比例

    路由器的負(fù)載均衡是一種應(yīng)用于網(wǎng)絡(luò)中的技術(shù),它可以平衡網(wǎng)絡(luò)流量的分配,提高網(wǎng)絡(luò)的性能和穩(wěn)定性。在配置路由器的負(fù)載均衡時(shí),選擇合適的負(fù)載
    的頭像 發(fā)表于 12-15 10:36 ?1579次閱讀

    nginx負(fù)載均衡配置介紹

    目錄 nginx負(fù)載均衡 nginx負(fù)載均衡介紹 反向代理與負(fù)載均衡 nginx
    的頭像 發(fā)表于 11-10 13:39 ?246次閱讀
    nginx<b class='flag-5'>負(fù)載</b><b class='flag-5'>均衡</b>配置介紹