Amazon 的 CEO Jeff Bezos 前幾天在致股東的信中表示 ,亞馬遜云服務(wù) AWS 目前已經(jīng)有超過(guò) 100 萬(wàn)的用戶,2016年 的營(yíng)收也將突破 100 億美元。Amazon 的 AWS 服務(wù)是在 2006年3月 推出,距今已有整整 10年 的時(shí)間了。AWS 最早推出的云服務(wù)是簡(jiǎn)單儲(chǔ)存服務(wù) Simple Storage Service (S3),后來(lái)又陸續(xù)推出了 Amazon 彈性計(jì)算網(wǎng)云 Elastic Compute Cloud (EC2)、亞馬遜簡(jiǎn)單數(shù)據(jù)庫(kù)(Amazon SimpleDB)、亞馬遜簡(jiǎn)單隊(duì)列服務(wù)(Amazon Simple Queue Service)以及 Amazon CloudFront 等云服務(wù)。目前,成千上萬(wàn)的創(chuàng)業(yè)公司在 AWS 的數(shù)據(jù)中心和服務(wù)基礎(chǔ)上構(gòu)建了自己的在線業(yè)務(wù)。不僅大量小公司依賴于 Amazon AWS 的云計(jì)算服務(wù),很多諸如 Adobe、GE、Netflix 和 Pinterest 這樣的大公司也都在使用 Amazon 的 AWS 服務(wù)。
在 Amazon 的 AWS 服務(wù)上線 10 周年之際,推動(dòng) AWS 服務(wù)發(fā)展的核心人物、Amazon 的 CTO Werner Vogels 在本文中專(zhuān)門(mén)總結(jié)和分享了他在 AWS 上線運(yùn)營(yíng) 10年 過(guò)程中的學(xué)到的 10 條經(jīng)驗(yàn),希望對(duì)大家有所啟發(fā)和借鑒。
1. 從第一天開(kāi)始,就要打造一個(gè)可以持續(xù)演化的系統(tǒng)
從第一天開(kāi)始,我們就非常清楚地認(rèn)識(shí)到,我們所開(kāi)發(fā)的這套軟件是一個(gè)一定需要持續(xù)改進(jìn)的軟件,現(xiàn)在開(kāi)發(fā)的軟件可能并不是一年以后運(yùn)行的軟件。我們當(dāng)時(shí)是這樣預(yù)期的,隨著數(shù)量級(jí)的增加,我們就需要去重新檢視和修改我們已有的架構(gòu),確保能夠解決擴(kuò)展性的問(wèn)題。
然而,由于全世界不同地方的很多公司都依賴著我們平臺(tái)所提供的 7 x 24 小時(shí)全天候不間斷的服務(wù),因此我們無(wú)法采用過(guò)去通常采用的通過(guò)維護(hù)停機(jī)、進(jìn)行系統(tǒng)升級(jí)的方式來(lái)達(dá)到這一目標(biāo)。因此,我們從開(kāi)始就需要打造一個(gè)在引入新的軟件構(gòu)件時(shí)不會(huì)迫使服務(wù)暫停的架構(gòu)。Amazon 的一位非常出色的工程師 Marvin Theimer 有一次曾開(kāi)玩笑說(shuō),Amazon S3 服務(wù)的持續(xù)演進(jìn)和下面這個(gè)場(chǎng)景非常像:我們最開(kāi)始開(kāi)的是一架單引擎的賽斯納飛機(jī),在開(kāi)了一段時(shí)間后升級(jí)成了一架波音 737 飛機(jī),之后又換成了一支波音 747 飛機(jī)編隊(duì),我們現(xiàn)在開(kāi)的則更像是由空中巨無(wú)霸空客 A380 組成的一支大型飛機(jī)編隊(duì)。從最開(kāi)始到現(xiàn)在,我們都是通過(guò)空中加油的方式確保飛機(jī)的正常飛行的,與此同時(shí),我們直接將 AWS 的用戶在空中從一架舊飛機(jī)上轉(zhuǎn)移到另一架新飛機(jī)上面,而 AWS 用戶在這整個(gè)過(guò)程中甚至沒(méi)有意識(shí)到他們被悄悄地轉(zhuǎn)移到另一架更先進(jìn)的飛機(jī)里了。
2. 為意料之外的失敗和問(wèn)題做好充分準(zhǔn)備
失效是難以避免的的,隨著時(shí)間的推移,任何東西都有可能會(huì)出現(xiàn)這樣那樣的問(wèn)題:從路由器到硬盤(pán),從操作系統(tǒng)到存儲(chǔ)單元損壞的 TCP 數(shù)據(jù)包,從瞬間誤差到永久失效等等。不管是使用高質(zhì)量的硬件還是低成本的組件,這些問(wèn)題都將無(wú)可避免地出現(xiàn)。
隨著服務(wù)規(guī)模的擴(kuò)大,懂得這個(gè)問(wèn)題將變得越來(lái)越重要:舉個(gè)例子,當(dāng) Amazon S3 的服務(wù)處理數(shù)億的存儲(chǔ)交易時(shí),即使是可能性最小的錯(cuò)誤也會(huì)變成現(xiàn)實(shí)。這些失敗和出問(wèn)題的場(chǎng)景中的一部分是可以被事先預(yù)想的,然而很多問(wèn)題在設(shè)計(jì)和構(gòu)建過(guò)程中是無(wú)法被事先考慮到的。
所以說(shuō),我們需要打造一個(gè)將失敗和故障視為自然會(huì)發(fā)生的系統(tǒng),即使我們不知道故障和問(wèn)題可能會(huì)是什么。這個(gè)系統(tǒng)需要在即使 “屋里已經(jīng)失火” 的情況下依然能夠維持正常運(yùn)行的狀態(tài)。其中很重要的一點(diǎn)是,要能夠在不讓整個(gè)系統(tǒng)宕機(jī)的情況下就能處理好受到影響的組件。我們現(xiàn)在已經(jīng)掌握了一套能夠控制故障發(fā)生后所波及范圍的基本技能,這樣一旦出現(xiàn)任何問(wèn)題,系統(tǒng)的整體健康狀況是可以繼續(xù)維持的,不會(huì)出現(xiàn)服務(wù)停機(jī)的狀況。
3. 要提供基元,而非僅提供一個(gè)大而全的統(tǒng)一框架
很快,我們就發(fā)現(xiàn)很多用戶喜歡在 AWS 提供的服務(wù)上持續(xù)構(gòu)建自己的業(yè)務(wù)的。在離開(kāi)了傳統(tǒng)舊世界里備受束縛的 IT 硬件和數(shù)據(jù)中心之后,他們開(kāi)始以一種全新有趣的使用方式來(lái)開(kāi)發(fā)自己的系統(tǒng)。正因?yàn)槿绱?,我們就需要做到足夠地靈活性去滿足用戶各種不同的需求。
我們提供的最重要的機(jī)制之一是為用戶提供一系列基元功能和工具,他們可以選擇自己喜歡的方式來(lái)使用 AWS 服務(wù),而不是提供一個(gè)強(qiáng)迫用戶必須使用的包羅一切的大而全的統(tǒng)一框架。這個(gè)方法讓我們的用戶獲得了巨大的成功,甚至 AWS 后來(lái)提供的的很多服務(wù)都使用了同樣類(lèi)似的服務(wù)機(jī)制,而這個(gè)服務(wù)機(jī)制是我們的很多用戶都已經(jīng)習(xí)慣了的。
此外,在用戶真正開(kāi)始使用我們的服務(wù)開(kāi)發(fā)產(chǎn)品和服務(wù)之前,我們很難去預(yù)測(cè)對(duì)用戶自己的優(yōu)先級(jí)到底是什么,意識(shí)到這一點(diǎn)非常重要。這也是為什么我們后來(lái)推出新服務(wù)最開(kāi)始只配有最小的功能集,這樣一來(lái),我們可以通過(guò)用戶的反饋來(lái)對(duì)擴(kuò)展我們服務(wù)的新功能,以更好地滿足用戶的需求。
4. 自動(dòng)化是關(guān)鍵
開(kāi)發(fā)一個(gè)需要去檢測(cè)維護(hù)的軟件服務(wù)和開(kāi)發(fā)一個(gè)最終交付給客戶的軟件是有著非常大的區(qū)別的。為了滿足用戶對(duì)產(chǎn)品可靠性、性能以及可擴(kuò)展性等方面的期待和需求,管理 AWS 這樣的規(guī)模化系統(tǒng)是需要一種不同的心態(tài)和方法的。
要想實(shí)現(xiàn)上述目標(biāo),一個(gè)關(guān)鍵的機(jī)制就是盡可能地將管理工作全部自動(dòng)化,這樣就可以避免手工操作可能帶來(lái)的任何容易產(chǎn)生的誤差。為了實(shí)現(xiàn)這一目標(biāo),我們需要打造一套可以控制操作中各項(xiàng)主要功能的管理 API。此外,AWS 也能夠幫助用戶同樣實(shí)現(xiàn)這個(gè)目標(biāo)。通過(guò)把你的應(yīng)用分解成一個(gè)個(gè)基本的構(gòu)建模塊,每個(gè)模塊都有自己的管理 API,這樣你就可以利用自動(dòng)化規(guī)則進(jìn)行大規(guī)模可靠、可預(yù)測(cè)的的運(yùn)營(yíng)。自動(dòng)化工作究竟做得如何,有個(gè)很簡(jiǎn)單的檢驗(yàn)方法就是看你是不是還需要 SSH 登陸到服務(wù)器進(jìn)行操作,如果需要的話,說(shuō)明你的自動(dòng)化的工作還有待加強(qiáng)。
5. API 是永恒的,一旦上線便無(wú)法變更
其實(shí)之前在 Amazon 零售業(yè)務(wù)中已經(jīng)吸取了類(lèi)似的經(jīng)驗(yàn)和教訓(xùn)了。然而對(duì)于 AWS 這種以 API 為中心的服務(wù)而言,“API 是永恒的” 這個(gè)原則顯然就變得更為重要了。一旦用戶開(kāi)始使用我們的 API 開(kāi)發(fā)他們的應(yīng)用和系統(tǒng)后,我們就不可能再去對(duì)那些這些 API 做任何變動(dòng)了,因?yàn)樽儎?dòng) API 會(huì)嚴(yán)重影響到用戶的業(yè)務(wù)。我們已經(jīng)意識(shí)到,設(shè)計(jì) API 是一個(gè)非常重要的任務(wù),必須要一次性成功。
6. 關(guān)注和了解自己的資源使用情況
在你為一項(xiàng)服務(wù)制定合適的計(jì)費(fèi)模式的時(shí)候,一定要確保你有一份關(guān)于這項(xiàng)服務(wù)的各項(xiàng)成本和運(yùn)營(yíng)費(fèi)用的詳細(xì)數(shù)據(jù),當(dāng)你運(yùn)營(yíng)一個(gè)業(yè)務(wù)量大、利潤(rùn)率低的業(yè)務(wù)時(shí)更需要如此。AWS 作為一個(gè)服務(wù)提供商,我們必須對(duì)服務(wù)成本非常了如指掌,這樣我們就能清楚地了解基于這一成本,我們是否能夠承擔(dān)得起為用戶提供這項(xiàng)服務(wù)。此外,我們還可以借此找到那些可以通過(guò)提高運(yùn)營(yíng)效率而降低成本的一些方法,并通過(guò)這種方法進(jìn)一步降低服務(wù)價(jià)格,從而讓用戶從中受益。
舉例說(shuō)明一下,在我們發(fā)展早期,我們一開(kāi)始對(duì) Amazon S3 服務(wù)所需要的資源成本其實(shí)并不是非常清楚。我們當(dāng)時(shí)是這樣設(shè)想的,存儲(chǔ)和寬帶成本是我們首先需要考慮的收費(fèi)點(diǎn)。不過(guò)后來(lái)在 Amazon S3 運(yùn)行了一段時(shí)間之后我們開(kāi)始意識(shí)到,請(qǐng)求數(shù)量其實(shí)和存儲(chǔ)與帶寬是一樣重要的。如果有用戶有大量的小文件,在這種情況下,即使這個(gè)用戶請(qǐng)求上百萬(wàn)次,其實(shí)都不會(huì)占用太多的存儲(chǔ)和帶寬資源,占最多資源的其實(shí)是請(qǐng)求數(shù)量。因此我們必須對(duì)收費(fèi)模型進(jìn)行調(diào)整,將請(qǐng)求數(shù)量也放進(jìn)了資源成本中去,這樣才能確保 AWS 有一個(gè)可以持續(xù)發(fā)展的業(yè)務(wù)。
7. 從一開(kāi)始就要將安全問(wèn)題考慮進(jìn)去
保護(hù)用戶的安全是一個(gè)你永遠(yuǎn)都要排在第一位的優(yōu)先級(jí)問(wèn)題,在 AWS 當(dāng)然也是這樣,這無(wú)論從運(yùn)營(yíng)的角度來(lái)看,還是從工具和機(jī)制的角度來(lái)看都是如此。因此,我們?cè)诎踩矫娴耐度雽⒁恢笔俏覀兊牡谝淮笸度搿?/p>
我們很快就學(xué)會(huì)的一個(gè)方法是,為了打造更加安全的服務(wù),這就要求我們?cè)诜?wù)設(shè)計(jì)的最初階段就將安全問(wèn)題考慮進(jìn)去。安全團(tuán)隊(duì)的工作不是在一項(xiàng)服務(wù)開(kāi)發(fā)完成之后再去檢查驗(yàn)證它的安全性問(wèn)題到底如何。安全團(tuán)隊(duì)?wèi)?yīng)該在開(kāi)發(fā)工作開(kāi)始后的第一天就參與到產(chǎn)品開(kāi)發(fā)中去,確保安全問(wèn)題在剛開(kāi)始開(kāi)發(fā)時(shí)就被考慮進(jìn)去,而且貫穿于整個(gè)項(xiàng)目的開(kāi)發(fā)的全過(guò)程。在任何涉及安全的問(wèn)題時(shí),你都不能做任何妥協(xié)。
8. 數(shù)據(jù)加密太重要
數(shù)據(jù)加密是讓用戶確保他們對(duì)誰(shuí)能獲取自己的數(shù)據(jù)擁有絕對(duì)控制權(quán)的一個(gè)關(guān)鍵機(jī)制。在 10年 以前,用于數(shù)據(jù)加密的相關(guān)的工具和服務(wù)的使用體驗(yàn)非常差,直到 AWS 開(kāi)始運(yùn)營(yíng)后的最初幾年里,我們慢慢知道了如何最好地將數(shù)據(jù)加密功能整合進(jìn)我們的服務(wù)里。
Amazon S3 最初提供的是服務(wù)器端的加密。如果你想檢查我們數(shù)據(jù)中心的任何磁盤(pán),你是無(wú)法訪問(wèn)到任何數(shù)據(jù)的。后來(lái),我們陸續(xù)推出了 Amazon CloudHSM 和 Amazon Key Management Service,這些服務(wù)允許用戶利用自己的加密秘鑰對(duì)數(shù)據(jù)進(jìn)行加密,這樣就不需要 AWS 再去幫助用戶去管理他們的加密密鑰了。
如今,在 AWS 所有新推出的服務(wù)中,對(duì)數(shù)據(jù)加密的支持已經(jīng)在服務(wù)的原型設(shè)計(jì)階段就被整合進(jìn)去了。例如在 Amazon Redshift 這項(xiàng)服務(wù)里,每一個(gè)數(shù)據(jù)模塊都是通過(guò)一個(gè)隨機(jī)的密鑰進(jìn)行加密的,而所有這些隨機(jī)密鑰最后又都是由一個(gè)主密鑰進(jìn)行加密的。用戶是可以自己自主定義這個(gè)主密鑰的,這樣就保證了用戶自己是唯一能夠加密和訪問(wèn)這些關(guān)鍵業(yè)務(wù)數(shù)據(jù)或個(gè)人隱私信息的人。
數(shù)據(jù)加密在我們的業(yè)務(wù)中一直都是一個(gè)優(yōu)先級(jí)比較高的工作。我們會(huì)持續(xù)不斷地對(duì)數(shù)據(jù)加密改進(jìn),讓數(shù)據(jù)加密能夠更方便地使用,這樣用戶能更好地保護(hù)自己和自己的客戶。
9. 網(wǎng)絡(luò)的重要性
AWS 業(yè)務(wù)已經(jīng)支撐了很多不同種類(lèi)的負(fù)載,從大容量事務(wù)處理到大規(guī)模視頻轉(zhuǎn)碼,從高性能并行計(jì)算到巨大的網(wǎng)站流量等等,所有這些負(fù)載對(duì)網(wǎng)絡(luò)都有非常獨(dú)特的需求。
在數(shù)據(jù)中心布局和運(yùn)維的創(chuàng)新方面,AWS 已經(jīng)開(kāi)發(fā)出了一種獨(dú)特的新技術(shù),這讓我們能夠提供更加靈活的網(wǎng)絡(luò)基礎(chǔ)設(shè)施去滿足不同用戶的不同負(fù)載的需求。我們?cè)谶@個(gè)過(guò)程總學(xué)習(xí)到,為了能夠讓用戶實(shí)現(xiàn)自身的目標(biāo),我們必須開(kāi)發(fā)自己的網(wǎng)絡(luò)硬件解決方案。這也讓我們能夠滿足我們一些定制化的需求,例如,為了確保最高等級(jí)的安全性,我們可以在網(wǎng)絡(luò)上將不同的用戶彼此隔離開(kāi)來(lái)。
另一個(gè) AWS 通過(guò)自己設(shè)計(jì)的網(wǎng)絡(luò)硬件和軟件解決方案去進(jìn)一步幫助用戶改善性能的例子就是解決虛擬機(jī)之間的網(wǎng)絡(luò)訪問(wèn)。因?yàn)榫W(wǎng)絡(luò)訪問(wèn)是一個(gè)共享的資源,用戶之前經(jīng)常會(huì)遇到網(wǎng)路擁堵的問(wèn)題。AWS 后來(lái)開(kāi)發(fā)了能夠支持單根 IO 虛擬化技術(shù)的 NIC,它能夠讓我們給每個(gè)虛擬機(jī)虛擬出自己的 NIC,這個(gè)做法有效降低了網(wǎng)絡(luò)延遲兩倍以上。
10. 不設(shè)守門(mén)人
為了給用戶提供一個(gè)更加廣闊和深度的服務(wù)平臺(tái),AWS 團(tuán)隊(duì)陸續(xù)開(kāi)發(fā)和提供了越來(lái)越多的服務(wù)和功能。不過(guò) AWS 遠(yuǎn)不限于我們目前已經(jīng)提供過(guò)的這些功能和服務(wù),我們的很多合作伙伴基于 AWS 提供的服務(wù)進(jìn)一步擴(kuò)大和豐富了整個(gè) AWS 生態(tài)系統(tǒng)。
比如,我們的合作伙伴 Stripe 利用我們的服務(wù)提供的支付服務(wù),以及 Twilio 利用 AWS 服務(wù)提供的網(wǎng)絡(luò)電話業(yè)務(wù)等。我們的很多用戶基于 AWS 服務(wù)開(kāi)發(fā)出自己的平臺(tái),以解決各自垂直領(lǐng)域的一些問(wèn)題。例如飛利浦開(kāi)發(fā)了用于健康數(shù)據(jù)管理的數(shù)字平臺(tái) Healthsuite Digital Platform,Ohpen 在 AWS 基礎(chǔ)上開(kāi)發(fā)了一個(gè)零售銀行平臺(tái),Eagle Genomics 開(kāi)發(fā)了基因處理平臺(tái),這樣的例子還有很多。
在 AWS 平臺(tái)上,我們是不設(shè)守門(mén)人(gatekeeper)的,因此我們不會(huì)告訴我們的合作伙伴他們?cè)?AWS 平臺(tái)上什么可以做、什么不可以做。“沒(méi)有守門(mén)人” 這一點(diǎn)能夠激發(fā)更多、更好地創(chuàng)新。