海豚瀏覽器于2010年2月正式發(fā)布Android版本,在正式發(fā)布的近一年之后從一個純客戶端的產品開始迭代式地進化,逐漸加入各種云端服務的功能,海豚瀏覽器的云端之路也因此而啟程。在創(chuàng)業(yè)之初,因為資源、人手的各種緊缺,自然而然的云端服務的部署也就成為首選。當時在國外的創(chuàng)業(yè)型小公司中,亞馬遜云平臺(Amazon AWS)備受青睞,因此我們也毫不猶豫的選擇了AWS做為服務商,并且在海豚閱讀(Dolphin Webzine)的第一次發(fā)布里做了大規(guī)模的嘗試,隨后又相繼推出了海豚同步,海豚聲納等云服務。
起初接觸云平臺其實更多地仍然是把云平臺當成普通的IDC主機租用服務在用,體驗到的優(yōu)勢是相對于物理主機而言,云主機(instance)上線/下線都比較方便。而且不像國內很多主機服務是預充值或者預付款的消費模式,AWS平臺的付款直接與信用卡掛鉤,用多少就付多少,非常靈活。隨著時間的推移,對云平臺認識的淺顯和不充分,導致我們吃了不少的苦頭,當然也積累了不少經驗教訓。到現(xiàn)在,整個AWS云平臺(見圖1)的大部分服務我們都有實際使用的經驗。
圖1:AWS服務棧
云平臺上的擴展性
說到云平臺的使用就不得不先說說水平擴展(scale out)。之前我們的做法是在服務正式對外發(fā)布之前,部署多套同角色的機器(比如前端機器和應用服務器),就為了保證能夠應對突發(fā)的流量增長。這些備用機器的部署和使用在云平臺上其實是沒有多大必要的。在AWS上完全可以通過ELB這樣的一個彈性負載均衡器來自動實現(xiàn)服務的水平擴展,ELB支持多種協(xié)議,并且可以自定義水平擴展的條件,對于服務的開發(fā)者來說,這省了不少開發(fā)的活,而且對于普通的負載均衡應用場景來說,它完全可以替代Nginx或者HAProxy。
對于垂直擴展(scale up)來說,有兩點比較重要,一是對云主機升降級時類型的選擇,二是了解云主機的生命周期。EC2上的云主機有固定的好幾種類型,首選一般都是64位機器,這樣方便內存擴容,如果對于CPU消耗比較高(比如HTTPS連接),那么優(yōu)先選High-CPU型的,如果是對內存要求比較大(比如MongoDB),那么優(yōu)先選High-Memory型的。海豚的大多數機器選型集中在micro/small用作監(jiān)控和前端,small/medium部署應用服務、消息隊列,medium/large做數據庫和離線計算。xlarge再往上用得很少,基本上都靠水平擴展解決了。對于云主機的生命周期來說,restart和stop/start是有區(qū)別的,升降級的時候必須要stop云主機,升降級完畢再啟動的時候,機器的內部IP會發(fā)生變化(IP通過DHCP分配的),這一點經常會給依賴IP的服務配置造成問題。解決的辦法有兩個,一個是通過VPC來自己控制IP地址分配,另外一個就是使用Elastic IP這樣的靜態(tài)地址。
云平臺上的存儲
和計算資源一樣,存儲資源是一個云平臺的核心要素之一。云平臺上的存儲按照使用場景分為三大類型:
·臨時存儲。AWS的instance storage就是臨時存儲的一種,主要用來存放緩存和一些中間結果等內容。要注意的是臨時存儲的內容在云主機stop以后就會被清空,因為通過df命令往往看不出來這一點,所以之前有過把instance storage當成持久化存儲的經歷,損失就很慘重。
·持久化存儲。持久化存儲最常指的就是物理硬盤,在AWS平臺上,EBS就是這樣的一個可以以任意大小被掛載的“硬盤”,實際上它的實現(xiàn)是一個網絡文件系統(tǒng),因此它的訪問速率受限于網絡帶寬,而且不是那么穩(wěn)定。通??梢酝ㄟ^在EBS標準的volume上做RAID或者使用最新推出的Provisioned IOPS volume來解決I/O速率問題。另外盡管EBS是持久化存儲,并不意味著它就不會發(fā)生數據的丟失,EBS的年化不良率有0.1%-0.5%,因此對于單存儲節(jié)點來說需要定期的去做EBS的鏡像和備份,以防止意外的發(fā)生。
·大規(guī)模冗余存儲。S3就是這種存儲類型的樣例。S3不是一個文件系統(tǒng)的架構,I/O速率和延遲也不及EBS,但它的好處在于一方面可以在一個比較低的價格(和EBS差不多)提供99.999999999%的可靠性,另外一方面可以存取非常大規(guī)模,比如PB級別的數據,這些數據可以在不限于AWS的任何地方使用。海豚就用S3存儲了幾乎所有的鏡像、數據備份和各種日志。除此之外,S3和CloudFront(AWS的CDN解決方案)集成程度很高,因此海豚也通常使用S3作為APK等內容分發(fā)的渠道。