雲計算的前世今生

雲計算的前世今生

雲計算概述

雲計算主要解決了四個方面的內容:計算,網絡,存儲,應用

計算就是CPU和內存,例如“1+1”這個最簡單的算法就是把“1”放在內存裡面,然後CPU做加法,返回的結果“2”又保存在內存裡面。網絡就是你插根網線能上網。存儲就是你下個電影有地方放。本次討論就是圍繞這四個部分來講的。其中,計算、網絡、存儲三個是IaaS層面,應用是PaaS層面。

雲計算發展脈絡

雲計算整個發展過程,用一句話來形容,就是“分久必合,合久必分”。

雲計算的前世今生

第一階段:合,即物理設備

物理設備簡介

在互聯網發展初期,大家都愛用物理設備:

  • 服務器用物理機,像戴爾、惠普、IBM、聯想等物理服務器,隨著硬件設備的進步,物理服務器越來越強大了,64核128G內存都算是普通配置;
  • 網絡用的是硬件交換機和路由器,例如思科的,華為的,從1GE到10GE,現在有40GE和100GE,帶寬越來越牛;
  • 存儲方面有的用普通的磁盤,也有更快的SSD盤。容量從M,到G,連筆記本電腦都能配置到T,更何況磁盤陣列;

物理設備的缺點

部署應用直接使用物理機,看起來很爽,有種土豪的感覺,卻有大大的缺點:

  • 人工運維。
    如果你在一臺服務器上安裝軟件,把系統安裝壞了,怎麼辦?只有重裝。當你想配置一下交換機的參數,需要串口連上去進行配置;當你想增加一塊磁盤,要買一塊插進服務器,這些都需要人工來,而且很大可能要求機房。你們公司在北五環,機房在南六環,這酸爽。
  • 浪費資源。其實你只想部署一個小小的網站,卻要用128G的內存。混著部署吧,就有隔離性的問題。
  • 隔離性差。你把好多的應用部署在同一臺物理機上,他們之間搶內存、搶CPU,一個寫滿了硬盤,另一個就沒法用了,一個弄掛了內核,另一個也跟著掛了,如果部署兩個相同的應用,端口還會衝突,動不動就會出錯。

第二階段:分,即虛擬化

虛擬化簡介

因為物理設備的以上缺點,就有了第一次“合久必分”的過程,叫做虛擬化。所謂虛擬化,就是把實的變成虛的:

  • 物理機變為虛擬機。CPU是虛擬的,內存是虛擬的,內核是虛擬的,硬盤是虛擬的;
  • 物理交換機變為虛擬交換機。網卡是虛擬的,交換機是虛擬的,帶寬也是虛擬的;
  • 物理存儲變成虛擬存儲。多塊硬盤虛擬成一大塊。

虛擬化解決的問題

虛擬化很好地解決了在物理設備階段存在的三個問題:

  • 人工運維。虛擬機的創建和刪除都可以遠程操作,虛擬機被玩壞了,刪了再建一個分鐘級別的。虛擬網絡的配置也可以遠程操作,創建網卡、分配帶寬都是調用接口就能搞定的;
  • 資源浪費。虛擬化了以後,資源可以分配地很小很小,比如1個CPU,1G內存,1M帶寬,1G硬盤,都可以被虛擬出來;
  • 隔離性差。每個虛擬機都有獨立的CPU、 內存、硬盤、網卡,不同虛擬機之間的應用互不干擾。

虛擬化時代的生態

在虛擬化階段,領跑者是VMware,可以實現基本的計算、網絡、存儲的虛擬化。

如同這個世界有閉源就有開源、有Windows就有Linux、有Apple就有Android一樣,有VMware,就有Xen和KVM。

在開源虛擬化方面,Xen 的Citrix做的不錯,後來Redhat在KVM發力不少;對於網絡虛擬化,有Openvswitch,可以通過命令創建網橋、網卡、設置VLAN、設置帶寬;對於存儲虛擬化,本地盤有LVM,可以將多個硬盤變成一大塊盤,然後在裡面切出一小塊給用戶。

虛擬化的缺點

但是虛擬化也有缺點。通過虛擬化軟件創建虛擬機,需要人工指定放在哪臺機器上、硬盤放在哪個存儲設備上,網絡的VLAN ID、帶寬的具體配置等,都需要人工指定。所以僅使用虛擬化的運維工程師往往有一個Excel表格,記錄有多少臺物理機,每臺機器部署了哪些虛擬機。受此限制,一般虛擬化的集群數目都不是特別大。

第三階段:合,即雲計算

雲計算解決的問題

為了解決虛擬化階段遺留的問題,於是有了分久必合的過程。這個過程我們可以形象地稱為池化。

虛擬化將資源分得很細,但是如此細分的資源靠Excel去管理,成本太高。池化就是將資源打成一個大的池,當需要資源的時候,幫助用戶自動地選擇,而非用戶指定。這個階段的關鍵點:調度器Scheduler。

私有云、公有云的兩極分化。這樣,VMware有了自己的Vcloud;也有了基於Xen和KVM的私有云平臺CloudStack(後來Citrix將其收購後開源)。

當這些私有云平臺在用戶的數據中心裡賣得奇貴無比、賺得盆滿缽盈的時候,有其他的公司開始了另外的選擇。這就是AWS和Google,他們開始了公有云領域的探索。

AWS最初就是基於Xen技術進行虛擬化的,並且最終形成了公有云平臺。也許AWS最初只是不想讓自己的電商領域的利潤全部交給私有云廠商吧,所以自己的雲平臺首先支撐起了自己的業務。在這個過程中,AWS嚴肅地使用了自己的雲計算平臺,使得公有云平臺並不是對資源的配置更加友好,而是對應用的部署更加友好,最終大放異彩。

私有云與公有云廠商的聯繫與區別

如果仔細觀察就會發現,私有云和公有云雖然使用的是類似的技術,但在產品設計上卻是完全不同的兩種生物。

私有云廠商和公有云廠商也擁有類似的技術,但在產品運營上呈現出完全不同的基因。

私有云廠商是賣資源的,所以往往在賣私有云平臺的時候伴隨著賣計算、網絡、存儲設備。在產品設計上,私有云廠商往往會對客戶強調其幾乎不會使用的計算、網絡、存儲的技術參數,因為這些參數可以在和友商對標的過程中佔盡優勢。私有云的廠商幾乎沒有自己的大規模應用,所以私有云廠商的平臺做出來是給別人用的,自己不會大規模使用,所以產品往往圍繞資源展開,而不會對應用的部署友好。

公有云的廠商往往都是有自己大規模的應用需要部署,所以其產品的設計可以將常見的應用部署需要的模塊作為組件提供出來,用戶可以像拼積木一樣,拼接一個適用於自己應用的架構。公有云廠商不必關心各種技術參數的PK,不必關心是否開源,是否兼容各種虛擬化平臺,是否兼容各種服務器設備、網絡設備、存儲設備。你管我用什麼,客戶部署應用方便就好。

公有云生態及老二的逆襲

公有云的第一名AWS活的自然很爽,作為第二名Rackspace就不那麼舒坦了。

沒錯,互聯網行業基本上就是一家獨大,那第二名如何逆襲呢?開源是很好的辦法,讓整個行業一起為這個雲平臺出力。於是Rackspace與美國航空航天局(NASA)合作創始了開源雲平臺OpenStack。

OpenStack現在發展的和AWS有點像了,所以從OpenStack的模塊組成可以看到雲計算池化的方法,OpenStack的核心組件:

  • 計算池化模塊Nova:OpenStack的計算虛擬化主要使用KVM,然而到底在哪個物理機上開虛擬機呢,這要靠Nova-Scheduler。
  • 網絡池化模塊Neutron:OpenStack的網絡虛擬化主要使用OpenvSwitch,然而對於每一個OpenvSwitch的虛擬網絡、虛擬網卡、VLAN、帶寬的配置,不需要登錄到集群上配置,Neutron可以通過SDN的方式進行配置;
  • 存儲池化模塊Cinder: OpenStack的存儲虛擬化,如果使用本地盤,則基於LVM,使用哪個LVM上分配的盤,也是通過scheduler來的。後來就有了將多臺機器的硬盤打成一個池的方式Ceph,而調度的過程,則在Ceph層完成。

OpenStack帶來私有云市場的紅海

有了OpenStack,所有的私有云廠商都瘋了,原來VMware在私有云市場賺的實在太多了,眼巴巴的看著,沒有對應的平臺可以和他抗衡。現在有了現成的框架,再加上自己的硬件設備,幾乎所有的IT廠商巨頭,全部都加入到社區裡,將OpenStack開發為自己的產品,連同硬件設備一起,殺入私有云市場。

公有還是私有?網易雲的選擇

網易雲當然也沒有錯過這次風口,上線了自己的OpenStack集群,網易雲基於OpenStack自主研發了IaaS服務,在計算虛擬化方面,通過裁剪KVM鏡像,優化虛擬機啟動流程等改進,實現了虛擬機的秒級別啟動。在網絡虛擬化方面,通過SDN和OpenvSwitch技術,實現了虛擬機之間的高性能互訪。在存儲虛擬化方面,通過優化Ceph存儲,實現高性能雲盤。

但是網易雲並沒有殺進私有云市場,而是使用OpenStack支撐起了自己的應用,這是互聯網的思維。而僅僅是資源層面彈性是不夠的,還需要開發出對應用部署友好的組件。例如數據庫,負載均衡,緩存等,這些都是應用部署必不可少的,也是網易雲在大規模應用實踐中,千錘百煉過的。這些組件稱為PaaS。

第四階段:分,即容器

現在來談談,應用層面,即PaaS層。前面一直在講IaaS層的故事,也即基礎設施即服務,基本上在談計算、網絡、存儲的事情。現在應該說說應用層,即PaaS層的事情了。

1. PaaS的定義與作用

IaaS的定義比較清楚,PaaS的定義就沒那麼清楚了。有人把數據庫、負載均衡、緩存作為PaaS服務;有人把大數據Hadoop,、Spark平臺作為PaaS服務;還有人將應用的安裝與管理,例如Puppet、 Chef,、Ansible作為PaaS服務。

其實PaaS主要用於管理應用層。我總結為兩部分:一部分是你自己的應用應當自動部署,比如Puppet、Chef、Ansible、 Cloud Foundry等,可以通過腳本幫你部署;另一部分是你覺得複雜的通用應用不用部署,比如數據庫、緩存、大數據平臺,可以在雲平臺上一點即得。

要麼就是自動部署,要麼就是不用部署,總的來說就是應用層你也少操心,就是PaaS的作用。當然最好還是都不用去部署,一鍵可得,所以公有云平臺將通用的服務都做成了PaaS平臺。另一些你自己開發的應用,除了你自己其他人不會知道,所以你可以用工具變成自動部署。

2. PaaS的優點

PaaS最大的優點,就是可以實現應用層的彈性伸縮。比如在雙十一期間,10個節點要變成100個節點,如果使用物理設備,再買90臺機器肯定來不及,僅僅有IaaS實現資源的彈性是不夠的,再創建90臺虛擬機,也是空的,還是需要運維人員一臺一臺地部署。所以有了PaaS就好了,一臺虛擬機啟動後,馬上運行自動部署腳本,進行應用的安裝,90臺機器自動安裝好了應用,才是真正的彈性伸縮。

3. PaaS部署的問題

當然這種部署方式也有一個問題,就是無論Puppet、 Chef、Ansible把安裝腳本抽象的再好,說到底也是基於腳本的,然而應用所在的環境千差萬別。文件路徑的差別,文件權限的差別,依賴包的差別,應用環境的差別,Tomcat、 PHP、 Apache等軟件版本的差別,JDK、Python等版本的差別,是否安裝了一些系統軟件,是否佔用了哪些端口,都可能造成腳本執行的不成功。

所以看起來是一旦腳本寫好,就能夠快速複製了,但是環境稍有改變,就需要把腳本進行新一輪的修改、測試、聯調。例如在數據中心寫好的腳本移到AWS上就不一定直接能用,在AWS上聯調好了,遷移到Google Cloud上也可能會再出問題。

容器的誕生

1. 容器的定義

於是容器便應運而生。容器是Container,Container另一個意思是集裝箱,其實容器的思想就是要變成軟件交付的集裝箱。集裝箱的特點,一是打包,二是標準。設想沒有集裝箱的時代,如果將貨物從A運到B,中間要經過三個碼頭,換三次船的話,貨物每次都要卸下船來,擺的七零八落,然後換船的時候,需要重新擺放整齊,在沒有集裝箱的時候,船員們都需要在岸上待幾天再走。

而在有了集裝箱後,所有的貨物都打包在一起了,並且集裝箱的尺寸全部一致,所以每次換船的時候,整體一個箱子搬過去就可以了,小時級別就能完成,船員再也不用長時間上岸等待了。

2.容器在開發中的應用

設想A就是程序員,B就是用戶,貨物就是代碼及運行環境,中間的三個碼頭分別是開發,測試,上線。

假設代碼的運行環境如下:

  • Ubuntu操作系統
  • 創建用戶hadoop
  • 下載解壓JDK 1.7在某個目錄下
  • 將這個目錄加入JAVA_HOME和PATH的環境變量裡面
  • 將環境變量的export放在hadoop用戶的home目錄下的.bashrc文件中
  • 下載並解壓tomcat 7
  • 將war放到tomcat的webapp路徑下面
  • 修改tomcat的啟動參數,將Java的Heap Size設為1024M

看一個簡單的Java網站,就需要考慮這麼多零零散散的東西,如果不打包,就需要在開發,測試,生產的每個環境上查看,保證環境的一致,甚至要將這些環境重新搭建一遍,就像每次將貨物打散了重裝一樣麻煩。中間稍有差池,比如開發環境用了JDK 1.8,而線上是JDK 1.7;比如開發環境用了Root用戶,線上需要使用Hadoop用戶,都可能導致程序的運行失敗。

作者:劉超,網易雲解決方案首席架構師。

  • 公有云的未來: 要麼統治世界,要麼逐漸滅亡
  • 談談RedHat Forum 2018雲轉型技術亮點


分享到:


相關文章: