為什么公共云的彈性能力很難被發(fā)揮出來?
王小瑞 AutoMQ 聯(lián)合創(chuàng)始人 & CEO
云計(jì)算通過資源池化實(shí)現(xiàn)單位資源成本更優(yōu),使企業(yè)能夠?qū)?IDC 建設(shè)、基礎(chǔ)軟件研發(fā)和運(yùn)維等工作外包給云廠商,從而更專注于業(yè)務(wù)創(chuàng)新。資源池不僅包括服務(wù)器,還包括人才。云廠商集聚了優(yōu)秀工程師,通過云服務(wù)為眾多企業(yè)提供專業(yè)服務(wù),讓專業(yè)的事交給最專業(yè)的人。
云計(jì)算發(fā)展這么多年,彈性是云計(jì)算從業(yè)者最關(guān)注的技術(shù)能力之一,但是真正落實(shí)到具體的案例上,很少有客戶能把彈性用好,彈性反而成為了一種口號,一種理想的架構(gòu),本文嘗試討論為什么現(xiàn)實(shí)和理想差距這么大,以及有哪些低投入高回報的彈性方案。
云廠商通過包年包月打折來留住客戶,與彈性場景相悖
下表是一份典型的包年包月 EC2 價格與按量付費(fèi)價格對比,總結(jié)出來的游戲規(guī)則:
- 包年包月相比按量付費(fèi)大約有 50% 的成本節(jié)省 這也是為什么大多數(shù)企業(yè)選擇包年包月方式來使用 EC2 資源。從云廠商的角度這么設(shè)計(jì)非常合理,因?yàn)樵茝S商是通過預(yù)測全網(wǎng)客戶的使用量來確定一個 Region 要預(yù)留多少空閑水位,假設(shè) On Demand 和 Reserved 實(shí)例價格一致,將導(dǎo)致云廠商難以預(yù)測一個 Region 的水位,甚至?xí)霈F(xiàn)白天和晚上有巨大的差異,會直接影響供應(yīng)鏈的采購決策。云廠商是典型的類零售商業(yè)模式,每個 Region 的空閑機(jī)器數(shù)量類比為庫存,庫存比例越高,會導(dǎo)致利潤率越低。
- Spot 實(shí)例恰好做到既便宜又是按小時付費(fèi) 這也要求應(yīng)用能處理好 Spot 實(shí)例被強(qiáng)制回收帶來的影響,對于無狀態(tài)應(yīng)用相對簡單,Spot 實(shí)例在回收之前會通知應(yīng)用,大部分云廠商會給到分鐘級別的回收窗口,應(yīng)用只要做到優(yōu)雅下線,就能做到對業(yè)務(wù)無影響。海外專業(yè)基于 Spot 實(shí)例來管理計(jì)算資源的創(chuàng)業(yè)公司[1],有大量的產(chǎn)品化功能幫助用戶用好 Spot 實(shí)例。 AutoMQ 公司也積累了豐富的 Spot 實(shí)例使用經(jīng)驗(yàn)[2]。但是對于有狀態(tài)應(yīng)用,Spot 實(shí)例使用起來的門檻變得非常高,實(shí)例被強(qiáng)制回收前,就需要做到將狀態(tài)轉(zhuǎn)移。比如 Kafka,Redis,MySQL 這類應(yīng)用。針對這類數(shù)據(jù)型的基礎(chǔ)軟件通常不建議用戶直接部署到 Spot 實(shí)例上。
這個游戲規(guī)則既有合理的地方也有值得優(yōu)化的地方,筆者認(rèn)為至少還可以在以下方面做的更好:
- Spot 回收機(jī)制提供 SLA 要能鼓勵更多用戶使用 Spot 實(shí)例,那么 Spot 的回收機(jī)制中的消息通知要能提供確定的 SLA,這樣一些關(guān)鍵業(yè)務(wù)就能敢于大規(guī)模使用 Spot 實(shí)例。
- 創(chuàng)建新實(shí)例 API 提供 SLA Spot 被回收后,應(yīng)用的兜底方案是繼續(xù)開通新的資源(如新的 Spot 實(shí)例,或新的 On-demand 實(shí)例),這時開通新實(shí)例的 API 也要能有確定的 SLA,這個 SLA 會直接影響到應(yīng)用的可用性。
- 卸載云盤提供 SLA Detach EBS 也要能有確定的 SLA,因?yàn)橐坏┌l(fā)生強(qiáng)制回收 Spot 實(shí)例,要能允許用戶自動化處理好應(yīng)用狀態(tài)卸載。
EC2 實(shí)例類型 | 價格/月 | 相對 On Demand 價格比例 |
On Demand | $56.210 | 100% |
Spot | $24.747 | 44% |
Reserved 1YR | $35.259 | 63% |
Reserved 3YR | $24.455 | 44% |
AWS US EAST m6g.large
程序員很難做好資源回收這件事情
C/C++ 程序員大量的精力在和內(nèi)存作斗爭,但是仍然不能保證內(nèi)存資源不泄露。原因是資源準(zhǔn)確回收是一件極具挑戰(zhàn)的事情,比如一個函數(shù)返回一個指針,那么這個對象是誰負(fù)責(zé)回收,C/C++ 是沒有約定的,如果再涉及到多線程,則更加噩夢。為此 C++ 發(fā)明了智能指針,通過一個線程安全的引用計(jì)數(shù)來管理對象。Java 通過內(nèi)置的 GC 機(jī)制,通過運(yùn)行時來檢測對象回收,徹底解決了對象回收問題,不過也帶來了一定的運(yùn)行時開銷。最近特別火的 Rust 語言,本質(zhì)上也是類 C++ 的智能指針回收方式,創(chuàng)新性的將內(nèi)存回收檢查機(jī)制做到了編譯階段,從而大幅提升了內(nèi)存回收的效率,避免了 C/C++ 程序員常犯的內(nèi)存問題,筆者認(rèn)為 Rust 將是 C/C++ 的一個完美替代。
回到云操作系統(tǒng)這個領(lǐng)域,程序員可以通過一個 API 就能創(chuàng)建一臺 ECS,一個 Kafka 實(shí)例,一個 S3 Object,這個 API 背后帶來的是賬單的變化。創(chuàng)建容易,回收則變得非常困難。創(chuàng)建時候通常會指定最大規(guī)格,比如創(chuàng)建一個 Kafka 實(shí)例,先來 20 臺機(jī)器,因?yàn)槲磥頂U(kuò)容縮容都很困難,不如一次到位。
雖然云計(jì)算提供了彈性,但程序員難以有效地按需管理資源,導(dǎo)致資源回收困難。這促使企業(yè)在云上資源創(chuàng)建時設(shè)立繁瑣的審批流程,類似于傳統(tǒng) IDC 的資源管理方式。最終導(dǎo)致的結(jié)果即程序員在云上使用資源的方式與 IDC 趨同,即需要通過 CMDB 進(jìn)行資源管理,并依賴人工審批流程來避免資源浪費(fèi)。
我們也看到了一些優(yōu)秀的彈性實(shí)踐案例。例如某大型企業(yè)在使用 EC2 時,每個 EC2 的 Instance ID 存活周期不超過 1 個月,一旦超過, 就會被列為“爺爺輩的 EC2”,要上團(tuán)隊(duì)的黑榜單。這是一個非常棒的不可變基礎(chǔ)設(shè)施實(shí)踐方法,能有效避免工程師在服務(wù)器上保留狀態(tài),如配置,數(shù)據(jù)等,從而讓應(yīng)用走向彈性架構(gòu)變得可行。
當(dāng)前云計(jì)算的階段還處在 C/C++ 階段,還沒有出現(xiàn)優(yōu)秀的資源回收解決方案,所以企業(yè)還在大量使用流程審批機(jī)制,實(shí)質(zhì)上導(dǎo)致了企業(yè)無法發(fā)揮云的最大優(yōu)勢:彈性。這也是導(dǎo)致企業(yè)云支出較高的主要原因之一。
相信只要有問題,一定會有更優(yōu)秀的解法,解決云資源回收的類 Java/Rust 方案一定會在不久的將來問世。
從基礎(chǔ)軟件到應(yīng)用層,還沒有為彈性做好準(zhǔn)備
筆者曾在 2018 年開始為淘寶天貓的數(shù)千個應(yīng)用設(shè)計(jì)彈性方案[3],當(dāng)時淘寶天貓的應(yīng)用已經(jīng)做到了離線和在線混部來提升部署密度,但是在線應(yīng)用仍然為預(yù)留模式,無法做到按需彈性。根本問題還是應(yīng)用在擴(kuò)縮時,可能會產(chǎn)生非預(yù)期的行為,即使運(yùn)行在 Kubernetes 之上,仍然不能徹底解決,如應(yīng)用會調(diào)用各種中間件的 SDK(數(shù)據(jù)庫、緩存、MQ、業(yè)務(wù)緩存等),應(yīng)用本身啟動也消耗時間較長,看似無狀態(tài)的應(yīng)用,實(shí)則也包含了各種狀態(tài),如包括單元標(biāo)簽,灰度標(biāo)簽等,讓整個應(yīng)用需要大量的人工操作,人工觀察才能有效擴(kuò)縮容。
為了讓 Java 應(yīng)用從分鐘級的冷啟動提升到毫秒級,當(dāng)時為 Docker 開發(fā)了 Snapshot 能力[3],這項(xiàng)能力的生產(chǎn)應(yīng)用足足比 AWS 領(lǐng)先了 4 年(AWS 于 2022 年 Re:invent 會議上發(fā)布了 Lambda SnapStart[4][5] 特性)。通過 Snapshot 方式啟動應(yīng)用可以數(shù)百毫秒就能增加一臺可以立刻工作的計(jì)算節(jié)點(diǎn),這項(xiàng)能力讓應(yīng)用不需要改造成 Lambda 函數(shù)方式就能做到像 Lambda 一樣,根據(jù)流量來增減計(jì)算資源,也就是我們看到的 Lambda 提供的 Pay as you go 能力。
應(yīng)用層做彈性已經(jīng)如此復(fù)雜,到了基礎(chǔ)軟件做彈性挑戰(zhàn)更大,如數(shù)據(jù)庫、緩存、MQ、大數(shù)據(jù)等產(chǎn)品。分布式高可用高可靠的要求決定了這些產(chǎn)品都需要將數(shù)據(jù)存儲多副本。一旦數(shù)據(jù)量大,彈性將變得非常困難,遷移數(shù)據(jù)會影響業(yè)務(wù)的可用性。為此,要在云環(huán)境解決這個問題,就要用云原生的方式,我們在設(shè)計(jì) AutoMQ(賦能 Kafka 的云原生方案)時,將彈性作為最高優(yōu)先級,核心挑戰(zhàn)是要將存儲卸載到云服務(wù),例如按量付費(fèi)的 S3,而不是自建存儲系統(tǒng)。下圖是 AutoMQ 線上的流量和節(jié)點(diǎn)變化圖,會看到 AutoMQ 是根據(jù)流量全自動增減機(jī)器,如果這些機(jī)器采用 Spot 實(shí)例,將為企業(yè)節(jié)省大量的成本,真正做到 Pay as you go。
AutoMQ 根據(jù)流量自動增減節(jié)點(diǎn)
企業(yè)如何使用好彈性能力來降本增效
Google 在 2018 年推出了 Cloud Run[6] 全托管式計(jì)算平臺,基于 HTTP 通信的應(yīng)用僅需提供監(jiān)聽端口和容器鏡像給 Cloud run,所有基礎(chǔ)設(shè)施的管理將全自動由 Cloud run 來執(zhí)行。這種方式相比 AWS Lambda 方式最大優(yōu)勢是無需綁定到單個云廠商,未來可以更好的遷移到其他計(jì)算平臺。很快 AWS 和 Azure 跟進(jìn)推出了類似的產(chǎn)品,Azure Container Apps[7] 和 AWS App Runner[8]。
專業(yè)的事情交給專業(yè)的人做,彈性是一個非常有挑戰(zhàn)的工作,推薦云上的應(yīng)用可以盡可能依賴這些無代碼綁定托管框架,如 Cloud run,做到應(yīng)用消耗的計(jì)算資源可以按照請求來付費(fèi)。
基礎(chǔ)軟件如數(shù)據(jù)庫、緩存、大數(shù)據(jù)、MQ 等,很難用一個統(tǒng)一的托管框架來解決,這類應(yīng)用的演進(jìn)趨勢是每個品類都在向彈性架構(gòu)演進(jìn),如 Amazon Aurora Serverless,Mongodb Serverless[9],從云廠商到第三方開源軟件商都有共識要能走到徹底的彈性架構(gòu)。
企業(yè)在選擇類似開源基礎(chǔ)軟件時,要盡可能選擇具備彈性能力的產(chǎn)品,判斷的標(biāo)準(zhǔn)是是否能運(yùn)行在 Spot 實(shí)例上,是否能極具性價比。同時也要關(guān)注這類產(chǎn)品是否能更好的在多個云上運(yùn)行,這決定了企業(yè)在未來走向多云架構(gòu),甚至混合云架構(gòu)時,是否具備移植性。