八年雙11,交易額增長(zhǎng) 200 倍,交易峰值增長(zhǎng) 400 多倍,阿里技術(shù)經(jīng)歷了什么?
阿里巴巴中間件技術(shù)部的高級(jí)技術(shù)專(zhuān)家周洋(中亭)從能力大促、精細(xì)大促和效率大促三個(gè)方面探尋雙 11 高可用架構(gòu)演進(jìn)之路,并對(duì)未來(lái)雙 11 的挑戰(zhàn)進(jìn)行了展望。
阿里雙 11 的技術(shù)挑戰(zhàn)
雙 11 技術(shù)挑戰(zhàn)的本質(zhì)是使用有限的成本去實(shí)現(xiàn)***化的用戶(hù)體驗(yàn)和集群整體吞吐能力,用最合理的代價(jià)解決零點(diǎn)峰值,支撐好業(yè)務(wù)的狂歡。
阿里做雙11已經(jīng)有八年之久了,八年來(lái)雙11的交易額增長(zhǎng) 200 倍,交易峰值增長(zhǎng) 400 多倍,系統(tǒng)復(fù)雜度和大促支撐難度以指數(shù)級(jí)攀升。
并且經(jīng)過(guò)多年的發(fā)展,雙 11 技術(shù)實(shí)現(xiàn)鏈條中的變量不斷增加,如峰值的增量和系統(tǒng)架構(gòu)的變化、交易峰值的組成、拆單比、每個(gè)業(yè)務(wù)入口的訪(fǎng)問(wèn)量等,這些變量也給系統(tǒng)帶來(lái)了不確定性。
回顧這八年的雙 11 零點(diǎn)之戰(zhàn),它推動(dòng)了阿里的技術(shù)進(jìn)步、推動(dòng)了架構(gòu)優(yōu)化,加速了技術(shù)演進(jìn)和沉淀。
阿里的技術(shù)演進(jìn)是一個(gè)螺旋向上的過(guò)程,整體高可用演進(jìn)可以分為三個(gè)階段:能力大促、精細(xì)大促、效率大促,下面來(lái)一一分析。
阿里雙 11 高可用架構(gòu)演進(jìn)
能力大促——3.0 分布式架構(gòu)
能力大促***個(gè)要求是解決擴(kuò)展性的問(wèn)題。上圖是淘寶 3.0 分布式架構(gòu),其意義在于讓淘寶從一個(gè)集中化應(yīng)用轉(zhuǎn)變?yōu)榉植蓟瘧?yīng)用。
在該架構(gòu)中對(duì)業(yè)務(wù)進(jìn)行了分層,同時(shí)在系統(tǒng)中***使用中間件、分布式調(diào)用、分布式消息、分布式數(shù)據(jù)庫(kù);架構(gòu)底層沉淀了分布式存儲(chǔ)和緩存。
目前而言,大部分互聯(lián)網(wǎng)應(yīng)用都是基于這一架構(gòu)的,并且發(fā)展到現(xiàn)在,該架構(gòu)并無(wú)太大的變化。
隨著雙 11 業(yè)務(wù)量的增加,該架構(gòu)面臨著很多挑戰(zhàn):
- 系統(tǒng)的可用性和故障恢復(fù)能力,以前集中化架構(gòu),出現(xiàn)問(wèn)題回滾即可;現(xiàn)在由于涉及到眾多分布式系統(tǒng),快速排查和定位問(wèn)題變得十分困難。
- 分布式改造之后,單個(gè)系統(tǒng)存放在特定機(jī)房里,隨著業(yè)務(wù)發(fā)展,機(jī)器數(shù)目的增加,機(jī)房應(yīng)用層水平伸縮瓶頸、數(shù)據(jù)庫(kù)鏈接等都成了挑戰(zhàn)。
- IDC 資源限制,單個(gè)城市已經(jīng)不足以支撐業(yè)務(wù)的增長(zhǎng)規(guī)模。
- 容災(zāi)問(wèn)題,單地域 IDC 單點(diǎn)、網(wǎng)絡(luò)、臺(tái)風(fēng)、電力等導(dǎo)致高風(fēng)險(xiǎn)。
- 國(guó)際化部署需求,可擴(kuò)展性再次成為瓶頸。
針對(duì)上述挑戰(zhàn),我們采用了異地多活方案,具體從四個(gè)方面出發(fā):首先建設(shè)異地單元機(jī)房,其次由于業(yè)務(wù)中買(mǎi)家維度數(shù)據(jù)遠(yuǎn)多于賣(mài)家維度數(shù)據(jù),且賣(mài)家維度數(shù)據(jù)變化并非十分頻繁,因此可以將流量按用戶(hù)維度進(jìn)行切分。
此外,由于走向異地***的挑戰(zhàn)是網(wǎng)絡(luò),為了減少異地調(diào)用的延時(shí),必須實(shí)現(xiàn)業(yè)務(wù)在本單元的封閉性,減少遠(yuǎn)程調(diào)用,***,由于容災(zāi)的需求,數(shù)據(jù)層實(shí)時(shí)同步,保持最終一致。
異地多活架構(gòu)
上圖是異地多活架構(gòu),可以看出,從 CDN 到阿里內(nèi)部的接入層都滿(mǎn)足單元化規(guī)則,根據(jù)當(dāng)前用戶(hù)的 ID,判斷流量的出口;在下游的層層中間件上以及數(shù)據(jù)寫(xiě)入存儲(chǔ)時(shí)會(huì)對(duì)用戶(hù)請(qǐng)求進(jìn)行判斷,如出現(xiàn)異常,則報(bào)錯(cuò),防止錯(cuò)誤的數(shù)據(jù)寫(xiě)入。
賣(mài)家的數(shù)據(jù)部署在中心,單元的數(shù)據(jù)會(huì)同步到中心,中心賣(mài)家的數(shù)據(jù)也會(huì)同步到各個(gè)單元,但在各個(gè)單元內(nèi)只能對(duì)賣(mài)家的數(shù)據(jù)進(jìn)行讀操作。
那么異地多活的到底有什么意義呢?首先異地多活消除了 IDC 資源單點(diǎn)和容量瓶頸,其次解決了異地容災(zāi)問(wèn)題,業(yè)務(wù)可以秒級(jí)快速切換。
此外,異地多活簡(jiǎn)化了容量規(guī)劃,提升了伸縮性和可維護(hù)性。***,通過(guò)異地多活解決了可擴(kuò)展性問(wèn)題,為后續(xù)架構(gòu)演進(jìn)打下堅(jiān)實(shí)基礎(chǔ)。
能力大促——容量規(guī)劃
對(duì)于上文提到的 3.0 架構(gòu),單機(jī)器的極限能力乘以機(jī)器數(shù),在下游依賴(lài)都充足的情況下,近似等于整個(gè)系統(tǒng)的能力。因此,當(dāng)前做容量規(guī)劃,首先需要評(píng)估應(yīng)用線(xiàn)上單機(jī)極限能力;再根據(jù)公式和經(jīng)驗(yàn)推演容量規(guī)劃。
目前,在阿里內(nèi)部進(jìn)行容量規(guī)劃時(shí),面臨以下挑戰(zhàn):
- 容量規(guī)劃的目的是從用戶(hù)登錄到完成購(gòu)買(mǎi)的整個(gè)鏈條中,整體資源如何合理分配?
- 500+ 的核心系統(tǒng)、整個(gè)技術(shù)鏈條長(zhǎng)、業(yè)務(wù)入口多、邏輯復(fù)雜。
- 鏈路瓶頸點(diǎn)較多,每年大促峰值都會(huì)出現(xiàn)一些問(wèn)題,無(wú)法提前發(fā)現(xiàn)。
- 堆積木的容量規(guī)劃方法,前面失之毫厘后面謬以千里。
- 在能力評(píng)估時(shí)應(yīng)該考慮的是一個(gè)處理鏈路而不僅僅是單一的應(yīng)用。
- 缺乏驗(yàn)證核心頁(yè)面和交易創(chuàng)建鏈條實(shí)際承載能力的手段。
壓測(cè)方案
為了應(yīng)對(duì)上述挑戰(zhàn),我們需要從全鏈條的角度出發(fā)進(jìn)行壓測(cè)和容量規(guī)劃。全鏈路壓測(cè)是在線(xiàn)上集群模擬真實(shí)業(yè)務(wù)流量的讀寫(xiě)壓測(cè),完成從網(wǎng)絡(luò)、IDC、集群、應(yīng)用、緩存、DB 以及業(yè)務(wù)系統(tǒng)上下游依賴(lài)鏈條的容量、性能壓力測(cè)試。
整體壓測(cè)通過(guò)自定義壓測(cè)工具,大流量來(lái)自機(jī)房外部,進(jìn)而構(gòu)造線(xiàn)上測(cè)試數(shù)據(jù),且業(yè)務(wù)模型接近真實(shí);全鏈路壓測(cè)隔離了測(cè)試數(shù)據(jù)和正常數(shù)據(jù),兩者之間互不影響,并且全鏈路壓測(cè)時(shí)是對(duì)用戶(hù)體驗(yàn)無(wú)感知、無(wú)影響的。
全鏈路壓測(cè)通過(guò)復(fù)用中間件的能力,具有超大規(guī)模的集群壓測(cè)能力,每秒千萬(wàn) QPS。同時(shí)將壓測(cè)引擎部署到全球各地的 CDN 上,實(shí)現(xiàn)了分布式部署壓測(cè)引擎,按照約定的時(shí)間發(fā)送壓測(cè)數(shù)據(jù)。
其次,壓測(cè)數(shù)據(jù)是基于線(xiàn)上真實(shí)數(shù)據(jù)進(jìn)行了脫敏和偏移,數(shù)據(jù)模型與雙 11 極其接近。此外,實(shí)現(xiàn)了線(xiàn)程級(jí)隔離,無(wú)臟數(shù)據(jù),壓力測(cè)試直接作用于線(xiàn)上集群,暴露問(wèn)題更加精準(zhǔn)。
通過(guò)全鏈路壓測(cè),打破了不可預(yù)知技術(shù)風(fēng)險(xiǎn)的限制,加速技術(shù)進(jìn)化;為新技術(shù)的嘗試和突破做好保底和驗(yàn)收的工作;做到了主動(dòng)發(fā)現(xiàn)問(wèn)題而不是被動(dòng)等待、應(yīng)急處理;通過(guò)新的線(xiàn)上演練,為穩(wěn)定性的確定性打下堅(jiān)實(shí)基礎(chǔ)。
能力大促——限流降級(jí)
限流降級(jí)是能力大促的必要要求。在雙 11 開(kāi)始前,盡管我們準(zhǔn)備了大量的機(jī)器和能力,然而在雙 11 零點(diǎn)到來(lái)時(shí),真實(shí)業(yè)務(wù)量還是有可能大于我們的預(yù)期。
此時(shí),為了確保我們的機(jī)器不超負(fù)荷運(yùn)作,我們采用了限流措施,超過(guò)機(jī)器極限的業(yè)務(wù)全部拒絕,避免系統(tǒng)因業(yè)務(wù)流量的突然過(guò)大而崩潰。
目前,阿里能夠做到從線(xiàn)程數(shù)、請(qǐng)求值、負(fù)載多個(gè)角度進(jìn)行限流,從而保障系統(tǒng)的穩(wěn)定。
分布式應(yīng)用是默認(rèn)下游應(yīng)用是不可靠的,對(duì)于一些弱依賴(lài)的請(qǐng)求,應(yīng)該進(jìn)行提前自動(dòng)降級(jí)。至于哪些應(yīng)用需要降級(jí)?需要降級(jí)什么?下游的依賴(lài)又是什么?這些問(wèn)題都是通過(guò)依賴(lài)治理來(lái)解決的。
精細(xì)大促——依賴(lài)治理
在阿里內(nèi)部,依賴(lài)治理是通過(guò)中間件分布式鏈路跟蹤技術(shù),完成系統(tǒng)架構(gòu)梳理;同時(shí)對(duì)海量調(diào)用鏈進(jìn)行統(tǒng)計(jì),得到鏈路各個(gè)依賴(lài)系統(tǒng)的穩(wěn)定性指標(biāo);此外,結(jié)合業(yè)務(wù)用例識(shí)別強(qiáng)弱依賴(lài),弱依賴(lài)可自動(dòng)降級(jí)提供有損服務(wù)。
精細(xì)大促——開(kāi)關(guān)預(yù)案
精細(xì)化雙 11 控制的首要機(jī)制是開(kāi)關(guān)預(yù)案。開(kāi)關(guān)是讓系統(tǒng)切換不同功能表現(xiàn)的標(biāo)準(zhǔn)技術(shù),可以無(wú)需變更代碼只推送配置控制系統(tǒng)行為,讓系統(tǒng)的后門(mén)標(biāo)準(zhǔn)化。
開(kāi)關(guān)中心配置變更可以實(shí)時(shí)下發(fā)到集群,且操作行為對(duì)業(yè)務(wù)而言是原子性的。開(kāi)關(guān)預(yù)案整合了一批業(yè)務(wù)開(kāi)關(guān)、限流等操作,將多系統(tǒng)的后臺(tái)操作組裝批量執(zhí)行;實(shí)現(xiàn)了預(yù)案推送是有順序性的,保證業(yè)務(wù)切換的一致性和完整性。
精細(xì)大促——故障演練
統(tǒng)計(jì)學(xué)的數(shù)據(jù)顯示:當(dāng)服務(wù)規(guī)模大于一定數(shù)量時(shí),硬件故障無(wú)法避免。因此,系統(tǒng)要面向失敗做設(shè)計(jì),測(cè)試系統(tǒng)健壯性的***方法,就是不要用正常方式使服務(wù)停機(jī)。對(duì)應(yīng)線(xiàn)上系統(tǒng),要實(shí)現(xiàn)容災(zāi),首先需要實(shí)現(xiàn)背后工具體系的容災(zāi)。
由于線(xiàn)上故障是一種常態(tài),系統(tǒng)負(fù)責(zé)人要具備快速發(fā)現(xiàn)和處理故障的能力,需要實(shí)戰(zhàn)機(jī)會(huì)來(lái)成長(zhǎng)。另外,跨團(tuán)隊(duì)的流程也是需要加以重視,由于業(yè)務(wù)分布式的特性,出現(xiàn)故障時(shí)需要業(yè)務(wù)系統(tǒng)的上下游共同協(xié)作,這就對(duì)流程提出來(lái)嚴(yán)格的要求。
故障演練的實(shí)現(xiàn)方案
前期,我們將阿里電商常見(jiàn)的故障進(jìn)行畫(huà)像和分析,得到初步結(jié)論,按照 IaaS、PaaS、SaaS 層進(jìn)行初步劃分,但這個(gè)模型無(wú)法完全通用,并非包含所有的故障。
因此,后期我們對(duì)這一模型又進(jìn)一步抽象,將故障分為進(jìn)程內(nèi)的故障,如代碼死循環(huán)等;進(jìn)程外的故障,如磁盤(pán)讀寫(xiě)速度變慢、網(wǎng)絡(luò)波動(dòng)等;分布式調(diào)用依賴(lài)的底層設(shè)施故障,如數(shù)據(jù)庫(kù)、緩存或者其他設(shè)施出現(xiàn)故障。
目前,阿里故障演練實(shí)現(xiàn)了業(yè)務(wù)零改造,可插拔式接入;多維度業(yè)務(wù)識(shí)別和故障注入,定量控制演練影響;沉淀通用故障模型,平臺(tái)化輸出演練能力。
從去年雙 11 開(kāi)始,阿里開(kāi)始使用線(xiàn)上統(tǒng)一演練環(huán)境,通過(guò)邏輯隔離,動(dòng)態(tài)擴(kuò)展邏輯環(huán)境,按需租賃,簡(jiǎn)化測(cè)試步驟,使得演練結(jié)果更加真實(shí)。
同時(shí)多套環(huán)境互不影響,嚴(yán)格保證環(huán)境的穩(wěn)定和安全;支持用戶(hù)、業(yè)務(wù)、數(shù)據(jù)、流量特征的分流和隔離,提高了效率,賦能業(yè)務(wù)創(chuàng)新。
效率大促——流量調(diào)度
在線(xiàn)上集群中,如果個(gè)別機(jī)器發(fā)生故障,為了保證業(yè)務(wù)的整體穩(wěn)定性,需要對(duì)故障點(diǎn)進(jìn)行流量調(diào)度。
流量調(diào)度通過(guò)實(shí)時(shí)探測(cè)與監(jiān)控分布式環(huán)境中每一臺(tái)機(jī)器的狀況,如果機(jī)器發(fā)生故障,則使用分布式服務(wù)具有的自我隔離和自我修復(fù)能力,使用流量調(diào)度和負(fù)載均衡機(jī)制,通過(guò)關(guān)注局部用戶(hù)請(qǐng)求和用戶(hù)體驗(yàn),提升整體可用性。
阿里雙 11 未來(lái)挑戰(zhàn)
盡管我們已經(jīng)采用了很多措施來(lái)保障雙 11 的穩(wěn)定性,但未來(lái),依舊面臨著不少挑戰(zhàn):
實(shí)現(xiàn)更加精細(xì)化、數(shù)據(jù)化、智能化的雙 11。
從容量確定性到資源確定性,從每個(gè)實(shí)例部署在哪里***、精確到每個(gè)內(nèi)核如何分配***。
更加精準(zhǔn)的分析、預(yù)測(cè)流量模型和業(yè)務(wù)模型,實(shí)現(xiàn)預(yù)測(cè)、引導(dǎo)相結(jié)合,逼近真實(shí)、增加確定性。
實(shí)現(xiàn)技術(shù)變量的采集、分析、預(yù)測(cè),數(shù)據(jù)分析驅(qū)動(dòng),自主決策處理,關(guān)鍵技術(shù)指標(biāo)的預(yù)估錯(cuò)誤系統(tǒng)做到自適應(yīng),彈性處理。
在體驗(yàn)、成本和***吞吐能力方面找到新的平衡點(diǎn)。