我們總結(jié)了彈性伸縮的五個(gè)條件與六個(gè)教訓(xùn)
前言
彈性伸縮是云計(jì)算時(shí)代給我們帶來(lái)的一項(xiàng)核心技術(shù)紅利,但是 IT 的世界中,沒(méi)有一個(gè)系統(tǒng)功能可以不假思索的應(yīng)用到所有的場(chǎng)景中。 這篇文章,我們將應(yīng)用企業(yè)級(jí)分布式應(yīng)用服務(wù)-EDAS 的客戶在進(jìn)行系統(tǒng)架構(gòu)設(shè)計(jì)時(shí),在彈性場(chǎng)景下遇到的點(diǎn)滴做了一個(gè)系統(tǒng)的梳理,總結(jié)為五個(gè)條件和六個(gè)教訓(xùn)分享給大家。
五個(gè)條件
1、啟動(dòng)無(wú)需手動(dòng)干預(yù)
是否需要手動(dòng)干預(yù)是彈性伸縮和手動(dòng)伸縮的本質(zhì)區(qū)別。在傳統(tǒng)應(yīng)用的運(yùn)維中,一個(gè)進(jìn)程的啟動(dòng)往往需要在機(jī)器上手動(dòng)準(zhǔn)備一系列的事情,如:環(huán)境搭建,依賴服務(wù)的配置梳理,本地環(huán)境配置調(diào)整等。如果是在云上的應(yīng)用可能還需要手動(dòng)調(diào)整安全組規(guī)則,依賴服務(wù)的訪問(wèn)控制等;但這些需要手動(dòng)執(zhí)行的動(dòng)作在自動(dòng)彈性時(shí)都會(huì)變得不可行。
2、進(jìn)程本身無(wú)狀態(tài)
確切的說(shuō),無(wú)狀態(tài)主要是指業(yè)務(wù)系統(tǒng)運(yùn)行時(shí)對(duì)于數(shù)據(jù)的依賴程度,數(shù)據(jù)是在進(jìn)程執(zhí)行的過(guò)程中產(chǎn)生的,產(chǎn)生的數(shù)據(jù)會(huì)對(duì)后來(lái)的程序行為產(chǎn)生持續(xù)的影響,程序員需要在編碼邏輯的時(shí)候,就考慮如果系統(tǒng)在一個(gè)新環(huán)境中重新拉起時(shí),這份數(shù)據(jù) 是否對(duì)于行為會(huì)造成不一致的情況? 推薦做法是數(shù)據(jù)應(yīng)該最終以存儲(chǔ)系統(tǒng)中為準(zhǔn),讓存儲(chǔ)計(jì)算做到真正的分離。
3、啟動(dòng)的要快,走的要有“尊嚴(yán)”
彈性 , 尤其是云上的彈性,其中一個(gè)特點(diǎn)是會(huì)進(jìn)行得很頻繁。 尤其是流量突發(fā)型的業(yè)務(wù),帶著一定的不確定性。 而啟動(dòng)后的系統(tǒng)往往處在一個(gè)“冷”的狀態(tài),啟動(dòng)之后如何快速的“加熱”是彈性有效性的關(guān)鍵。 而在彈性結(jié)束之后,往往伴隨著一次自動(dòng)的縮容,由于這個(gè)過(guò)程也是自動(dòng)的,所以我們需要能從技術(shù)上能做到自動(dòng)流量摘除的能力,這里的流量不僅僅包括 HTTP/RPC,也包括消息、任務(wù)(后臺(tái)線程池)調(diào)度等。
4、磁盤(pán)數(shù)據(jù)可丟失
在應(yīng)用啟動(dòng)過(guò)程,我們的應(yīng)用程序可能會(huì)使用磁盤(pán)配置一些啟動(dòng)依賴項(xiàng)之外;在進(jìn)程運(yùn)行的過(guò)程中,我們也會(huì)習(xí)慣性使用磁盤(pán)打印一些日志,或者記錄一些數(shù)據(jù)。而彈性場(chǎng)景是進(jìn)程快起快沒(méi),沒(méi)了之后放在磁盤(pán)上的數(shù)據(jù)也都沒(méi)了,所以我們要做好磁盤(pán)數(shù)據(jù)丟失的準(zhǔn)備,可能有人會(huì)問(wèn)日志怎么處理?日志應(yīng)該通過(guò)日志收集組件收走,進(jìn)行統(tǒng)一的聚合、清洗和查閱。這一點(diǎn)在 12 factor apps 中也做了強(qiáng)調(diào)。
5、依賴的服務(wù)充分可用
成規(guī)模的業(yè)務(wù)系統(tǒng),往往不是一個(gè)人在戰(zhàn)斗。 最典型的架構(gòu)中,也會(huì)使用到一些緩存、數(shù)據(jù)庫(kù)等中心服務(wù)。 一個(gè)業(yè)務(wù)彈性擴(kuò)容上來(lái)之后,很容易忽略中心依賴服務(wù)的可用性。 如果依賴服務(wù)出現(xiàn)不可用,對(duì)于整個(gè)系統(tǒng)可能就是一個(gè)雪崩的效應(yīng)。
六個(gè)教訓(xùn)
1、指標(biāo)值設(shè)置不合理
彈性整體分為三個(gè)階段: 指標(biāo)獲取、規(guī)則計(jì)算、執(zhí)行伸縮; 指標(biāo)獲取一般通過(guò)監(jiān)控系統(tǒng)或者 PaaS 平臺(tái)自帶的組件獲取。 基礎(chǔ)監(jiān)控指標(biāo)常見(jiàn)的如: CPU/Mem/Load 等。 短期內(nèi)有一些基礎(chǔ)指標(biāo)數(shù)值會(huì)存在不穩(wěn)定的特點(diǎn),但是時(shí)間拉長(zhǎng),正常來(lái)看會(huì)處在一個(gè)“平穩(wěn)”的狀態(tài),我們?cè)O(shè)置指標(biāo)的時(shí)候,不能以短時(shí)間的特征為依據(jù),參考較長(zhǎng)時(shí)間的某種水位數(shù)據(jù)才能設(shè)置一個(gè)合理值。 且指標(biāo)不宜過(guò)多,同時(shí)縮容指標(biāo)要和擴(kuò)容指標(biāo)存在明顯的數(shù)值差。
2、把“延時(shí)”當(dāng)指標(biāo)
很多時(shí) 候我們識(shí)別系統(tǒng)可用性的一個(gè)很大的判斷,就是看系統(tǒng)屏幕是不是在“轉(zhuǎn)圈圈”,即系統(tǒng)很慢。 常理推斷,很慢就要擴(kuò)容了。 所以我們有一些客戶直接把系統(tǒng)的平均 RT 當(dāng)成了擴(kuò)容指標(biāo),但系統(tǒng)的 RT 是多維度的,比如 health check 一般都是很快的,這類 API 出現(xiàn)的頻率稍高一點(diǎn),一下就拉低了平均值。 也有的客戶會(huì)精確到 API 級(jí)別,可是 API 也是根據(jù)參數(shù)不同邏輯不一樣的從而造成 RT 不一樣。 總之,根據(jù)延時(shí)去做彈性策略是很危險(xiǎn)的一種做法。
3、指定單一的擴(kuò)容規(guī)格
擴(kuò) 容規(guī)格指 的是資源的規(guī)格,比如在云上的場(chǎng)景中,對(duì)于同一種 4c8g 的規(guī)格,我們可以指定內(nèi)存型、計(jì)算型、網(wǎng)絡(luò)增強(qiáng)型等。 但是云上是一個(gè)大資源池,對(duì)于某一種規(guī)格,會(huì)存在售罄現(xiàn)象;如果我們只指定了單一的規(guī)格,就會(huì)出現(xiàn)資源無(wú)法提供而出現(xiàn)擴(kuò)容失敗的情況。 這里最危險(xiǎn)的還不是擴(kuò)容失敗本身,是出現(xiàn)業(yè)務(wù)故障之后的排查過(guò)程會(huì)特別漫長(zhǎng)。
4、只考慮RPC鏈路中的應(yīng)用策略
針對(duì)單 個(gè)應(yīng)用往往都很簡(jiǎn)單的,難的是整個(gè)業(yè)務(wù)場(chǎng)景的梳理。 梳理思路一個(gè)簡(jiǎn)單的辦法就是按照應(yīng)用調(diào)用的場(chǎng)景進(jìn)行,從應(yīng)用間調(diào)用的場(chǎng)景來(lái)看,一般來(lái)說(shuō)分為三種: 同步(RPC,中間件如 Spring Cloud)、異步(消息,中間件如 RocketMQ)、任務(wù)(分布式調(diào)度,中間件如 SchedulerX)。 我們一般會(huì)很快整理出第一種情況,但是很容易忽略掉后面兩種。 而后面兩種出現(xiàn)問(wèn)題的時(shí)候,問(wèn)題排查診斷又是最為耗時(shí)。
5、沒(méi)有配套相應(yīng)的可視化策略
彈性伸縮是一個(gè)典型的后臺(tái)任務(wù),在治理一個(gè)大集群的后臺(tái)任務(wù)的時(shí)候,最好是有一塊大屏進(jìn)行直觀的可視化治理。 對(duì)于擴(kuò)容失敗的情形,不能靜默處理。 如果是核心業(yè)務(wù)出現(xiàn)擴(kuò)容失敗,可能帶來(lái)的就是直接的業(yè)務(wù)故障,但是故障真正發(fā)生時(shí),很多時(shí)候不會(huì)去關(guān)心擴(kuò)容策略是否生效,如果真是因?yàn)閿U(kuò)容造成的故障,也很難排查到這個(gè)點(diǎn)。
6、事前沒(méi)做正確評(píng)估
雖然 云計(jì)算給彈性提供了近乎無(wú)盡的資源池,但這也只是解放了用戶預(yù)備資源的工作,而微服務(wù)系統(tǒng)本身復(fù)雜,單一組件的容量變化會(huì)產(chǎn)生全鏈路的影響,既解除一處風(fēng)險(xiǎn)之后系統(tǒng)瓶頸點(diǎn)可能會(huì)遷移,有些隱形約束也會(huì)隨著容量變化逐步顯現(xiàn),所以做彈性策略大多數(shù)時(shí)候不能靠力大磚飛的思想,需要做好全鏈路的壓測(cè)、驗(yàn)證,演練到適應(yīng)于全局的彈性配置; 我們還是建議事前從高可用的多個(gè)維度了解各種技術(shù)手段,形成多套預(yù)案以備使用。
尾聲
云原生場(chǎng)景下彈性能力更為豐富,可供彈性的指標(biāo)也更具備業(yè)務(wù)定制能力。應(yīng)用 PaaS 平臺(tái)(如企業(yè)級(jí)分布式應(yīng)用服務(wù) EDAS/ Serverless 應(yīng)用引擎 SAE 等)能結(jié)合云廠商在計(jì)算、存儲(chǔ)、網(wǎng)絡(luò)上的技術(shù)基礎(chǔ)能力,能讓使用云的成本更低。但是這里對(duì)于業(yè)務(wù)應(yīng)用會(huì)提出一點(diǎn)點(diǎn)挑戰(zhàn)(如:無(wú)狀態(tài)/配置代碼解耦等等)。從更廣的側(cè)面來(lái)看,這是云原生時(shí)代應(yīng)用架構(gòu)面臨的挑戰(zhàn)。不過(guò)應(yīng)用越來(lái)越原生的話,云的技術(shù)紅利也會(huì)離我們?cè)絹?lái)越近。