云計(jì)算概念發(fā)端于Google和Amazon等超大規(guī)模的互聯(lián)網(wǎng)公司,隨著這些公司業(yè)務(wù)的成功,作為其支撐技術(shù)的云計(jì)算也得到了業(yè)界的高度認(rèn)可和廣泛傳播。時(shí)至今日,云計(jì)算已被普遍認(rèn)為是IT產(chǎn)業(yè)發(fā)展的新階段,從而被賦予了很多產(chǎn)業(yè)和產(chǎn)品層面的意義。由于意義多重,各種概念紛繁復(fù)雜,眾多公司和從業(yè)人員的眼中都有自己的一朵云,正如徐志摩在《偶然》一詩中所說:“我是天空里的一片云,偶爾投影在你的波心”。
傳統(tǒng)的系統(tǒng)設(shè)計(jì)考慮的主要是單機(jī)環(huán)境,而云計(jì)算主要考慮的環(huán)境卻是數(shù)據(jù)中心。從單機(jī)到數(shù)據(jù)中心,很多設(shè)計(jì)原則發(fā)生了根本變化,極端點(diǎn)甚至可以說PC時(shí)代30年來一以貫之的系統(tǒng)設(shè)計(jì)原則到今天已完全不適用。
考慮到云計(jì)算的諸多內(nèi)涵,從技術(shù)角度講,數(shù)據(jù)中心計(jì)算 (Datacenter Computing)可能是更合適的表述。本文對數(shù)據(jù)中心計(jì)算的技術(shù)領(lǐng)域和設(shè)計(jì)原則的變化進(jìn)行了粗淺的探討。一家之見,僅供參考。
云計(jì)算簡介
從20世紀(jì)80年代個(gè)人電腦的發(fā)展開始,PC的計(jì)算能力不斷增強(qiáng),用一臺PC就可以存放個(gè)人需要的所有數(shù)據(jù)并完成處理工作,比如編寫文檔、處理郵件等。但在互聯(lián)網(wǎng)時(shí)代,一家互聯(lián)網(wǎng)公司提供服務(wù)時(shí)需要用到遠(yuǎn)超過個(gè)人規(guī)模的數(shù)據(jù),這些數(shù)據(jù)的存儲和處理需要成千上萬臺機(jī)器的協(xié)同工作才能完成。這種服務(wù)器規(guī)模不是個(gè)人能夠提供的,只有大型公司或機(jī)構(gòu)才能擁有,這好像又回到了更早以前的Mainframe時(shí)代。從Mainframe到PC再到云,這正是計(jì)算機(jī)技術(shù)螺旋上升的發(fā)展過程。
簡單來說,云計(jì)算就是利用系統(tǒng)架構(gòu)技術(shù)把成千上萬臺服務(wù)器整合起來,為用戶提供靈活的資源分配和任務(wù)調(diào)度能力。這里有幾個(gè)關(guān)鍵字:一是超大規(guī)模,包括機(jī)器的數(shù)量、用戶的數(shù)量和并發(fā)任務(wù)的數(shù)量;二是資源整合,成千上萬臺的服務(wù)器資源能集合起來做一件事情,比如存儲大量數(shù)據(jù),或者處理一個(gè)大型任務(wù);三是靈活與快速交付,大規(guī)模的服務(wù)器資源能進(jìn)行靈活的調(diào)配,按應(yīng)用需求分解成若干個(gè)虛擬的資源池,快速地支持大量的并發(fā)請求或作業(yè)。
云計(jì)算技術(shù)的出 現(xiàn),使整理和加工數(shù)據(jù)的能力變得空前強(qiáng)大,這種能力可以幫我們找出很多看似無關(guān)的事件背后的規(guī)律,并用其來預(yù)測未來發(fā)展。結(jié)合移動和物聯(lián)網(wǎng)等技術(shù),還可以 更好地服務(wù)于社會和人們的日常生活,如災(zāi)難預(yù)警、智慧城市和智能交通等。這種數(shù)據(jù)處理能力是在海量數(shù)據(jù)之上發(fā)展起來的,與作為基礎(chǔ)支撐的系統(tǒng)架構(gòu)技術(shù)同步 發(fā)展并逐漸融合,共同組成了現(xiàn)在大家所看到的云計(jì)算技術(shù)。
綜合系統(tǒng)架構(gòu)和數(shù)據(jù)處理技術(shù)兩方面,云計(jì)算技術(shù)自下而上可分為硬件基礎(chǔ)架構(gòu)、軟件基礎(chǔ)架構(gòu)和數(shù)據(jù)智能三個(gè)層面,如圖1所示。

圖1 云計(jì)算技術(shù)可分為三個(gè)層面
硬件基礎(chǔ)架構(gòu)包括服務(wù)器、網(wǎng)絡(luò)和數(shù)據(jù)中心的設(shè)計(jì)與實(shí)施等技術(shù)領(lǐng)域,軟件基礎(chǔ)架構(gòu)聚焦于存儲、計(jì)算與大規(guī)模分布式系統(tǒng)等技術(shù)領(lǐng)域,數(shù)據(jù)智能則關(guān)注數(shù)據(jù)倉庫(Data Warehouse)、機(jī)器學(xué)習(xí)(Machine Learning)及數(shù)據(jù)分析與可視化(Data Analysis & Visualization)等技術(shù)領(lǐng)域。值得一提的是,這三個(gè)層次的劃分主要以技術(shù)領(lǐng)域?yàn)槌霭l(fā)點(diǎn),而通常提到的云計(jì)算三個(gè)層次SaaS/PaaS/IaaS則更多地是從資源的提供形態(tài)和接口為考慮進(jìn)行劃分的,二者并非同一維度。
時(shí)下流行的大數(shù)據(jù)(Big Data)概念可以看成從海量數(shù)據(jù)的角度看數(shù)據(jù)分析技術(shù)和軟件架構(gòu)支撐,包括軟件基礎(chǔ)架構(gòu)與數(shù)據(jù)智能相關(guān)技術(shù)。二者都與數(shù)據(jù)有關(guān),但其區(qū)別在于:軟件基礎(chǔ)架構(gòu)關(guān)心的主要是數(shù)據(jù)的格式、容量以及訪問模式等,而數(shù)據(jù)智能更在意數(shù)據(jù)的語義。
而數(shù)據(jù)中心計(jì)算則是從體系結(jié)構(gòu)的角度看待軟硬件系統(tǒng)設(shè)計(jì)。下文將就相關(guān)的技術(shù)領(lǐng)域和設(shè)計(jì)原則進(jìn)行討論。
數(shù)據(jù)中心計(jì)算
技術(shù)領(lǐng)域與挑戰(zhàn)
如圖2所示,數(shù)據(jù)中心計(jì)算包含存儲、計(jì)算、實(shí)時(shí)存儲與計(jì)算、超大規(guī)模系統(tǒng)、體系結(jié)構(gòu)以及數(shù)據(jù)中心等技術(shù)領(lǐng)域。存儲系統(tǒng)的需求來自兩個(gè)維度。首先,大量的無結(jié)構(gòu)數(shù)據(jù)需要表(Table)、對象(Object)與文件(File)等多種存儲結(jié)構(gòu)進(jìn)行支持;其次,訪問模式的不同(如只讀不寫、只寫少讀、讀寫均勻等)將很大程度上影響對存儲系統(tǒng)設(shè)計(jì)和優(yōu)化的考慮。

圖2 數(shù)據(jù)中心所包含的技術(shù)領(lǐng)域
計(jì)算系統(tǒng)的需求和技術(shù)特點(diǎn)與計(jì)算任務(wù)的類型有很大關(guān)系。數(shù)據(jù)密集型的代表是MapReduce,它對CPU和I/O的需求比較均衡。計(jì)算密集型任務(wù)與通信密集型任務(wù)都是CPU密集計(jì)算,但二者訪問數(shù)據(jù)的規(guī)模不同。如果只需要少量數(shù)據(jù)則是計(jì)算密集型。而如果需要訪問大量數(shù)據(jù),比如大矩陣迭代,內(nèi)存限制這些數(shù)據(jù)必須存放在多臺機(jī)器上,那么往往此時(shí)系統(tǒng)瓶頸將轉(zhuǎn)移到通信的延遲上,這類似于傳統(tǒng)的高性能計(jì)算。
通常的存儲系統(tǒng)和計(jì)算系統(tǒng)只能支持到一定級別的延遲和并發(fā)度,對于更高的要求則需要基于內(nèi)存構(gòu)造實(shí)時(shí)的存儲與計(jì)算系統(tǒng)。考慮到內(nèi)存的特點(diǎn),在存儲上更適合提供具有豐富語義的數(shù)據(jù)結(jié)構(gòu)。在分布式數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上,加入流式數(shù)據(jù)處理和觸發(fā)式事件處理的模型,則可以更好地支持實(shí)時(shí)檢索、OLAP、PubSub等應(yīng)用。
超大規(guī)模系統(tǒng)主要通過分布式相關(guān)技術(shù)保證系統(tǒng)的可用性(availability)和可管理性 (manageability),包括系統(tǒng)建模、設(shè)計(jì)、開發(fā)以及運(yùn)維等多方面。體系結(jié)構(gòu)包括虛擬機(jī)、服務(wù)器設(shè)計(jì)等。數(shù)據(jù)中心包括機(jī)柜設(shè)計(jì)、網(wǎng)絡(luò)規(guī)劃與設(shè)計(jì)、數(shù)據(jù)中心設(shè)計(jì)與建設(shè)等,主要關(guān)注于能效比(PUE)。
系統(tǒng)設(shè)計(jì)原則
傳統(tǒng)的軟硬件系統(tǒng)主要面向單機(jī)和個(gè)人,在桌面環(huán)境中使用,我們也可以稱其為桌面計(jì)算(Desktop Computing)。從桌面到數(shù)據(jù)中心,應(yīng)用特點(diǎn)和負(fù)載模型發(fā)生了巨大變化。
在單機(jī)上,主要面向一個(gè)用戶,他可能運(yùn)行多項(xiàng)任務(wù),任務(wù)可以分為前臺任務(wù)和后臺任務(wù)兩種。用戶對系統(tǒng)的響應(yīng)性(promptness或responsiveness)十分敏感,所以前臺任務(wù)通常優(yōu)先于后臺任務(wù),而后臺任務(wù)則希望被公平調(diào)度。這也是搶占式調(diào)度(Preemptive Scheduling)策略最終勝過協(xié)作式調(diào)度(Cooperative Scheduling)的原因。
在數(shù)據(jù)中心里,同樣也有在線和離線兩種應(yīng)用類型,在線系統(tǒng)直接面向用戶,而離線系統(tǒng)多用于數(shù)據(jù)處理。在線系統(tǒng)通常是一個(gè)大型應(yīng)用服務(wù)于海量用戶,用戶對系統(tǒng)響應(yīng)性仍然十分敏感。但由于用戶規(guī)模巨大以及互聯(lián)網(wǎng)服務(wù)通常免費(fèi),成本壓力十分嚴(yán)峻,所以系統(tǒng)需要充分挖掘用戶對響應(yīng)性的容忍度。通常情況下,人對事件響應(yīng)的感知能力在500ms左右,利用這一特點(diǎn)可以優(yōu)化系統(tǒng)調(diào)度并節(jié)省資源。而在極限壓力情況下,沒有足夠的資源滿足所有請求,很多系統(tǒng)開始延長響應(yīng)時(shí)間,然后在持續(xù)壓力下失去響應(yīng)直至崩潰。此時(shí),為可服務(wù)范圍內(nèi)的請求提供正常服務(wù),并為超過范圍的請求提供快速的拒絕響應(yīng),將會給用戶帶來更好的體驗(yàn),也能提升系統(tǒng)的可用性。到最后,我們會發(fā)現(xiàn)在線服務(wù)系統(tǒng)應(yīng)以穩(wěn)定的極限吞吐(Sustained Throughput)作為首要設(shè)計(jì)目標(biāo)。當(dāng)然,要在一定延遲閾值的前提保證下。
離線系統(tǒng)主要服務(wù)于數(shù)據(jù)處理類作業(yè),這些作業(yè)涉及海量數(shù)據(jù),使用者的預(yù)期并不會特別高,此時(shí)的處理效率更為重要。通常,這些作業(yè)將會以批處理的方式合并執(zhí)行,提升系統(tǒng)的總吞吐率,即資源利用率成為首要調(diào)度目標(biāo)。
在系統(tǒng)設(shè)計(jì)時(shí),有一些永恒的矛盾需要做出折中考慮,例如延遲與吞吐、公平與效率。在桌面環(huán)境中,我們選擇了低延遲和公平,而在數(shù)據(jù)中心環(huán)境中,我們選擇了高吞吐(或穩(wěn)定的極限吞吐)和高效率。在具體實(shí)現(xiàn)方案上,也帶來了不同的選擇,比如同步與異步模型、線程與事件驅(qū)動、線程池與隊(duì)列等。
從桌面到數(shù)據(jù)中心,同樣發(fā)生變化的還有開發(fā)模式。PC是一個(gè)開放系統(tǒng),無論軟件還是硬件,每個(gè)廠商都只負(fù)責(zé)系統(tǒng)中的一部分,都需要考慮和不同的組件一起工作。由于用戶眾多,需求各不相同,只能采取按層次組織的系統(tǒng)架構(gòu)(layered architecture)以及約定俗成的標(biāo)準(zhǔn)化規(guī)范。這雖然保證了系統(tǒng)的通用性,以及不同來源的各種組件的有效分工和協(xié)同工作,但也帶來了一些問題,例如一個(gè)功能需要穿透多層才能完成,而每層互不信任,需要執(zhí)行嚴(yán)格的參數(shù)檢查等。
更嚴(yán)重的是,在系統(tǒng)的每一層中,都可能存在一些重復(fù)的功能。以存儲為例,一次寫入需要經(jīng)歷從libc的文件流(FILE stream),到文件系統(tǒng)的緩沖區(qū),再到驅(qū)動器中的緩沖區(qū),最后到磁盤上的緩存這樣的長調(diào)用流程才能完成持久化(persistency)。這個(gè)流程從其中的每一層單獨(dú)來看都是合理的,但從整個(gè)系統(tǒng)的角度看來,存在著性能浪費(fèi)。另外,由于分層帶來的透明性使得數(shù)據(jù)持久化不得不通過額外的fsync操作才得以保證,從而使系統(tǒng)的可靠性保證機(jī)制變得更復(fù)雜。
此外,在架構(gòu)設(shè)計(jì)時(shí),我們也經(jīng)常在談機(jī)制(mechanism)與策略(policy)的分離。固定、明確的功能稱為機(jī)制,通過靈活的可變的策略進(jìn)行配置,從而使系統(tǒng)具有良好的可擴(kuò)展性。但實(shí)際上,每層獨(dú)立且透明,且通常也都沿用相同的設(shè)計(jì)理念,這其實(shí)并不能保證機(jī)制策略的有效分離,最后的系統(tǒng)往往很難取得可擴(kuò)展性和性能的良好平衡。
我們可以發(fā)現(xiàn)分層導(dǎo)致了每層都傾向于變得聰明、變得復(fù)雜,但綜合效果卻不如人意。而在今天的數(shù)據(jù)中心環(huán)境中,如前面所說,很多時(shí)候我們其實(shí)是在做一個(gè)超大型應(yīng)用,應(yīng)用的特點(diǎn)需要被充分考慮。另外這個(gè)系統(tǒng)通常只有一個(gè)生產(chǎn)商,可以進(jìn)行垂直化的設(shè)計(jì)或整合。此時(shí),由應(yīng)用層或平臺的上層提供策略,而下層只需要考慮機(jī)制,這將使系統(tǒng)變得更加簡單,從而取得更好的性能,而擴(kuò)展性也可以得到很好的保證。
以SSD為例,現(xiàn)在的SSD在設(shè)計(jì)時(shí)通常假設(shè)由文件系統(tǒng)來使用。由于閃存的擦除特性,需要考慮寫緩沖區(qū),而由于緩沖區(qū)需要有預(yù)留空間也需要有復(fù)雜的置換算法和回收機(jī)制,這對性能和成本(也包括開發(fā)成本)都有很大影響。但在數(shù)據(jù)中心環(huán)境里,我們通常有完整設(shè)計(jì)的存儲系統(tǒng),數(shù)據(jù)組織方式和讀寫流程也被充分優(yōu)化,對存儲設(shè)備的需求就是最基本的定長塊。這種情況下,SSD的邏輯其實(shí)可以做得非常簡單,直接對上層暴露內(nèi)部的狀態(tài)(如通路、物理塊),從而提高性能、降低成本。更重要的是,這將有效提高交付速度——這對于緩解服務(wù)器、網(wǎng)絡(luò)、IDC等硬件系統(tǒng)的長實(shí)施周期和業(yè)務(wù)快速增長的規(guī)模需求之間的矛盾至關(guān)重要。
上層對下層的要求是邏輯簡單、功能單一,而下層對上層則暴露更多細(xì)節(jié),最復(fù)雜的邏輯判斷由最上層的應(yīng)用來完成,這是另一種方式的層次化。而且,層次之間也不需要維持一個(gè)物理邊界(如現(xiàn)在應(yīng)用和內(nèi)核之間),可以通過函數(shù)調(diào)用的方式實(shí)現(xiàn)柔性的層次劃分。有興趣的讀者可以參考libOS【注:Exokernel】或者in-kernel web server【注:khttpd】的一些設(shè)計(jì)思路。
從桌面到數(shù)據(jù)中心的第三個(gè)變化是評價(jià)體系。一個(gè)中等規(guī)模的數(shù)據(jù)中心通常包含數(shù)萬服務(wù)器,在這樣的規(guī)模下,硬件故障成為家常便飯。一般,我們通過冗余復(fù)制或者重復(fù)處理來解決硬件故障問題。在習(xí)慣了硬件故障之后,我們對軟件Bug的態(tài)度也會發(fā)生變化。軟件Bug中有一種偶發(fā)性Bug【注:也被稱為heisenbug,意指海森堡測不準(zhǔn)原理】最難發(fā)現(xiàn)也最難調(diào)試,消除這些Bug需要付出巨大的代價(jià)。但考慮到這種Bug的出現(xiàn)概率堪比硬件故障,我們其實(shí)可以采用同樣的方式來對待。
規(guī)模增長的同時(shí),系統(tǒng)的復(fù)雜度也變得越來越高,以至于很多時(shí)候已經(jīng)超過一個(gè)人的直接掌控能力。要去理解系統(tǒng)的運(yùn)行狀態(tài)以保障其正常運(yùn)行,在這種情況下變得十分困難。此時(shí),我們可以利用系統(tǒng)冗余的特點(diǎn),對一些組件進(jìn)行定期重啟(reboot),通過重置狀態(tài)降低Bug被觸發(fā)的概率【注:“Recovery Oriented Computing”】。而對于性能上的問題則更是如此,有時(shí)還需要采用數(shù)據(jù)挖掘的方法來進(jìn)行優(yōu)化或系統(tǒng)調(diào)試【注:M.K. Aguilera, J.C. Mogul, J.L. Wiener, etc., “Performance debugging for distributed systems of black boxes”, in SOSP’03】。
海量數(shù)據(jù)以及數(shù)據(jù)處理應(yīng)用也帶來了很大的影響。由于數(shù)據(jù)的規(guī)模以及處理算法的特點(diǎn),很多時(shí)候系統(tǒng)只需要提供概率意義上正確的結(jié)果,不需要保證數(shù)據(jù)的絕對可靠,也不需要嚴(yán)格保證運(yùn)行結(jié)果的可重復(fù)性。
總而言之,互聯(lián)網(wǎng)服務(wù)規(guī)模巨大,對成本很敏感,而且業(yè)務(wù)需求的變化也異常頻繁,這和PC應(yīng)用的特點(diǎn)截然不同?,F(xiàn)在的系統(tǒng)設(shè)計(jì)原則是在桌面環(huán)境中歷時(shí)30余年發(fā)展起來的,但到了今天已經(jīng)完全不適應(yīng)數(shù)據(jù)中心環(huán)境,我們需要重新思考并總結(jié)出適用的設(shè)計(jì)原則,這體現(xiàn)在如下三個(gè)方面。
- 從單用戶多任務(wù)到多用戶單任務(wù)的環(huán)境變化,導(dǎo)致我們在系統(tǒng)設(shè)計(jì)時(shí)重新審視對延遲與吞吐、公平與效率的折中考慮。
- 自行開發(fā)全套系統(tǒng)成為可能,透明性不再是美德,架構(gòu)由層次化向豎井式演進(jìn),系統(tǒng)由需求驅(qū)動而定制。
- 由于規(guī)模與復(fù)雜度增大,我們不再追求零缺陷,而是與故障和Bug共舞。同時(shí)數(shù)據(jù)也成為系統(tǒng)的一部分,這些都使得以前的確定性系統(tǒng)變得不確定,評價(jià)指標(biāo)也由正確性(correctness)向精確度(precision)轉(zhuǎn)變。
需要強(qiáng)調(diào)的是,這些設(shè)計(jì)原則的改變并不意味著,我們需要顛覆桌面環(huán)境的通用系統(tǒng),全盤轉(zhuǎn)向?qū)S孟到y(tǒng)。以前通用系統(tǒng)的設(shè)計(jì)完全以桌面環(huán)境為出發(fā)點(diǎn),現(xiàn)在則是新的環(huán)境、新的應(yīng)用形態(tài)和新的業(yè)務(wù)需求,這時(shí)需要有另一種類型的通用系統(tǒng)。這就像現(xiàn)在的NoSQL系統(tǒng),提出之時(shí)是專用的,但正逐漸變得通用。
總結(jié)
互聯(lián)網(wǎng)服務(wù)區(qū)別于傳統(tǒng)行業(yè)最顯著的特點(diǎn)是超大規(guī)模的數(shù)據(jù)以及快速迭代的開發(fā)方式,通過數(shù)據(jù)可以分析用戶行為,而快速迭代則使數(shù)據(jù)分析結(jié)果更快生效,從而優(yōu)化運(yùn)營或適應(yīng)用戶需求的變化??梢哉f,數(shù)據(jù)規(guī)模和迭代速度決定了一個(gè)互聯(lián)網(wǎng)公司創(chuàng)新的速度,同時(shí)也是它技術(shù)水平的標(biāo)志,而其中最關(guān)鍵的便是云計(jì)算技術(shù)。
云計(jì)算技術(shù)可分解為大數(shù)據(jù)和數(shù)據(jù)中心計(jì)算。大數(shù)據(jù)從海量數(shù)據(jù)的角度看數(shù)據(jù)分析技術(shù)和系統(tǒng)架構(gòu)支撐,包括軟件基礎(chǔ)架構(gòu)與數(shù)據(jù)智能等相關(guān)技術(shù),而數(shù)據(jù)中心計(jì)算則是從體系結(jié)構(gòu)的角度看待軟硬件系統(tǒng)。傳統(tǒng)的軟硬件系統(tǒng)基于桌面環(huán)境設(shè)計(jì),而今天的數(shù)據(jù)中心環(huán)境有了很多變化,比如應(yīng)用特點(diǎn)和負(fù)載模型、開發(fā)模式、評價(jià)體系等,這導(dǎo)致了傳承至今的設(shè)計(jì)原則不再適用。
本文主要從宏觀上對數(shù)據(jù)中心計(jì)算的特點(diǎn)進(jìn)行討論,旨在理清概念、拋磚引玉,引發(fā)業(yè)界對系統(tǒng)設(shè)計(jì)原則的重新思考。對于具體的技術(shù)方向如存儲、計(jì)算以及大規(guī)模分布式系統(tǒng)等,文中并沒有詳細(xì)描述,留待日后陸續(xù)討論。