开发之痛:稳定的测试环境,怎么就那么难
簡(jiǎn)介:開發(fā)之痛:穩(wěn)定的測(cè)試環(huán)境,怎么就那么難。對(duì)于生產(chǎn)環(huán)境,準(zhǔn)確、穩(wěn)定最重要,我們推薦以應(yīng)用為中心的基于OAM和IaC的實(shí)踐方式;對(duì)于測(cè)試環(huán)境,隔離、低成本和穩(wěn)定的依賴是最重要的,我們推薦基于穩(wěn)定環(huán)境的隔離測(cè)試環(huán)境的實(shí)踐,復(fù)用穩(wěn)定環(huán)境,通過(guò)流量隔離和數(shù)據(jù)隔離來(lái)生成測(cè)試環(huán)境。通過(guò)環(huán)境建設(shè),我們解決了研發(fā)過(guò)程中的資源沖突。
專欄策劃|雅純
志愿編輯|jimmy、呂瑞星
“對(duì)于生產(chǎn)環(huán)境,準(zhǔn)確、穩(wěn)定最重要,我們推薦以應(yīng)用為中心的基于OAM和IaC的實(shí)踐方式。
對(duì)于測(cè)試環(huán)境,隔離、低成本和穩(wěn)定的依賴最重要,我們推薦基于穩(wěn)定環(huán)境的隔離測(cè)試環(huán)境的實(shí)踐,復(fù)用穩(wěn)定環(huán)境,通過(guò)流量隔離和數(shù)據(jù)隔離來(lái)生成測(cè)試環(huán)境。“
以下是詳細(xì)內(nèi)容。
環(huán)境這個(gè)概念,大多數(shù)開發(fā)者都很熟悉。一個(gè)穩(wěn)定、可預(yù)期、低成本的環(huán)境也是大家一致的訴求。
如下圖所示,我們將環(huán)境分為生產(chǎn)環(huán)境、測(cè)試環(huán)境、開發(fā)環(huán)境3類。很多時(shí)候我們會(huì)把生產(chǎn)環(huán)境、測(cè)試環(huán)境、開發(fā)環(huán)境隔離開,就像圖上的那個(gè)防火墻一樣,分為線下環(huán)境和線上環(huán)境。
但在實(shí)際情況下,考慮公司體量和開發(fā)成本等諸多因素,環(huán)境的使用和劃分會(huì)發(fā)生一些變化。
例如,基于成本考量,首先要保證的是生產(chǎn)環(huán)境,一切以提供服務(wù)為核心要?jiǎng)?wù);其次是測(cè)試環(huán)境,在遷移至線上環(huán)境之前我們需要在類似于生產(chǎn)環(huán)境的測(cè)試環(huán)境中進(jìn)行相應(yīng)的驗(yàn)證,只有在測(cè)試環(huán)境中驗(yàn)證無(wú)誤才可以遷移至生產(chǎn)環(huán)境,從而保證系統(tǒng)穩(wěn)定的過(guò)渡。
生產(chǎn)環(huán)境
對(duì)于生產(chǎn)環(huán)境,準(zhǔn)確、穩(wěn)定的運(yùn)行是相當(dāng)重要的,也產(chǎn)生了大量的運(yùn)維和治理的訴求。
如果測(cè)試環(huán)境給配置一個(gè)節(jié)點(diǎn)就夠了,生產(chǎn)環(huán)境就要考慮備份、主備、分流、容災(zāi)等諸多問(wèn)題,其目的都是為了保障環(huán)境的穩(wěn)定運(yùn)行。
準(zhǔn)確、穩(wěn)定是生產(chǎn)環(huán)境和別的環(huán)境的最大區(qū)別。這一特點(diǎn)帶來(lái)了大量的運(yùn)維的和服務(wù)治理的配置訴求,如何有效維護(hù)這些配置也是我們基于OAM模型、以IaC的方式來(lái)管理配置的初衷,上篇文章中有做分享。
(小編注:云效AppStack正是基于OAM的云原生應(yīng)用交付平臺(tái),企業(yè)可以通過(guò)應(yīng)用編排、占位符、變量等聲明式定義,實(shí)現(xiàn)一套編排多環(huán)境差異化部署,同時(shí)基于版本和基線實(shí)現(xiàn)環(huán)境一鍵拉起、一鍵回滾。感興趣的同學(xué)點(diǎn)擊文末閱讀原文可以免費(fèi)使用)。生產(chǎn)環(huán)境包含了很多種配置,如應(yīng)用配置、應(yīng)用鏡像、應(yīng)用運(yùn)維配置、基礎(chǔ)設(shè)施運(yùn)維配置等。這些不同的配置和鏡像的內(nèi)容是由不同的同學(xué)關(guān)注和管理的。
開發(fā)修改代碼,代碼發(fā)布會(huì)改變鏡像和配置;應(yīng)用運(yùn)維會(huì)主動(dòng)修改應(yīng)用運(yùn)維配置;基礎(chǔ)設(shè)施運(yùn)維會(huì)修改基礎(chǔ)設(shè)施配置。所有的配置改動(dòng)都會(huì)對(duì)生產(chǎn)環(huán)境產(chǎn)生影響,帶來(lái)生產(chǎn)環(huán)境的變化,進(jìn)而可能帶來(lái)風(fēng)險(xiǎn)。
因此生產(chǎn)環(huán)境的運(yùn)維和和管理顯然應(yīng)該是由開發(fā)和運(yùn)維來(lái)共同負(fù)責(zé)的。
測(cè)試環(huán)境
測(cè)試環(huán)境是另一類重要環(huán)境。測(cè)試環(huán)境包含兩種類型:一種是集成環(huán)境,一種是預(yù)發(fā)環(huán)境。預(yù)發(fā)環(huán)境也就是類生產(chǎn)環(huán)境。集成環(huán)境主要用于集成測(cè)試,或者功能性的驗(yàn)證;預(yù)發(fā)環(huán)境主要在驗(yàn)收的過(guò)程中使用。
測(cè)試環(huán)境的目標(biāo)是用盡可能少的資源進(jìn)行獨(dú)立的測(cè)試,做到隔離、復(fù)用、模擬。
例如,應(yīng)用要跟外部的服務(wù)交互,如果外部服務(wù)有問(wèn)題,可以在測(cè)試環(huán)境中模擬一個(gè)。
以某大數(shù)據(jù)產(chǎn)品為例,大數(shù)據(jù)產(chǎn)品大家可能會(huì)覺得環(huán)境要求太高了,沒有辦法做測(cè)試環(huán)境,很多的技術(shù)服務(wù)如Hive、Kafka、MySQL,對(duì)機(jī)器的要求會(huì)很高:Hive、Kafka需要有很多的機(jī)器。另外,還需要Redis做緩存、Zookeeper做服務(wù)發(fā)現(xiàn)。最早的時(shí)候就一套測(cè)試環(huán)境,這個(gè)顯然是很低效的。如果有50個(gè)開發(fā),共享一套測(cè)試環(huán)境,頻繁沖突的情況下,幾乎沒有辦法做測(cè)試。
為了解決這個(gè)問(wèn)題,服務(wù)和應(yīng)用可以做一些分層,這里分成三層。首先是公共的基礎(chǔ)服務(wù),比如Hive、Kafka;然后是獨(dú)立的小服務(wù),比如Redis、Zookeeper。在測(cè)試環(huán)境下,Redis和Zookeeper全部用單點(diǎn)是沒有問(wèn)題的,可以在一臺(tái)虛擬機(jī)上跑起來(lái);最上層是應(yīng)用,只部署必須的應(yīng)用以完成所要的測(cè)試工作。
因此,測(cè)試環(huán)境將會(huì)這么管理:首先所有的公共服務(wù)是共享的基礎(chǔ)服務(wù),所有的測(cè)試環(huán)境都依賴這些基礎(chǔ)服務(wù),各個(gè)環(huán)境的數(shù)據(jù)通過(guò)邏輯機(jī)制(如命名空間)進(jìn)行隔離。在每一個(gè)測(cè)試環(huán)境會(huì)部署一套獨(dú)立服務(wù)的Redis、Zookeeper。
應(yīng)用層只部署所需要的應(yīng)用,這樣基本可以做到只消耗很小的資源就可以部署一套測(cè)試環(huán)境。很多的測(cè)試資源利用率很低,如果完整的搭一套環(huán)境的話你會(huì)發(fā)現(xiàn)99.99%的情況下,資源利用率都很低。
另外測(cè)試環(huán)境都應(yīng)當(dāng)是臨時(shí)環(huán)境,這一點(diǎn)很重要。如果把測(cè)試環(huán)境用作長(zhǎng)期環(huán)境,使用者會(huì)習(xí)慣某個(gè)環(huán)境就是他的,例如給環(huán)境起名字,這個(gè)環(huán)境其他人不能用,而這樣會(huì)造成很大的浪費(fèi),畢竟每天使用的時(shí)間都是有限的。我們希望測(cè)試環(huán)境的資源是一個(gè)池子,可以被復(fù)用,用完即銷毀。這也同時(shí)要求提高測(cè)試效率,在最短的時(shí)間內(nèi)做更多的測(cè)試。
開發(fā)環(huán)境
開發(fā)環(huán)境是除了上文我們說(shuō)到的生產(chǎn)環(huán)境和測(cè)試環(huán)境之外涉及最多的環(huán)境,比如開發(fā)、構(gòu)建要用到的一些工具鏈,都屬于開發(fā)環(huán)境的范疇。在開發(fā)環(huán)境下,我們的關(guān)注點(diǎn)是在本地上怎么把服務(wù)順暢跑起來(lái)。
理想的開發(fā)環(huán)境可以跟其他的服務(wù)打通,且雙向連通,因此有3個(gè)需要解決的問(wèn)題:首先這個(gè)開發(fā)環(huán)境怎么訪問(wèn)基礎(chǔ)環(huán)境中的服務(wù),比如另外一個(gè)Service。第二個(gè)是怎么讓其他服務(wù)訪問(wèn)到我們開發(fā)中的服務(wù)。第三個(gè)是怎么與其他的開發(fā)環(huán)境的請(qǐng)求和數(shù)據(jù)隔離。這也是我們?cè)谇懊鏈y(cè)試環(huán)境遇到的類似的問(wèn)題,因此在開發(fā)環(huán)境之間也需要類似的手段,云效團(tuán)隊(duì)開源的kt-connect就是為了解決這個(gè)問(wèn)題而設(shè)計(jì)的一個(gè)工具。
在開發(fā)環(huán)境里也會(huì)有相應(yīng)的一些工具,如上圖所示。大家也可以看一下,你常用的有哪些。
測(cè)試環(huán)境之痛
很多公司、很多人一提到測(cè)試環(huán)境就會(huì)說(shuō)測(cè)試環(huán)境不夠用、測(cè)試環(huán)境不穩(wěn)定。我們?cè)跍y(cè)試環(huán)境中會(huì)面臨哪些挑戰(zhàn)?尤其是分布式應(yīng)用。在微服務(wù)化之后,分布式所面對(duì)的挑戰(zhàn)也越發(fā)明顯,這些挑戰(zhàn)很多和環(huán)境有關(guān)。
例如某個(gè)應(yīng)用變化沒有做很好的驗(yàn)證,無(wú)意間進(jìn)入到集成環(huán)境。這樣它進(jìn)入集成環(huán)境的時(shí)候本身質(zhì)量是無(wú)法保證的。而在集成測(cè)試階段,應(yīng)用之間的關(guān)系非常復(fù)雜,一個(gè)服務(wù)不穩(wěn)定,其他的鏈路都很有可能不穩(wěn)定。
這也導(dǎo)致我們經(jīng)常沒有辦法很好地進(jìn)行日常集成測(cè)試。因?yàn)榍懊娴倪^(guò)程沒有辦法保證,這個(gè)時(shí)候變化的應(yīng)用會(huì)占用預(yù)發(fā)環(huán)境,而預(yù)發(fā)環(huán)境又是一個(gè)相對(duì)高成本的環(huán)境,不可能經(jīng)常被某個(gè)人占用。于是,為了能讓所有人都可以使用預(yù)發(fā),對(duì)預(yù)發(fā)的使用將會(huì)變成很多人批量進(jìn)行,這樣預(yù)發(fā)變成長(zhǎng)期環(huán)境,帶來(lái)的后果就是預(yù)發(fā)的時(shí)間增長(zhǎng),整個(gè)開發(fā)周期和交付周期都會(huì)增長(zhǎng)。在持續(xù)交付的流程當(dāng)中,我們?cè)跍y(cè)試環(huán)境當(dāng)中會(huì)面臨非常多的挑戰(zhàn):不穩(wěn)定的問(wèn)題、資源的問(wèn)題、集成的問(wèn)題等。
就目前來(lái)說(shuō),大家會(huì)遇到的比較多的測(cè)試環(huán)境的問(wèn)題,大都源自服務(wù)沒有進(jìn)行有效的治理。服務(wù)方法多,耦合高,一旦某個(gè)服務(wù)出現(xiàn)問(wèn)題,其他的都會(huì)受到影響。當(dāng)一個(gè)環(huán)境的服務(wù)都是處在變化中時(shí),由于隨時(shí)都有不穩(wěn)定的服務(wù)在部署,整個(gè)環(huán)境也將是不穩(wěn)定的。
集成環(huán)境無(wú)法穩(wěn)定的后果是大量的測(cè)試遷往預(yù)發(fā),預(yù)發(fā)成為瓶頸之后又往線上遷移。任何應(yīng)用最終都會(huì)用線上環(huán)境來(lái)兜底。
總結(jié)來(lái)看,測(cè)試環(huán)境主要面臨如下2個(gè)挑戰(zhàn):
第一個(gè)是如何解決服務(wù)之間的依賴。比如A對(duì)C的強(qiáng)依賴,A的功能成功與否取決于C,而且C變化之后也要在A上面做相應(yīng)的驗(yàn)證,保證C的變化是對(duì)的。
另外一個(gè)是環(huán)境本身的,主要有2點(diǎn),一個(gè)是機(jī)器的穩(wěn)定性,另一個(gè)是服務(wù)本身的穩(wěn)定性。
機(jī)器的穩(wěn)定主要是:有效應(yīng)對(duì)硬盤故障,網(wǎng)絡(luò)故障等情況,做好系統(tǒng)的備份和容災(zāi)。
服務(wù)本身的穩(wěn)定主要是:有效確保每個(gè)服務(wù)自身的可用性,因?yàn)榧偃缫粋€(gè)應(yīng)用的可用性是90%的話,那10個(gè)應(yīng)用就是90%的10次方,導(dǎo)致整個(gè)的系統(tǒng)都會(huì)很低。
如何保證測(cè)試環(huán)境的穩(wěn)定性
上文我們說(shuō)到了測(cè)試環(huán)境存在的兩種挑戰(zhàn)。任何測(cè)試環(huán)境都需要保證其穩(wěn)定性,降低使用線上環(huán)境的風(fēng)險(xiǎn)。那么如何保證測(cè)試環(huán)境的穩(wěn)定性呢?
在測(cè)試環(huán)境中常用的實(shí)踐主要有:雙機(jī)部署、N+1部署、隔離環(huán)境等。
例如我們一個(gè)應(yīng)用至少部署兩個(gè)Pod,保證至少一個(gè)在提供服務(wù),不能讓兩個(gè)同時(shí)重啟。確實(shí)會(huì)發(fā)生這樣的情況:在某個(gè)測(cè)試環(huán)境,如果某個(gè)服務(wù)只有一個(gè)副本,該服務(wù)發(fā)生部署導(dǎo)致重啟,會(huì)導(dǎo)致整個(gè)測(cè)試的不可用。在這種情況下雙機(jī)部署是很好的快速解決手段,但也占用了較多的資源。
為了解決雙機(jī)部署資源占用高的缺點(diǎn),N+1的部署方式應(yīng)運(yùn)而生。采用滾動(dòng)的方式逐個(gè)替換服務(wù)應(yīng)用。這樣你的機(jī)器就只有一個(gè)是處于變化當(dāng)中,其他都是work的。這也是K8S默認(rèn)的方式,一般會(huì)生成新的實(shí)例,然后再把舊的實(shí)例下掉。
為了保證測(cè)試系統(tǒng)的穩(wěn)定性,我們需要做隔離,盡量做到除自己修改的應(yīng)用,其它應(yīng)用都是穩(wěn)定的。
在阿里,團(tuán)隊(duì)引入了項(xiàng)目預(yù)集成環(huán)境,在阿里內(nèi)部叫項(xiàng)目環(huán)境,這是一個(gè)隔離出來(lái)的環(huán)境,針對(duì)某一個(gè)特性在開發(fā)的階段單獨(dú)的拉取一個(gè)環(huán)境出來(lái)。
綜上所述,預(yù)集成環(huán)境是隔離的,跟誰(shuí)都沒有關(guān)系,所依賴的其它服務(wù)都來(lái)源于穩(wěn)定的環(huán)境,以保證依賴的服務(wù)都是穩(wěn)定的,以便進(jìn)行獨(dú)立的開發(fā)和測(cè)試。
在項(xiàng)目早期的時(shí)候,項(xiàng)目預(yù)集成環(huán)境里依賴的環(huán)境還是日常集成環(huán)境,無(wú)論如何肯定比什么都不做直接放入日常集成環(huán)境里面好很多。這個(gè)時(shí)候我們發(fā)現(xiàn)日常集成環(huán)境還是有問(wèn)題,因?yàn)樵陧?xiàng)目初期并不能保證所有的提交都會(huì)在項(xiàng)目預(yù)集成環(huán)境去做驗(yàn)證,因此會(huì)導(dǎo)致日常集成環(huán)境里面的依賴也可能存在很大的問(wèn)題,其實(shí)本質(zhì)上又回到了我們要治理日常的集成環(huán)境的事情,怎么樣維持相對(duì)穩(wěn)定。
針對(duì)上述問(wèn)題,我們引入穩(wěn)定環(huán)境的概念。既然我們將環(huán)境隔離出來(lái)了,但隔離依賴的基礎(chǔ)環(huán)境不穩(wěn)定,這個(gè)時(shí)候假如我們有一個(gè)穩(wěn)定的環(huán)境是否就能解決問(wèn)題了呢?
什么樣的環(huán)境是穩(wěn)定環(huán)境呢?就是能夠發(fā)布到線上版本的環(huán)境,線上環(huán)境肯定是穩(wěn)定環(huán)境,所以我們的穩(wěn)定環(huán)境其實(shí)是由與線上版本一致的應(yīng)用服務(wù)組成的,跟線上的服務(wù)是一致的。線上穩(wěn)定,這個(gè)環(huán)境就是穩(wěn)定的,所以我們就可以在這種穩(wěn)定環(huán)境下再去創(chuàng)造隔離環(huán)境,從而保證整體穩(wěn)定性。
當(dāng)有了穩(wěn)定的基礎(chǔ)環(huán)境,在應(yīng)用部署到生產(chǎn)環(huán)境之后,也同樣要把它部署到基礎(chǔ)環(huán)境中去,提供一個(gè)給測(cè)試環(huán)境作為依賴的基礎(chǔ)環(huán)境。有了這樣一個(gè)基礎(chǔ)環(huán)境依賴,在我們應(yīng)用開發(fā)時(shí),拉出來(lái)的環(huán)境就是完全隔離的,只包含和我緊密相關(guān)的幾個(gè)變化當(dāng)中的應(yīng)用,其余所有的依賴的服務(wù)都是從基礎(chǔ)環(huán)境里面來(lái)的。
這里提到了基礎(chǔ)環(huán)境的概念,那么什么是基礎(chǔ)環(huán)境呢?基礎(chǔ)環(huán)境是一個(gè)穩(wěn)定的環(huán)境,當(dāng)有了一個(gè)穩(wěn)定的集成環(huán)境就可以做隔離的環(huán)境,特性測(cè)試將可以基于該隔離環(huán)境,依賴的流量也可以在隔離環(huán)境里面找。但基礎(chǔ)環(huán)境有一定的維護(hù)成本,雖然部署成本相對(duì)來(lái)說(shuō)很低,其占用的機(jī)器資源相對(duì)于一般大公司來(lái)說(shuō)不是太大的問(wèn)題,但對(duì)小公司可能是一個(gè)問(wèn)題。但主要的成本是基礎(chǔ)環(huán)境的維護(hù),對(duì)基礎(chǔ)環(huán)境進(jìn)行監(jiān)控并修復(fù)出現(xiàn)的問(wèn)題,這在人力上需要一定的投入。
基礎(chǔ)環(huán)境的維護(hù)者一般不是這個(gè)環(huán)境的使用者,所以這個(gè)時(shí)候需要有一個(gè)比較成熟的機(jī)制保證基礎(chǔ)環(huán)境長(zhǎng)期穩(wěn)定的運(yùn)行。我們開一下腦洞,如果說(shuō)沒有新的基礎(chǔ)環(huán)境,哪一個(gè)環(huán)境是最穩(wěn)定的呢?我們?cè)谇懊姘丫€上線下用防火墻隔開了,為什么隔開大家都知道,我們是怕安全風(fēng)險(xiǎn),怕數(shù)據(jù)污染,但是如果我們的隔離能力做的足夠好,服務(wù)路由做的足夠好,監(jiān)控做的足夠好,安全保護(hù)做的足夠好,我們是可以用生產(chǎn)環(huán)境來(lái)做基礎(chǔ)環(huán)境的。
生產(chǎn)環(huán)境做基礎(chǔ)環(huán)境,要解決兩個(gè)重要的問(wèn)題,第一個(gè)是流量隔離,流量隔離相對(duì)來(lái)說(shuō)問(wèn)題不太大,從以前面向資源到現(xiàn)在面向流量的隔離有很多現(xiàn)成的手段可以做。第二個(gè)是數(shù)據(jù)隔離。這個(gè)是挺大的挑戰(zhàn),數(shù)據(jù)形式有很多種,比如說(shuō)消息隊(duì)列和普通的數(shù)據(jù)庫(kù)不一樣,數(shù)倉(cāng)又不一樣,很多麻煩的問(wèn)題在這里,但是具體到某一個(gè)點(diǎn)上都有辦法解決。
小結(jié)
總結(jié)一下,對(duì)于生產(chǎn)環(huán)境,準(zhǔn)確、穩(wěn)定最重要,我們推薦以應(yīng)用為中心的基于OAM和IaC的實(shí)踐方式;對(duì)于測(cè)試環(huán)境,隔離、低成本和穩(wěn)定的依賴是最重要的,我們推薦基于穩(wěn)定環(huán)境的隔離測(cè)試環(huán)境的實(shí)踐,復(fù)用穩(wěn)定環(huán)境,通過(guò)流量隔離和數(shù)據(jù)隔離來(lái)生成測(cè)試環(huán)境。通過(guò)環(huán)境建設(shè),我們解決了研發(fā)過(guò)程中的資源沖突,下一章我們將關(guān)注研發(fā)過(guò)程中的協(xié)作問(wèn)題。
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的开发之痛:稳定的测试环境,怎么就那么难的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 「技术人生」第6篇:技术同学应该如何理解
- 下一篇: 【ESSD技术解读-01】 云原生时代,