目標(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)。
單個(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:
服務(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ò)誤以及大部分延遲。
結(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ù)器的兩倍,可以成功處理更多流量。
每服務(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ò)誤。
每服務(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ò)誤大幅減少:
啟用新負(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)圖表。
啟用新負(fù)載均衡器所有功能進(jìn)行負(fù)載測(cè)試
作為參考,看看流量是如何在較快和較慢的服務(wù)器組之間分配的,可以看到,負(fù)載均衡器把發(fā)送到較慢組的比例減少到15%左右(預(yù)期50%)。
正常集群和慢速集群之間的流量分布
禁用服務(wù)器利用率
還是新負(fù)載均衡器,但禁用了服務(wù)器利用率功能,因此只有客戶端數(shù)據(jù)被用于均衡。
使用新負(fù)載均衡器進(jìn)行負(fù)載測(cè)試,但禁用了服務(wù)器利用率特性
原始實(shí)現(xiàn)
這是最初的輪詢負(fù)載均衡器與服務(wù)器黑名單功能。
使用原始負(fù)載均衡器進(jìn)行負(fù)載測(cè)試
審核編輯:湯梓紅
-
均衡器
+關(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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論