騰雲還是駕霧? 論雲端的服務特色與OpenStack介紹

作者/史晉銘

前言 雲端運算在這幾年來,已經被宣揚到人人都說得出IaaS、PaaS及SaaS,也有許多人聽到這個詞之後就會馬上自信地說出:「所謂的雲端運算就是把一切丟到網路上」,但如果再仔細對其一問,卻再也問不出什麼其他的答案來了,這片雲卻長的像一片霧一樣,它到底是雲、還是霧? 在本文中,將會簡單明確的指出雲端的特色,而非一聽再聽卻猶如霧裡探花的官言官語。另外也會以實例來看看雲端運算的一大經典:MapReduce,最後則會帶來現今熱門的開源IaaS,OpenStack與相關實務應用的介紹,希望能夠讓想要稍微了解雲端的朋友們,不要雲深不知處、採不到藥去就再好也不過了。

《圖一》「擲茭」等於最早的「雲端運算」?
什麼是雲端運算? 這裡不會介紹什麼是雲端運算,但這裡會介紹什麼是雲端運算的特色,因為只要這一套架構或任何產品達到雲端運算的特色,那麼都可以稱它為雲端運算。相對於雲端運算(Cloud Computing)這一詞來說,倒不如把它轉稱為雲端「服務」(Cloud Service)還要來的更好一些,為什麼呢,提到不能再提的「XaaS」(Anything as a Service)在這邊已經做了最好的解釋。 那麼雲端服務的特色到底是什麼? 所謂雲端跟我們過去傳統IT的架構有什麼不同? 明明可以做到的事情差不多呀?其實最大的差異在於雲端服務著眼的地方對於過去傳統IT所注重的地方有所不同,雲端服務中以使用者的服務面來說,「4A2S」幾乎是一個必要的特徵,也就是Any authorized Person、Anytime、Anywhere、Any Device、Same Service and Same Result;「任何經過授權的人」在「任何時間」、「任何地點」、「任何裝置」都可以存取到「相同的服務」與「相同的結果」,再以另外一個層面來看,這個服務是否能夠達成以下五個特色(也是較難完全達成的部分): 一、On-demand self-service: 客戶可以在有需求的時候可以自助式的拿到資源,而不用透過資源提供者,就像自助餐與簡餐店的差異。 二、Broad network access: 一切服務經由網路取得,也意味著使用者可以用任何形式的網路連結方式取得服務。 三、Resource pooling: 使用者取用資源不需要知道資源來自哪裡,猶如水龍頭打開有水,雲端使用者不需要也沒有責任擔心水管怎麼接。 四、Rapid elasticity: 想要資源就買,只要買就能快速取得及部屬。 五、Measured service: 用多少付多少,不多付(對於使用者)也不少付(對於廠商)。 如果一個服務可以達到以上五項特色並包含4A2S,那真的是非常值得鼓勵與欽佩,因為無論是用什麼技術建置而成的,這絕對是一個百分之百的雲端服務,至於部屬模式與服務模式,古狗大神上就有非常多的資料,在此就不贅述了。 服務面之外,在實體的資源需求上,雲端另外一項讓人津津樂道的就是標榜有強大的運算能力、儲存能力、容錯與備份能力,要具備這些能力的三要素也就是:「網路」、「計算」、「儲存」,對於雲端來說,這三者缺一不可,最早由Google發表三位一體的三篇論文,內容分別為吞吐量極高的非關聯性資料庫「Big Table」、分散式運算的「MapReduce」以及分散式儲存系統的「Google File System」,後續再加上Apache的 Hadoop開源專案分別對應此三樣架構實作的:「HBase」、「Hadoop MapReduce Framework」、「HDFS」與其他相關的架構,使得架設雲端環境不再這麼困難,也從此正式開啟了雲端的戰國時代,在這之前,只有Amazon的EC2或是Saleforces提供的雲端CRM等雲端服務較有名氣,而現今如Microsoft也不落人後,陸續推出了Microsoft Azure以及自己的Microsoft Map Reduce:「Daytona」,當然一如微軟一貫的作風,Daytona只能在Microsoft Azure上運行。 歸功於Google與Hadoop,現在人人都可以很輕易地架設起一個雲端環境,利用這些開源技術開發屬於自己的雲端服務了。由於篇幅有限,我們將針對雲端運算的計算能力來做介紹,說到雲端運算的計算能力,最有名的非Google率先提出的 MapReduce運算架構莫屬了。 MapReduce MapReduce的概念只需要一句話就能解釋:「拆開,計算,再組起來。」Map負責拆開與計算,Reduce負責最後的組裝,當然這之間還隱藏了非常多的技術細節。MapReduce之所以經典,是因為他以非常簡單的概念去解決問題,並且將許多細節隱藏起來,開發人員只需要去想辦法用Map與Reduce以及Key and Value的邏輯,以及Hadoop提供的相關API來得到所需的答案,而不需要去在意如何實作分散式運算、中途資料的映射與儲存,因為這些MapReduce都幫你搞定了! 但也因為其概念非常簡單,只有Map跟Reduce可以拿來用,所以如何利用簡單的邏輯來解決複雜的問題,那就是開發人員該頭痛的部分了,也因此後續也出現了非常多的方案來讓MapReduce更容易利用,如Cascading,一個將MapReduce抽象化為數個函數與資料流來幫助開發者更快速的建構出MapReduce解決方案。

《圖二》Cascading中的Pipe assemblies
如同學習任何程式語言的第一個範例Hello World! ,在撰寫MapReduce中,也有一個的經典範例:Word Count

《圖三》
MapReduce的主要資料結構為Key and Value Pair,在Map階段,將原始資料切割成16MB至64MB的區塊,並將這些資料區塊與程式碼發佈到各個Mapper,在Mapper中根據使用者撰寫的程式碼將資料進行運算並輸出數個Key and Value Pair,並先緩存在記憶體中再寫入本地磁碟機,隨後Reducer會再以RPC的方式存取這些中途資料,並再根據使用者撰寫的程式碼來運行結合這些資料,最終輸出結果。 在這個範例裡面,每個單字是Key,而出現次數是Value,裡面有3個Mapper 與2個Reducer,經由資料變化的流程,我們可以很快地看出MapReduce的運算邏輯是如何運作的。 在Map階段將每個字出現的次數賦予整數1的值,Reduce階段則把每個Pair合併,其動作則是加總,最後可以得到每個字出現了幾次。 除了算每個字出現幾次這種簡單的應用,還有沒有其他用處? 有的,例如將一批大量資料內的特定字詞設為KEY,出現的位置或檔名當成Value,最後將Value合併起來就可以得到反向索引(Inverted index),類似的邏輯也可以用來獲得反向網站連結地圖(Reverse Web-Link Graph),或如文件相似度(Pairwise Document Similarity)等等進階的用法。 MapReduce適合用來批次處理大量資料,但也不是所有現實世界的問題都可以利用MapReduce來解決,MapReduce對於常有小部份且頻繁更新的資料,其處理能力上較為不足,因為只能整批重算,因此現在Google最新的搜尋引擎(Caffeine)已經將主力改採用他們稱為Percolator的新技術,以用來快速反應與更新索引資料的小部分頻繁更新,以往Google搜尋引擎需要先做大約100次的MapReduce建立新的索引資料庫,而在使用了Percolator技術之後,建立過一次Base的索引資料庫,爾後只需要10次左右的Percolator運作就能完成的所有的索引資料更新。 至於MapReduce的實際應用,以Last.fm這個大型音樂網站來說,他們使用兩個Hadoop Cluster來運行MapReduce與分散式資料儲存管理,規模大概是50台主機、300 CPU-Core與100TB的儲存空間,每天運行數以百計的任務來計算每個使用者歌曲喜好統計、歌曲推薦、推薦歌曲搜尋索引的建立以及系統的Log分析。而提到Hadoop,其實我們現在常用的FaceBook與Twitter都是利用Hadoop來當底層,想當然爾技術力強大的這些大廠商,也是自己會有開發一些能更方便利用Hadoop的許多相關技術。 OpenStack 「OpenStack是屬於IaaS的應用範疇」這句話或許說的不夠平易近人,這邊直接引用OpenStack的發展目標來解釋:「OpenStack要成為雲端界中的Linux (Linux of Cloud Computing)」OpenStack允許讓使用者快速部屬雲端的基礎設施環境叢集,不同於Hadoop 這類針對特定功能取向的PaaS,OpenStack提供的是完整的底層資源與環境部屬,猶如現在商業IaaS的頭頭:Amazon Elastic Compute Cloud(Amazon EC2)所提供的功能。 使用者能使用開源的OpenStack來打造屬於自己類似Amazon EC2的服務,並且OpenStack規格上也相容於Amazon EC2,因此無論是在上面開發系統、使用系統,或是幫人開發系統、讓人使用系統,OpenStack都可以達到,這也正是現在此類開源IaaS火熱的原因。甚至於連Ubuntu在LTS版本中,從12.04起就內建了OpenStack,讓你裝完Ubuntu就可以馬上使用且部屬OpenStack。當然除了OpenStack之外,其他類似的玩意還有古老的「Eucalyptus 」、OpenStack最大的敵手「CloudStack」以及持續穩定發展的「OpenNebula」。現在也有讓大家免費試用OpenStack推廣版本:「TryStack」https://trystack.org/ 雖然能免費使用的點數有限,但只要上去網站申請一個帳戶,經獲核准就可以擁有一台Ubuntu的線上VM可以試玩了,馬上使用OpenStack API來管理你的VM,並替VM安裝上一些網路服務試試看吧。 OpenStack的抽象架構,這裡直接引用OpenStack官方文件的一張圖來做說明: 我們可以看見OpenStack內有負責運作與運算面向的Nova,以及儲存面向的Swift與Glance,另外還有KeyStone(Identity)和Horizion(Dashboard)在整個系統中運作,其中 Swift負責檔案的彈性存取,而Glance則是負責所有資料映像的檔案管理,所有的資訊交流則需利用KeyStone驗證,Horizion則提供了使用者的前端界面,此外Nova與Swift也透過KeyStone與Horizion得以緊緊結合,經由呼叫公制的API來達成協同作業,使得OpenStack可以順利運作Web前端、網路作業、任務調度、運算服務、儲存服務、資料認證等等工作內容,快速提供IaaS的服務。 在這張圖中,其實可以找出OpenStack所欠缺的部分,相對於前文提的雲端三要素,在Compute部分有Nova,Storage部分有Swift與Glance,那Network部分呢? 尤其現在的雲端環境相對於以前的VM環境更為複雜,無論是節點數與頻寬需求,甚至於節點位置的移動、更變、跨區域等變化性,對於網路方面的支援需求也隨之增加,如:VM移動後的IP須保持不變、相關聯的VM即使移動到別的區域後仍要保持在同一層網路中、另外還有VLAN的隔離等等需求,傳統的網路架構以及Nova基本網路功能已經不敷使用,而是需要一個有效率的新虛擬網路架構,因此後來OpenStack在最近一個釋出(2012/04) Essex提出了「Quantum」,針對虛擬網路中 L2的層面提出了各種解決方式,如Virtual Networks、Virtual Port與Virtual Server。更特別的是,Quantum還提供了插件(Plugin)的概念來支援不同底層網路技術,例如現在的Quantum Plugin有:Cisco UCS, Linux Bridge, NTT-Data Ryu, Open vSwitch, Nicira NVP等等可以使用,因為Quantum的重要性,現在Quantum也已經成為了OpenStack內的一個核心項目,當然在持續發展的項目還相當多,例如更進一步的DHCP、L3、VPN、QoS、防火牆與資訊安全,更多的Plugin及跟資料庫各方面的整合。 若想要切入雲端,提供底層設施服務或是從下到上的服務開發,OpenStack是一個不錯的選擇,世界上已經有非常多的大廠商公開表示支援,但在實務應用上的真實例子呢? 也就是真正以OpenStack建置出來,大家看的到、摸得到而且比較有感覺的實際應用,那就是赫赫有名的eBay了,eBay在近期也公布他們已經使用OpenStack來開發、建置與測試他們的拍賣市場環境了,而且使用開源可以節省成本,不過也不要忘了OpenStack的對手還有發展成熟的Amazon與持續擴展的VMWare,反過來說,對於一個開發廠商相對於Amazon這種大廠商多少會有一些恐懼,此時使用OpenStack來開發反而顯現出了他的優點:「開源」、「可自我掌握」,但同時也面臨了需要投入相當人力做研發,以及與Amazon的相容性等等問題。 下表整理目前使用OpenStack的世界上較知名廠商或單位:

《圖五》
騰雲還是駕霧? 既然MapReduce被視為雲端運算中的一項重要技術,OpenStack是一個熱門的開源IaaS,那麼「如果我的服務裡面有使用到MapReduce,或者我是用OpenStack建立的,那麼我能不能說自己是雲端服務? 」 在經過前述雲端服務所有特色的介紹之後,相信聰明的您應該已經知道,對於雲端服務來說背後採用何種技術不是最重要的,最後的重點是:「你想要提供什麼樣的服務?」所以問題的答案我想已經呼之欲出了。