基于彈性計算平臺構(gòu)建高可用、可擴(kuò)展的應(yīng)用
前不久,F(xiàn)acebook宣布投資10億美元收購僅成立15個月的移動照片分享應(yīng)用Instagram,消息傳出時,人們不僅驚嘆于這筆巨額的交易,更為這支13個人的小團(tuán)隊感到不可思議。Instagram的Android版客戶端發(fā)布時,24小時內(nèi)下載量超過100萬,高峰期達(dá)到每分鐘2000次,是下載量最大的Android應(yīng)用之一。究竟是什么原因讓這支團(tuán)隊在很短的時間內(nèi)一鳴驚人?又是什么技術(shù)讓他們在巨大的下載量下頂住了壓力?
讓我們回顧一下Instagram開發(fā)團(tuán)隊奉行的3大原則:
1、Keep it very simple(極簡主義);
2、Don't re-invent the wheel (不重復(fù)發(fā)明輪子);
3、Go with proven and solid technologies when you can (能用就用靠譜的技術(shù));
總而言之,專注于自己的業(yè)務(wù)和擅長領(lǐng)域,其它事情讓更專業(yè)的人去做。Instagram選擇了美國的亞馬遜云計算平臺作為基礎(chǔ)設(shè)施提供商,他們部署了數(shù)以百計的云服務(wù)器和存儲服務(wù),卻只有區(qū)區(qū)3名工程師負(fù)責(zé)維護(hù),不需要任何現(xiàn)場人員支持。如果依賴于傳統(tǒng)的IDC服務(wù),光是把這幾百臺服務(wù)器托管到IDC機(jī)房,就需要數(shù)天時間和大量的人力成本。每當(dāng)發(fā)布一個新版本時,Instagram所要做的只是在云計算平臺上開啟更多的服務(wù)器,便可穩(wěn)坐釣魚臺,看著自己應(yīng)用的下載量節(jié)節(jié)攀升了。
阿里云彈性計算平臺(Elastic Compute Service,簡稱ECS)面向中國互聯(lián)網(wǎng)開發(fā)者和站長,致力于為中國的Instagram提供靠譜的互聯(lián)網(wǎng)基礎(chǔ)服務(wù)。它基于底層的飛天分布式計算系統(tǒng),結(jié)合高性能虛擬化技術(shù),實(shí)現(xiàn)了計算、存儲和網(wǎng)絡(luò)資源的統(tǒng)一調(diào)度和彈性分配。在具體的產(chǎn)品形式上,客戶接觸的是最簡單的云服務(wù)器,與物理機(jī)無二,沒有任何的使用門檻。由于采用了云計算技術(shù),相比傳統(tǒng)的IDC托管服務(wù),彈性計算在自助管理、資源組合靈活性、基礎(chǔ)環(huán)境定制化、數(shù)據(jù)安全性及硬件資源利用率上都有不小的優(yōu)勢。
在本文中,我們將和大家分享在云計算平臺上構(gòu)建高可用、可擴(kuò)展應(yīng)用的一些進(jìn)階技巧??紤]到有些讀者尚未接觸過ECS,所以在進(jìn)入正題之前,讓我們簡單瀏覽一下ECS的各項特性。
自助管理
ECS在aliyun.com的控制臺中提供了多種用戶自助的操作,例如最為常見的創(chuàng)建、啟動、關(guān)閉云服務(wù)器,將來還會陸續(xù)推出比較高級的快照、自定義鏡像(Image)等功能?;叵胛覀円郧坝龅椒?wù)器不可訪問時,提交工單、電話催促,在經(jīng)歷漫長等待之后,也未必能夠得到一個滿意的答復(fù)。現(xiàn)在,我們可以在控制臺中全程監(jiān)控和管理每一臺服務(wù)器的運(yùn)行情況,從而做出快速的決定--重啟或者部署新的服務(wù)器。
ECS支持目前主流的Windows和Linux系列操作系統(tǒng)。用戶不僅可以使用這些標(biāo)準(zhǔn)的鏡像,還可以在此基礎(chǔ)上修改配置、安裝軟件,創(chuàng)建出自己的鏡像,當(dāng)要快速恢復(fù)基礎(chǔ)環(huán)境或者批量部署集群時,自定義鏡像將成為提高運(yùn)維效率的利器。
下圖簡單地描述了一個自定義鏡像的生產(chǎn)過程:

1、使用標(biāo)準(zhǔn)鏡像創(chuàng)建一臺云服務(wù)器;
2、用戶登錄云服務(wù)器,安裝自己所需的軟件,配置好系統(tǒng)參數(shù);
3、安全關(guān)機(jī),然后將云服務(wù)器當(dāng)前狀態(tài)存為一個自定義鏡像;
4、隨后,用戶就可以使用剛創(chuàng)建的自定義鏡像啟動更多的云服務(wù)器了;
數(shù)據(jù)可靠性
對于寫入VM磁盤的數(shù)據(jù),ECS會實(shí)時地在不同的交換機(jī)下同步3份拷貝,當(dāng)集群中的磁盤損壞時,后臺進(jìn)程也會自動地重建故障磁盤的數(shù)據(jù)。相比常見的RAID硬件方案,這種分布式存儲系統(tǒng)能夠提供更高的數(shù)據(jù)安全保障,因為它不受單臺服務(wù)器可用性的限制,并且,由于多臺服務(wù)器可以并發(fā)處理,數(shù)據(jù)恢復(fù)的時間更短。
ECS提供的在線快照功能可以完美地替代傳統(tǒng)的復(fù)制備份,它采用先進(jìn)的增量數(shù)據(jù)算法,確保做到備份空間和時間的最優(yōu)化。當(dāng)用戶數(shù)據(jù)被誤刪或者系統(tǒng)被病毒破壞時,只需要一個簡單操作就可以瞬間恢復(fù)環(huán)境。
自動故障恢復(fù)
有了分布式存儲的支持,ECS可以提供比傳統(tǒng)主機(jī)或VPS服務(wù)更高的可用性指標(biāo)。當(dāng)一臺物理機(jī)損壞時,ECS會自動監(jiān)測到硬件故障,在第一時間內(nèi)把云服務(wù)器遷移到新的宿主機(jī)上,同時硬盤數(shù)據(jù)保持最后一刻的狀態(tài)。
從以上介紹可以知道,托管在彈性計算平臺上的應(yīng)用可以獲得更多的保障,但我們是否可以認(rèn)為,將應(yīng)用搬到云計算平臺之后,它就能跑得歡快、永不宕機(jī),還能自動擴(kuò)展了?答案是NO!
每時每刻,硬盤、主板、電源或者網(wǎng)絡(luò)設(shè)備都可能突然損壞,甚至整個數(shù)據(jù)中心發(fā)生停電。云計算技術(shù)沒有辦法解決所有硬件問題,只是降低了某些故障的發(fā)生幾率,例如:
•普通SATA的年損壞率在2~4%,但使用分布式存儲的年損壞率在1‰以下;
•自動故障恢復(fù)只是減少了服務(wù)器的宕機(jī)時間,但不能防止宕機(jī);
如果我們的應(yīng)用只能跑在單臺服務(wù)器上,只能依賴單臺設(shè)備的硬件升級才能應(yīng)付日益增長的訪問量,那么這種應(yīng)用的宕機(jī)是遲早的事。我 們需要從部署架構(gòu)和應(yīng)用架構(gòu)兩個方面來破解這個難題。
#p# 部署架構(gòu)
既然沒有什么硬件是永不損壞的,我們是否可以用多份冗余的硬件來降低故障的概率?如果挨在一起的服務(wù)器被一把火燒掉的可能性太大,我們是否可以把它們分散在不同的集群?如果數(shù)據(jù)可能被破壞,是否要經(jīng)常做些備份?… …
把各種故障因素都考慮一遍,我們就得出了一個大致的部署框架:
1、以集群方式提供服務(wù)
Web服務(wù)器、緩存服務(wù)器都是非常適合部署為集群的,單臺服務(wù)器損壞不會影響整個網(wǎng)站的訪問。數(shù)據(jù)庫服務(wù)器稍難一些,但它們也提供了主從復(fù)制、讀寫分離的解決方案。
2、 將云服務(wù)器分布在不同的可用區(qū)(Zone)下
不同的可用區(qū)代表數(shù)據(jù)中心里的不同物理位置,同一可用區(qū)內(nèi)的服務(wù)器可能同時遭遇網(wǎng)絡(luò)設(shè)備、電力等故障,因此,把一個集群內(nèi)的云服務(wù)器分散到不同的可用區(qū)甚至不同的數(shù)據(jù)中心(Region)是個明智的選擇。
3、 為Web服務(wù)集群配置負(fù)載均衡與DNS輪詢
多臺Web服務(wù)器可以通過配置負(fù)載均衡或者DNS輪詢提供對外服務(wù)。
相比DNS輪詢,負(fù)載均衡方式會更加靈活,因為它對外屏蔽了服務(wù)器的真實(shí)IP,當(dāng)負(fù)載均衡資源池內(nèi)增加或減少服務(wù)器時,對客戶是透明的。而DNS存在時延的問題,集群發(fā)生調(diào)整后,很有可能造成部分用戶在很長一段時間內(nèi)無法正常訪問網(wǎng)站。
另外,負(fù)載均衡能夠跟蹤后端應(yīng)用服務(wù)器的健康狀態(tài),自動排除有故障的節(jié)點(diǎn),避免出現(xiàn)服務(wù)時斷時續(xù)的問題。
對于特別大的應(yīng)用,我們推薦使用負(fù)載均衡+DNS輪詢的方式,只是這里的DNS輪詢域名指向的是負(fù)載均衡的VIP。
4、 實(shí)現(xiàn)動態(tài)部署
為了應(yīng)對經(jīng)常性的業(yè)務(wù)推廣和可能的DDOS網(wǎng)絡(luò)攻擊,實(shí)現(xiàn)系統(tǒng)與應(yīng)用程序的一鍵部署很重要。系統(tǒng)管理員可以根據(jù)應(yīng)用的當(dāng)前狀態(tài)(CPU、內(nèi)存使用率、HTTP的響應(yīng)時間等)作出判斷,即時增加服務(wù)器,并且快速部署應(yīng)用程序,頂住突增的業(yè)務(wù)流量。如果實(shí)現(xiàn)得更智能一些,可以在應(yīng)用服務(wù)器內(nèi)部部署一些監(jiān)控程序,由主控程序判斷當(dāng)前整個集群的負(fù)載情況,調(diào)用ECS API自動增減服務(wù)節(jié)點(diǎn)。
用一臺主控機(jī)去批量操作其它云服務(wù)器時,應(yīng)該盡量地使用一些便捷工具,例如SSH密鑰對,它實(shí)現(xiàn)了授權(quán)服務(wù)器間的免登錄,使得集群管理更加簡單。
5、定時備份很重要
前面說到,沒有什么技術(shù)可以保證100%的數(shù)據(jù)安全,你的數(shù)據(jù)始終面臨誤刪文件、病毒破壞、程序?qū)戝e、硬件損壞等種種可能的風(fēng)險。如果你的數(shù)據(jù)非常重要,請定期備份!在彈性計算平臺上,這件事情相對簡單,快照功能自動完成增量數(shù)據(jù)備份。然而,單個物理位置的存儲始終會面臨地震、火災(zāi)等災(zāi)難的威脅,如果你覺得還不夠安全,或者有異地使用的需要,且能夠承受異地備份帶來的存儲、帶寬等成本,可以自行拷貝數(shù)據(jù)文件。彈性計算平臺也正在考慮跨機(jī)房的容災(zāi)方案。
6、 將應(yīng)用程序配置為自恢復(fù)的
單臺服務(wù)器的硬件故障是常見現(xiàn)象,以現(xiàn)有的云計算技術(shù)能力,尚無法做到不影響云服務(wù)器的運(yùn)行,但ECS可以快速檢測到故障特征,并且將云服務(wù)器自動遷移到新的宿主機(jī)上。這里存在一個問題,雖然云服務(wù)器重新啟動了,而且硬盤數(shù)據(jù)恢復(fù)到最后一刻的狀態(tài),但是原先正在運(yùn)行的應(yīng)用程序中止了。為了讓你的服務(wù)中斷時間盡量地縮短,避免人工的介入,強(qiáng)烈建議將應(yīng)用程序及相關(guān)服務(wù)設(shè)置為開機(jī)自啟動,這樣,你就可以高枕無憂地睡大覺,不用半夜起來恢復(fù)應(yīng)用,盡管只是幾個點(diǎn)擊或者命令操作。
7、加固系統(tǒng)
安全也是高可用的重要前提之一。放在IDC機(jī)房中的服務(wù)器時時面臨各種惡意攻擊,下圖是我們偶然截取的一個攻擊片段:
這臺服務(wù)器在循環(huán)探測機(jī)房中每一臺機(jī)器的1433端口,有經(jīng)驗的讀者很快猜出來了,它是在試探SQLServer服務(wù),一旦SQLServer被攻破,再利用SQLServer管理員的系統(tǒng)權(quán)限漏洞,馬上就有一些機(jī)器淪為肉雞。
#p# 阿里云彈性計算服務(wù)在平臺層面就屏蔽了一些影響范圍很大的惡意攻擊,例如篡改MAC、偽造IP、發(fā)送ARP欺騙包等,但用戶的系統(tǒng)還是要遵循一些安全最佳實(shí)踐,才能讓自己的系統(tǒng)更加穩(wěn)固:
1、關(guān)閉不必要的系統(tǒng)服務(wù)
越多的服務(wù)意味著越多的漏洞,特別是Windows共享文件夾、遠(yuǎn)程修改注冊表項等服務(wù)都存在巨大的風(fēng)險,如果你的工作不需要這些服務(wù),請馬上關(guān)閉。
2、及時升級系統(tǒng)補(bǔ)丁
前段時間爆出的微軟高危RDP漏洞讓很多用戶深受其害,通過一個簡單的Python腳本,黑客就可以直接獲取系統(tǒng)管理員權(quán)限或者直接把服務(wù)器打至藍(lán)屏。不要忽略操作系統(tǒng)廠商的安全警告,一旦遭遇攻擊,將造成不可挽回的損失。
3、開啟系統(tǒng)防火墻
采用白名單控制策略,只開放最小集合的端口。對于數(shù)據(jù)庫服務(wù)器,更要設(shè)置IP白名單,僅允許前端的Web服務(wù)器訪問;對于Web服務(wù)器,只對外開放80端口。
4、修改常見服務(wù)的端口
從剛才的攻擊示例看出,黑客雖然漫無目的地掃描同一網(wǎng)段的IP,但攻擊的目標(biāo)端口只有一個1433,這是SQLServer的默認(rèn)配置。為了減少這類攻擊,最有效的方式就是修改數(shù)據(jù)庫、FTP這類常見服務(wù)的默認(rèn)端口,增加黑客掃描的難度。
5、加密數(shù)據(jù)傳輸
筆者曾經(jīng)遇到過一個很奇怪的現(xiàn)象,在一臺Windows 2003服務(wù)器上,應(yīng)用的負(fù)載很低,但CPU利用率達(dá)到了99%,從任務(wù)管理器中看到,有無數(shù)個winlogon.exe進(jìn)程瘋狂消耗CPU,當(dāng)時百思不得其解。一天之后,這臺服務(wù)器就淪陷了,我才恍然大悟,一定是攻擊者在嘗試破解密碼。對于這類攻擊,即使調(diào)整密碼長度增加破解難度也收效不大,因為攻擊過程會消耗大量的系統(tǒng)資源,正常的業(yè)務(wù)根本無法進(jìn)行。何況,現(xiàn)在的服務(wù)器計算能力越來越強(qiáng),一個密碼的安全性實(shí)在太低了。
一些加密傳輸方式能夠有效地抵御這類攻擊,也減少傳輸過程中的敏感信息泄露問題。Windows可以配置遠(yuǎn)程桌面服務(wù)使用SSL傳輸,要求客戶端必須持有證書登錄。Linux則可以使用SSH登錄密鑰對。結(jié)合修改默認(rèn)端口的方式,將使你的系統(tǒng)安全性提高一個層次。
友情提醒:如果你開啟了防火墻,又修改了默認(rèn)的遠(yuǎn)程桌面或者SSH端口,請務(wù)必在防火墻中設(shè)置這些服務(wù)的白名單,否則就悲劇了。
應(yīng)用架構(gòu)
要支持上述高可用、可擴(kuò)展的部署架構(gòu),應(yīng)用程序也要做相應(yīng)的調(diào)整。例如:
•Web應(yīng)用的無狀態(tài)設(shè)計
Web應(yīng)用的諸多因素可能造成系統(tǒng)無法擴(kuò)展:本地存放的上傳文件、進(jìn)程內(nèi)的Session等。以上傳文件為例,假設(shè)使用了本地存儲,用戶第一個請求上傳了一個頭像文件,存放在Web-A服務(wù)器上,接著刷新頁面,但這個請求被發(fā)送到Web-B服務(wù)器上,他驚奇地發(fā)現(xiàn):上傳的頭像文件不見了!要解決這個問題,必須把上傳文件存放到共享的文件夾,Web服務(wù)器不能保留任何自己的數(shù)據(jù)(即無狀態(tài))。而對于Session數(shù)據(jù),一般的建議是用Cookie代替,或者存放到共享的Session服務(wù)器或者數(shù)據(jù)庫中。
•用分布式服務(wù)代替單點(diǎn)的服務(wù)
單點(diǎn)就意味著故障,不僅有可用性的風(fēng)險也有性能瓶頸的問題。常見的單點(diǎn)一般出現(xiàn)在共享文件服務(wù)器、Session服務(wù)器、緩存服務(wù)器、數(shù)據(jù)庫服務(wù)器。阿里云計算平臺提供了一系列分布式服務(wù),是這些單點(diǎn)服務(wù)的可行替代方案:
•需要無空間和訪問頻率限制的小文件存儲?用開放存儲服務(wù)(OSS)。
•需要可彈性分配存儲空間和IO能力的數(shù)據(jù)庫?用關(guān)系型數(shù)據(jù)庫服務(wù)(RDS)。
•需要海量結(jié)構(gòu)化數(shù)據(jù)存儲服務(wù)?用開放數(shù)據(jù)表服務(wù)(OTS)。
對于平臺暫時不提供的分布式緩存服務(wù),業(yè)界也提供了一些解決方案,例如Memcached集群技術(shù),但這也對應(yīng)用程序的設(shè)計提出了更高的要求,開發(fā)者必須清楚各種服務(wù)的HA原理,還需要了解一致性哈希算法等細(xì)節(jié)的實(shí)現(xiàn)。
■應(yīng)用的安全不容忽視
安全不僅是操作系統(tǒng)配置的問題,堡壘更容易從內(nèi)部被攻破,而這個內(nèi)鬼很有可能就是我們的應(yīng)用。從概率上說,一個復(fù)雜程序會比一個簡單程序多很多漏洞,而Web應(yīng)用涉及數(shù)據(jù)庫、應(yīng)用服務(wù)器、緩存等諸多組件,稍有不慎,攻擊的后門就會向黑客敞開。
常見的Web服務(wù)漏洞有:
■XSS跨站腳本攻擊
這類Web攻擊最為普遍,一般發(fā)生在允許用戶輸入內(nèi)容的頁面,尤其是提供富文本編輯的模塊。幾乎所有的網(wǎng)站都會被XSS攻擊光顧,但防御這類攻擊也是最為簡單的:限制用戶輸入,并且在頁面輸出內(nèi)容時對敏感字符進(jìn)行編碼,相對來說,后者更為重要一些。PHP語言的htmlspecialchars函數(shù)、Java Jakarta commons的StringEscapeUtils類都是實(shí)現(xiàn)編碼功能的快捷工具。
■SQL注入攻擊
只要應(yīng)用代碼中存在這樣的SQL:
sql = "select * from User where name='" + name
+ "' and password='" + password + "'";
那么這個應(yīng)用距離淪陷也就不遠(yuǎn)了,攻擊者只要輸入一個值為
”’ or 1=1 or name=’
的name就可以輕易進(jìn)入你的應(yīng)用系統(tǒng)。杜絕這類問題的方法有2種:
對輸入的特殊字符進(jìn)行轉(zhuǎn)義,例如PHP的mysql_real_escape_string函數(shù);
或者采用參數(shù)化的SQL,例如:
sql = "select * from User where name=? and password=?";
result = query(sql, name, password);
后者實(shí)現(xiàn)更加優(yōu)雅,絕對避免了SQL注入的風(fēng)險,而且在提升數(shù)據(jù)庫的查詢性能上也會有所幫助。
■ 上傳文件漏洞
這是最為危險的應(yīng)用級漏洞,特別容易出現(xiàn)在允許用戶上傳內(nèi)容的網(wǎng)站中。假設(shè)一個tomcat搭建的Web網(wǎng)站允許用戶上傳附件,卻忘了限制上傳目錄的可執(zhí)行權(quán)限,攻擊者就可以上傳一個帶webshell的jsp文件,通過訪問這個上傳文件的URL就可以完全控制網(wǎng)站服務(wù)器。
一定要取消上傳文件的可執(zhí)行權(quán)限,另外,絕不允許這類文件被當(dāng)作服務(wù)端腳本解析。趕緊為你的網(wǎng)站實(shí)施安全策略吧!
■Cookie與傳輸加密
只要會用HttpWatch、Firebug等開發(fā)工具,大家都可以看到各大網(wǎng)站的Cookie數(shù)據(jù),而這些Cookie正是網(wǎng)站用于鑒別用戶身份的憑證。通過分析Cookie構(gòu)成,黑客有可能猜測出網(wǎng)站的鑒權(quán)策略。要想讓你的應(yīng)用更安全,可以對Cookie等敏感數(shù)據(jù)進(jìn)行加密。如果你的網(wǎng)站還包含在線支付功能,部署帶授權(quán)證書的HTTPS是必不可少的,這也是很多第三方支付平臺的強(qiáng)制要求。
綜上所述,雖然云計算平臺提供了更靈活、更穩(wěn)定的基礎(chǔ)服務(wù)保障,但它不足以解決應(yīng)用的高可用性和可擴(kuò)展性問題,應(yīng)用自身必須在架構(gòu)設(shè)計和部署上 充分考慮各種意外情況,才能實(shí)現(xiàn)真正意義上的高可用、可擴(kuò)展 。