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