阿里技术解密:全链路压测体系建设方案的思考与实践
在阿里淘寶 雙11 的過程中,長期以來都是在生產(chǎn)環(huán)節(jié)做全鏈路壓測的,通過實(shí)踐我們發(fā)現(xiàn)在生產(chǎn)環(huán)境中做壓測,實(shí)際上會和一個 IT 組織的結(jié)構(gòu)、成熟度、流程等緊密相關(guān),所以我們把全鏈路壓測從簡單的制作范圍內(nèi)脫離出來,變成整個業(yè)務(wù)連續(xù)性的方案。
本文分四個方面為大家闡述:第一,整個全鏈路壓測的意義,為什么要在生產(chǎn)環(huán)節(jié)上做全鏈路壓測;第二,關(guān)于落地的技術(shù)點(diǎn)和解決方案;第三,生產(chǎn)過程中做全鏈路壓測流程上的建議,考慮到每個組織的承受度不一樣,給大家提供一些建議;第四,如何在第三方實(shí)現(xiàn)整個在生產(chǎn)環(huán)境中做業(yè)務(wù)連續(xù)性包括壓測的結(jié)果。
全鏈路壓測的意義?
ALIWARE
上圖顯示了三個問題,實(shí)際上是不同的 IT 組織在和測試交流的時候,這三個問題是比較有代表性的。
1. 很多測試同行說他們線下也做過性能測試,但是到了線上之后還是存在很多問題,因?yàn)椴惶赡軙诰€下模擬一個跟線上 1:1 的環(huán)境。在有很多第三方接口的情況下,大家也很少會去模擬線上整個場景。因此我們在線下做了很多測試工作后,總結(jié)出了為什么很多從線下容量推導(dǎo)到線上容量的公司卻最終效果不是很好,就是這樣的原因。
2. 現(xiàn)在所有的 IT 組織都在搞 DevOps,我們的功能從一個月迭代一次到現(xiàn)在一周迭代一次,留給測試的時間越來越短。功能測試時間從之前的一周、兩周縮短到現(xiàn)在三四天、兩三天的時間,那性能測試就沒有辦法按時上線,很有可能會出現(xiàn)各種各樣的性能問題,這會直接影響到企業(yè)的品牌影響力。
3. 平時線上水位比較低,很少達(dá)到高峰期,但是會出現(xiàn)一些突發(fā)情況。比如像去年的疫情使得很多公司的業(yè)務(wù)變成在線業(yè)務(wù)。比如教育行業(yè),之前是課堂上老師面對面的教育,現(xiàn)在選擇線上在線平臺來做,這類突發(fā)的情況會使測試工程師,包括開發(fā)運(yùn)維團(tuán)隊(duì)受到很大的困擾。在這之前我先介紹一個概念,這個概念是由《黑天鵝》的原作者 Nassim Nicholas Taleb 提出,概念中心是脆弱與反脆弱。
什么是脆弱?脆弱就像玻璃,大家知道玻璃很脆易碎。脆弱的反義詞是什么?不是強(qiáng)韌也不是堅(jiān)韌,可能是反脆弱。什么是反脆弱呢?比如乒乓球,大家知道乒乓球在地上不用很大的力就可以破壞掉,踩一腳就破壞掉了,但是高速運(yùn)動的情況下,乒乓球我們施加的力度越大,它的反彈力度越大,說明乒乓球在運(yùn)動過程中有反脆弱的特性。
我們的 IT 系統(tǒng)實(shí)際上也是這樣的。不管什么代碼都不能保證是完全沒有問題的,我們的基礎(chǔ)設(shè)施可能也是脆弱的,像服務(wù)器、數(shù)據(jù)庫等總會有局限。我們的框架也總是脆弱的,將這些問題綜合在一起,我們希望通過某些手段,比如通過預(yù)案、風(fēng)險(xiǎn)的識別,或者通過一些熔斷的手段,最終把這些東西組合在一起,讓整個 IT 系統(tǒng)有反脆弱的特性。總之,我們希望通過一些手段使得 IT 系統(tǒng)有足夠的冗余,而且有足夠多的預(yù)案應(yīng)對突發(fā)的不確定性風(fēng)險(xiǎn)。
如何打造 IT 系統(tǒng)反脆弱能力呢?我們希望通過一些手段,比如說像線上的壓測能力,提供不確定的因素,接著通過在這個過程中實(shí)時監(jiān)控,包括預(yù)案的能力,最終把這些不確定性的因素識別出來,并且在線上生產(chǎn)壓測過程中對它做一些處理,更多可能會通過事后復(fù)盤等方式,做到對不確定性因素的識別。接著我們可能會在生產(chǎn)環(huán)境中通過之前的手段,在生產(chǎn)環(huán)境上做一個穩(wěn)定性的常態(tài)化壓測,實(shí)現(xiàn)長期穩(wěn)定的場景,最終我們可能達(dá)到反脆弱能力所需要的整體監(jiān)控的能力、運(yùn)營防護(hù)能力,以及管控路由能力,這會讓整個 IT 系統(tǒng)具備反脆弱的特性。
全鏈路壓測解決方案
ALIWARE
如何在生產(chǎn)環(huán)境上做全鏈路壓測?它需要用到哪些技術(shù)手段?
1
壓測進(jìn)程演變
一般情況下,測試是怎么樣從線下一點(diǎn)點(diǎn)往線上演變的?我把它分為四個階段:
1. 目前絕大多數(shù) IT 可以做到的是線下單系統(tǒng)壓測,即針對單個接口或者單個場景做壓測,同時也會做系統(tǒng)分析和性能分析。但在復(fù)雜的業(yè)務(wù)場景之下,我們可能沒辦法去充分發(fā)現(xiàn)問題,很多都是由開發(fā)或者測試同學(xué)自發(fā)進(jìn)行的活動。
2. 我們成立了一個類似于測試實(shí)驗(yàn)室或者測試組織的機(jī)構(gòu),這樣一個大的部門可能會構(gòu)造出一批類似于生產(chǎn)環(huán)境的性能測試環(huán)境,在這上面我們可能會做更多的事情,比如說做一個線下環(huán)境的全鏈路壓測,并且我們可以根據(jù)之前積累的經(jīng)驗(yàn)在上面做一些線下的回歸,包括性能的診斷等。其實(shí)這一步相當(dāng)于整個測試往前再走一步,對測試環(huán)境中的鏈路做一些分析,在上面演變一些能力,比如說風(fēng)險(xiǎn)的控制等等。
3. 目前絕大部分 IT 企業(yè)和互聯(lián)網(wǎng)企業(yè)愿意嘗試線上生產(chǎn)環(huán)境的業(yè)務(wù)壓測。這部分實(shí)際上和之前的第二階段相差不多,但是在這個過程中人為的把它分為了兩層:第一層是單純的做全鏈路壓測,很多 IT 公司已經(jīng)在非生產(chǎn)環(huán)節(jié)中做了只讀業(yè)務(wù)的壓測,因?yàn)檫@樣不會對數(shù)據(jù)造成污染。而再往下一層?,有些組織可能會在正常生產(chǎn)時段中做進(jìn)一步的全鏈路壓測,這種情況下我們就會要求這個組織擁有更高的能力。
比如說我們需要對整個壓測流量做一些染色,能夠區(qū)分出來正常的業(yè)務(wù)數(shù)據(jù),正常的流量和非正常的壓測流量,可能有的會做一些環(huán)境的隔離,而在業(yè)務(wù)生產(chǎn)期間內(nèi)我們做生產(chǎn)的壓測,需要考慮到整個流量的偏移、限流,包括熔斷機(jī)制等。不管怎樣做業(yè)務(wù),可能都會對最終的生產(chǎn)業(yè)務(wù)造成一定的影響,真正出現(xiàn)問題的時候可能需要有快速的熔斷機(jī)制。
4. 做到壓縮熔斷渲染,包括對熔斷的機(jī)制——有了這樣的能力之后,最后一個階段就是整個生產(chǎn)鏈路的全鏈路壓測,包括讀寫,它就具備了基本能力。這個方面我們其實(shí)更多的是通過引入庫表,加上技術(shù)手段,在這個生產(chǎn)上做全鏈路壓測,包括讀業(yè)務(wù)、寫業(yè)務(wù)等,同時我們有系統(tǒng)故障演練和生產(chǎn)變更演練的能力,在這種情況下我們可能最終具備了數(shù)據(jù)隔離能力、監(jiān)控隔離能力和日志隔離能力。
2
全鏈路壓測關(guān)鍵技術(shù)
對于整個全鏈路壓測來說,我們需要幾個關(guān)鍵的技術(shù):
全鏈路流量染色
可能通過在壓縮機(jī)上做一些標(biāo)識,比如加一個后綴,或者通過一些標(biāo)識手段把流量讀出來,分散到相關(guān)的表里去。同時在全鏈路流量展示過程中我們還需要做流量的識別,對于壓測流量經(jīng)過的每一個中間件,每一個服務(wù)我們都希望能夠準(zhǔn)確的識別出來,這個流量是來自于壓測機(jī)還是來自于正常流量,這是第一步。
全鏈路的數(shù)據(jù)隔離
我們需要通過哪些手段,比如通過影子庫,通過運(yùn)維的同學(xué)做一個和生產(chǎn)上面同樣的影子庫,然后切到影子庫上,或者在生產(chǎn)庫上做一個相同的影子表,來做數(shù)據(jù)隔離。第一種方式安全度高一些,但是缺點(diǎn)在于我們用影子庫的時候整個生產(chǎn)環(huán)境是不可用的。生產(chǎn)影子庫不能完全模擬出整個線上的情況,因?yàn)橛白颖硇枰覀冇懈叩募夹g(shù)水平,能夠保障整個鏈路可追蹤,包括整個數(shù)據(jù)如果一旦出錯數(shù)據(jù)恢復(fù)能力等等。
全鏈路風(fēng)險(xiǎn)管控機(jī)制
也就是風(fēng)險(xiǎn)熔斷機(jī)制,一旦真的發(fā)現(xiàn)生產(chǎn)環(huán)境的線上壓測對我們的業(yè)務(wù)造成了影響,我們需要通過一些規(guī)則或者其他的指標(biāo)來自動觸發(fā)風(fēng)險(xiǎn)熔斷,包括管控等等這樣的手段,不管是提供施壓機(jī)的流量,還是把生產(chǎn)系統(tǒng)損壞的部分做業(yè)務(wù)隔離,這樣的手段都是我們做生產(chǎn)過程中全鏈路壓測的必要手段。
全鏈路日志日志隔離
其實(shí)日志本身不會對全鏈路造成太大的影響,但是因?yàn)樽鰯?shù)字化水平的提升,日志基本上是BI同學(xué)包括運(yùn)營的同學(xué)對整個業(yè)務(wù)分析最重要的數(shù)據(jù)來源,如果我們不做日志隔離很有可能會對 BI 決策造成一定的影響,比如壓測過程中我們會大量采用某個地域的流量對生產(chǎn)環(huán)境做訪問,BI 的同學(xué)可能會通過日志分析發(fā)現(xiàn)某一個地區(qū)做大,導(dǎo)致他錯誤的運(yùn)營決策,所以說對于生產(chǎn)過程中的全鏈路壓測來說,我們需要在整個生產(chǎn)過程中做一定的日志隔離,區(qū)分出來正常的生產(chǎn)流量和壓測流量之間的存儲。
3
全鏈路壓測和業(yè)務(wù)連續(xù)性平臺核心功能
這部分是真正想作為全鏈路壓測和業(yè)務(wù)連續(xù)性平臺所需要的功能。
1. 首先是有來自于全地域的壓測流量工具,這個流量工具具備的功能包括全地域流量挖掘、流量改造相關(guān)的功能。
2. 整個壓測識別,包括影子存儲一部分的功能。黃色的部分是正常流量,藍(lán)色的部分是壓測的流量,我們可能通過施壓機(jī)的改造讓藍(lán)色的部分加入一些標(biāo)識,通過 Agent 的技術(shù),它可以標(biāo)識出帶有的流量,通過底層的 Agent 技術(shù)將這些落到相應(yīng)的影子庫或者影子表里去,或者是緩存的影子區(qū)里。
3. 做熔斷的規(guī)則管理,所以需要有合理的控制臺,這里可能會做一些安裝探針管理,包括整個架構(gòu)的管理、庫表的維護(hù)、規(guī)則的維護(hù)、熔斷機(jī)制的維護(hù)等。
4. 最后是真正的施壓部分。這里可能會安裝一些探針或者是 Agent,這些 Agent 的作用是能夠讓這些流量落到相應(yīng)的影子表里去,還有是通過相應(yīng)的監(jiān)控指標(biāo),比如說我們的錯誤達(dá)到 1%,或者是檢查時間超過了一定的閾值之后,Agent 會及時上報(bào),通過規(guī)則配置起到限流的作用。
通過這套架構(gòu),我們現(xiàn)在可以做到目前比按照整體環(huán)境大約節(jié)省成本是 40%左右,基本上對整個生產(chǎn)業(yè)務(wù)沒有任何切入。
4
全鏈路壓測風(fēng)險(xiǎn)防控能力
下面來具體談一談如何做一個影子數(shù)據(jù)庫,包括整個流量識別。
橙色的部分是真正的壓測流量,這部分我們會在施壓機(jī)上做一個標(biāo)識,現(xiàn)在是會加一個后綴。另外還會在服務(wù)器做 filter,它其實(shí)是攔截器,我們會攔截到流量里面相關(guān)的標(biāo)識,然后把它做區(qū)分、做染色,并且做跟蹤,每一個請求基本上可以真正做到在任何中間件以及項(xiàng)目堆里都是透明可見的。
真正在壓測過程中通過 Agent 字節(jié)碼結(jié)束將它直接改寫,將字節(jié)的條件替換成壓縮的條件。當(dāng)然要先把影子庫建好,通過底層的追蹤我們可以把相應(yīng)的流量,如果數(shù)據(jù)庫就會走得比較明確,之后我們會做流量的測試,看看是否比較明確,而且我們可以做到整個測試數(shù)據(jù)帶有標(biāo)識,一旦真的沒有走到診斷里面去,我們也可以在正常的表里做刪除,并且每一個經(jīng)過的區(qū)域?qū)ξ覀儊碚f都是可見的。
通過這樣的方式,目前絕大部分 IT 組織是分三個階段,當(dāng)然有一些非常成熟的是分為兩個階段:
1. 在上線之前發(fā)現(xiàn)問題,大多是由線下的開發(fā)或者測試調(diào)試過程中發(fā)現(xiàn)問題,然后做到整個接口的優(yōu)化,確保最后沒有代碼的問題,包括 DNS 問題。這類問題基本上是在線下的環(huán)境,開發(fā)的環(huán)境解決掉。
2. 在部署過程中,我們會做第三方插件比如安全等等問題,但是目前隨著容器的發(fā)展,開發(fā)部署環(huán)境會被逐漸淡化掉。
3. 在線上真正做生產(chǎn)環(huán)境的壓測,這部分可能會做容量規(guī)劃或者是壓測,其他像整個大環(huán)境,比如說 CDN 或者 DNS問題,或者是整個線上系統(tǒng)容量評估等等問題。
這些是我們目前在整個測試生命周期里希望在各個階段實(shí)現(xiàn)的目的。
壓測流程的建議
ALIWARE
考慮到各個組織的成熟度不一樣,我們提供的這些建議不一定適用于所有的 IT 組織,但大家可以根據(jù)自身情況參考一下。
我們一般為第三方實(shí)施全鏈路壓測,線上生產(chǎn)壓測,會經(jīng)歷五個階段:
首先是和第三方一起梳理業(yè)務(wù)的階段,我們會做以下幾件事情:
1.根據(jù)過往系統(tǒng)使用情況評估業(yè)務(wù)系統(tǒng)的性能指標(biāo)、容量指標(biāo);
2.對現(xiàn)有信息系統(tǒng)做系統(tǒng)架構(gòu)的梳理,確定整個被染色流量的路徑途徑;
3.對壓測時長,包括間隔等做溝通,確認(rèn)相關(guān)的壓測場景設(shè)計(jì);
4.生產(chǎn)數(shù)據(jù)脫敏,如果有一部分涉及到生產(chǎn)數(shù)據(jù)可能會做生產(chǎn)數(shù)據(jù)的脫敏等相關(guān)工作。
這部分做完是做第二部分,對某些應(yīng)用進(jìn)行改造。比如說做流量打標(biāo)工作,通過監(jiān)控的流量確定業(yè)務(wù)系統(tǒng),可能在業(yè)務(wù)系統(tǒng)里會做相關(guān)監(jiān)控的接入,相關(guān)的第三方組件會進(jìn)行 Mock,整個壓測場景的創(chuàng)建會和第三方溝通好。包括流量表建設(shè)和預(yù)案等等接入。
三是整個壓測的過程,整個生產(chǎn)狀態(tài)下的全鏈路壓測,會對整個系統(tǒng)進(jìn)行性能優(yōu)化及容量評估。
四是將線上全鏈路壓測常態(tài)化,這里面會有一些事情,比如說限流、降級、混沌工程驗(yàn)收,包括生產(chǎn)發(fā)布的事情。
五是對于整個活動做復(fù)盤,看應(yīng)急預(yù)案是否生效,還有哪些地方需要優(yōu)化,這是生產(chǎn)環(huán)節(jié)全鏈路壓測的生命周期。
我們現(xiàn)在做一些更深入的東西,整個開發(fā)過程中,目前大家都使用 DevOps,可能單接口的性能測試在過程中就已經(jīng)用到了,目前我們給企業(yè)打造的都包含了接口級別的單機(jī)性能測試,使用單機(jī)測試工具,在發(fā)布過程中開始驗(yàn)收單接口的性能問題,保證這個接口發(fā)到線上不會有代碼級別錯誤,最終會省掉集成壓測包括測試環(huán)境中壓測的步驟,直接走到線上壓測這個過程。單接口階段我們會支持相應(yīng)主流的框架壓測,目前我們也在不斷做測試環(huán)境集群的壓測支持,還是希望直接用戶跳過這個步驟開始在線上直接做流量隔離的壓測。
上圖是我們認(rèn)為一個完整的業(yè)務(wù)連續(xù)性平臺需要的功能。
1.壓測流量發(fā)起的控制臺,流量發(fā)起端,這塊實(shí)際上是管理整個壓測流量和場景設(shè)計(jì);
2.流量隔離控制臺,這部分希望能夠做到統(tǒng)一切流,當(dāng)出現(xiàn)問題的時候可以一下把壓測流量切掉,統(tǒng)一路由;
3.壓測過程中有整個流量監(jiān)控包括系統(tǒng)監(jiān)控;壓測過程中對于整個應(yīng)用的性能監(jiān)控平臺,包括鏈路監(jiān)控、JVM 監(jiān)控、組件監(jiān)控等等;
4.真正的混沌工程,包括流控規(guī)則、隔離規(guī)則、降級規(guī)則等等平臺,這里會維護(hù)相應(yīng)的規(guī)則。
最終我們希望這個平臺能夠達(dá)到的目的是:隨時隨地以低成本實(shí)現(xiàn)全鏈路壓測;對于運(yùn)維平臺可以進(jìn)行周期性的故障演練,并把這種能力給運(yùn)維團(tuán)隊(duì),讓他們隨時隨地發(fā)起變更;為整個上線活動包括大促做一些兜底,可以避免突發(fā)活動擊穿。因?yàn)殚L期固化生產(chǎn)壓測會為我們帶來容量和水位的極限,在演練過程中進(jìn)行預(yù)案的實(shí)施,突發(fā)過程中會有更好的手段去避免,去做防護(hù)。
以阿里為例,現(xiàn)在基本上可以做到以按月為主,因?yàn)榇蠹抑捞詫毭總€月都有活動,每年有三個大活動:6.18、雙11、雙12。我們目前可以做小的演練,以周為實(shí)施單位做 雙11、雙12 或者 6.18 的大促,而且我們可以很清晰的組織 BU 內(nèi)或者跨 BU 的壓測活動,并能夠很明確擴(kuò)容方案。
客戶案例
ALIWARE
下面是我們給第三方的實(shí)施案例。
案例一
“四通一達(dá)”的案例接入,我們對他們的系統(tǒng)進(jìn)行了應(yīng)用的分解,最開始確認(rèn)的壓縮場景大概有 4 個,后來通過流量渲染、流量染色、流量跟蹤發(fā)現(xiàn)整個染色大概有 23 個,通過線上建立影子表的方式,建完影子表之后通過小規(guī)模的流量染色,順著把整個影子庫、影子表的方案接入生產(chǎn)環(huán)境,并且在生產(chǎn)壓測過程中沒有造成任何影響,并且通過我們壓測的 23 個場景,在去年的 雙11 里沒有出現(xiàn)任何問題,包括爆倉或者是超單的現(xiàn)象出現(xiàn)。
他們前年做這個事的時候,大概有 50 多個人花費(fèi)了四個月時間,他們維護(hù)了一套單獨(dú)環(huán)境,這個環(huán)境還是有一定的差別,上線之后還是出現(xiàn)了訂單積壓的現(xiàn)象,通過我們做全鏈路壓測了之后,現(xiàn)在基本上一個月時間用了 5 個核心骨干做了全鏈路壓測,基本上已經(jīng)具備了隨時上線應(yīng)用,自己復(fù)制,做流量應(yīng)用、流量染色,測試的周期也是以天為單位,一個比較小的迭代上線基本上一天到兩天就可以完成整個線上的性能回歸。對于大的流量,雙11、雙12 大促活動基本上一周時間就可以完成整個主鏈路的性能回歸,并且完全可以評估出目前生產(chǎn)環(huán)境的容量,包括擴(kuò)容、生產(chǎn)環(huán)境變更等等這樣的功能。
案例二
某美妝行業(yè)客戶,所有的系統(tǒng)基本上是由第三方開發(fā)的,沒有做過性能評估,基本什么都不知道,最關(guān)鍵的問題在于更換的幾次第三方導(dǎo)致整個應(yīng)用比較復(fù)雜,出現(xiàn)的問題是下線一個功能導(dǎo)致整個系統(tǒng)崩潰不能用。我們評估了一下,每一單成交之后硬件成本大概是 0.18 元,正好我在 2012 年就在淘寶做壓測,他們這個指標(biāo)大概是 2014 年淘寶花費(fèi)的 9-10 倍,最關(guān)鍵的問題在于他們還有很多未知的風(fēng)險(xiǎn),比如說他們上線了一個新應(yīng)用,想做一個推廣,結(jié)果直接出了故障,導(dǎo)致秒殺系統(tǒng)崩潰了,基本上那個推廣活動沒有起到任何效果。
我們大概用一個多月的時間幫他們做線上環(huán)境,給他們梳理了 22 個核心鏈路,22 個系統(tǒng),大概 600 多臺服務(wù)器,我們花費(fèi)的時間,第一個生產(chǎn)鏈路建設(shè)的時間比較長,大概花了半個月左右的時間,后續(xù)是他們自己實(shí)施的,總共 22 條鏈路花了 55 天時間,把整個操作系統(tǒng)線上的容量全部厘清,在整個過程中我們沒有對生產(chǎn)環(huán)節(jié)的數(shù)據(jù)做污染,包括整個日志做了日志的隔離。在整個過程中我們本著共建的態(tài)度,幫助客戶建立了日常線上壓測的回歸機(jī)制。
從短期收益來看,可能我們對應(yīng)用的服務(wù)器數(shù)量做了一些調(diào)整,把有些服務(wù)器從收益比較低的鏈路調(diào)整到收益比較高的鏈路上,最終把他們整個資源的消耗率降到了 20% 左右,并且我們做了全鏈路壓測之后,給他們做了一個基線,他們每次以這個基線為基礎(chǔ)做性能的迭代。
目前他們已經(jīng)完全掌握了整個生產(chǎn)環(huán)境壓測的流程,每次上線基本上都可以按照自己的規(guī)劃來做。他們今年的目標(biāo)是要把整個服務(wù)器的資源降低至少 50% 左右,現(xiàn)在也正在為此而努力。
推薦閱讀
微服務(wù)架構(gòu)最強(qiáng)講解,通俗易懂,寫得太好了!
2021-06-21
標(biāo)簽類目體系的價值與意義
2021-06-18
程超:突破瓶頸!如何不斷的提高自己
2021-06-17
資深架構(gòu)師手把手教你性能優(yōu)化
2021-06-07
李偉山:金融撮合架構(gòu)
2021-05-31
阿里專家晨末:什么是技術(shù)一號位?
2021-07-08
資深架構(gòu)專家聊架構(gòu)之道:規(guī)劃、簡化和演化
2021-07-01
總結(jié)
以上是生活随笔為你收集整理的阿里技术解密:全链路压测体系建设方案的思考与实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 列表迭代器ListIterator的用法
- 下一篇: Java中vector的用法