摘要:上面主要是將新的多了些什么。在新版本的設計中,他們使用腳本來代替原先的腳本。可以看到在新的架構中多出了很多組件。他究竟是如何操作的呢首先,我們必須準備好系統例如。當剛剛推出的時候,包含了應用運行時啟動,停止等簡單命令。
CloudFoundry距離發布已經一年多了。在這一年里CloudFoundry不論是社區還是代碼日臻成熟,擁有了眾多合作伙伴。現在他邁開了更大的腳步,新的CloudFoundry已經逐漸浮出水面。
新版的CloudFoundry對于開發者來說,除了可以支持給多的Framework,提供更多類型的Service之外,沒有太多變化。但是CloudFoundry本身的架構做了很多改進,可靠性,擴展性和安全性都有了質的提升,而所有的一切都發生在背后。
一、新的功能
CloudFoundry提供了一些開發者們期冀的新功能。
可以和Service直接通信的Tunnel。作為開發者的我們往往希望可以使用客戶端工具直接連接到DB上調試。但是在CloudFoundry將DB作為Service隱藏在背后,這樣可以提供了諸多方便服務,卻讓我們無法直接連接到DB。CloudFoundry已經解決了這個問題,可以使用vmctunnel工具,直接訪問云后的服務。
遺留系統的接入支持。如果你有自己的DB或者已經有一個遺留系統不想讓CloudFoundry托管,但是又想獲得CloudFoundry的PaaS服務。現在有了一個完善的解決方案。開發者可以將DB或者遺漏系統包裝成一個Service。然后可以在CloudFoundry中注冊,這樣就可以自由的訪問了。
更多的Framework支持。CloudFoundry之前已經支持很多的框架。有Spring forJava, Rails and Sinatra for Ruby, and Node.js。現在CloudFoundry將支持更多的Framework。有
o-> Java平臺
> Grails模仿Rails的Java平臺實現
> Java_web 普通Java web程序
> Lift基于Scale的web框架
> Spring 流行的Java框架
o-> Ruby平臺
> Rack 最小化的Ruby Web框架
> Rails3 一站式的Ruby Web框架
> Sinatra 極簡主義的Ruby Web框架
o-> Python平臺
> Django 最流行的PythonWeb框架
> Wsgi Python的CGI
o-> 其他平臺
> Static page 靜態頁面
> node.js 異步Web框架
> Erlang
> php
> standalone 獨立的程序
隨著時間的推移,支持的框架將越來越多。你也可以自定義自己的框架,只需要實現不多的代碼。其中Standalone是比較特殊的。開發者的程序只要能啟動并監聽一個端口,就可以作為一個程序運行在CloudFoundry上。提供了非常大的靈活性。
更多的Service支持。除了更多的框架 支持,CloudFoundry增加了更多的服務。現在除了支持MySQL, MongoDB 和 Redis外。還支持很多服務。
×-> DB
- Mongodb 最流行的NoSQL數據庫
- Mysql傳統開源關系數據庫
- Neo4j圖數據庫
- PostgreSQL Mysql的有力競爭者
- Redis極快的內存KV數據庫
×-> 存儲
- Atmos EMC專業存儲
- FileSystem 遠程NFS支持
- Vblob 提供Amazon S3支持
×-> 其他
- RabbitMQ 出色的Erlang隊列系統
現在服務逐漸完善,覆蓋主流的數據庫和存儲。也可以通過上文提到的ServiceBroker來接入任何一個外部服務。沒有做不到,只有想不到。
上面主要是將新的CloudFounry多了些什么。事實上,新的版本80%的工作在于對基礎架構的改進。下面仔細闡述,CloudFoundry做了什么讓他的架構更可靠。如果不熟悉前代的架構的話,可以參見《深入Cloud Foundry》
二、ROUTER
上個版本中。Router作為一個nginx腳本存在。所以的請求都必須經過Ruby代碼,然后加以轉發。這個設計干凈利落,不過Ruby也因此轉發了大量的數據,容易引起性能問題,所以下個版本中做了如下的改進。
在新版本的設計中,他們使用Lua腳本來代替原先的Ruby腳本。而Lua腳本會對請求加以分析,轉發給Ruby程序,然后Ruby程序再將分析的結果返回。這樣一來,proxied request已經不再經過Ruby代碼。邏輯和數據完美分離。性能和穩定性都大幅提高了。
在前版設計中,當Router接收到請求后,會隨機分配一個Droplet來處理這個請求,這種方式使得用戶沒有辦法使用Session,因為連續的HTTP請求會被分發到不同的應用實例上處理。新版本設計中增加了對SESSION的支持,當Router發現用戶的請求中帶了cookie信息,它會在Cookie里暗藏一個Droplet的host,port地址。當有新的請求進來,Router通過解析Cookie得到上次的應用實例,然后盡量轉發到同一臺Droplet上。
三、STAGE
下面的新版CloudFoundry的架構圖。
可以看到在新的CloudFoundry架構中多出了很多組件。新架構中將用戶驗證從Controller中剝離,提供更好的驗證服務。同時多出了一個多帶帶Stager。
在原有的架構中,用戶上傳代碼后,Cloud Control會將這部分代碼結合CloudFoundry打包成DEA可以運行的格式,并上傳到一個NFS中,當DEA啟動的時候,會從NFS取到需要相應的包,然后再運行。
由于打包(Stage)的過程,比較復雜還需要操作大量的文件,需要的時間比較長,單薄的CloudController不堪重負,所以將其移出,成為一個多帶帶的進程。每當CloudController需要打包的時候,就會向Stage隊列中發送一個請求,Stage收到請求后,逐個處理之。
眾所周知,不管是Java,Python還是Ruby程序都會有一系列的依賴,例如Ruby的Gem。每次打包的時候,都需要下載很多Gem,這是費時費力不討好的。所以開發了PackageCache模塊來緩存常用的依賴包。這樣的話,打包的過程會順暢很多。
原先性能問題算是解決了。但CloudFoundry還是個注重高可用的系統,按照原先的設計,存放運行包的NFS是一處單點,一旦Crash,整個CloudFoundry的部署功能都將癱瘓。這是不能容忍的,而且越來越大的規模,一臺機器遲早無法容納全部的運行包。所以使用了BlobStore模塊,來替代原先的NFS,提供高可用可擴展的存儲服務。
四、SERVICE BROKER
Service Broker可以讓Cloudfoundry輕松的支持遺留系統或者不愿意讓CloudFoundry托管的系統。他究竟是如何操作的呢?
首先,我們必須準備好系統,例如postgress。我們配置好程序和防火墻,讓CloudFoundry能通過類似
postgres://xyzhr:secret@db.xyzcorp.com:5432/xyz_hr_db 的URL來訪問到服務。
然后,調用create service,系統會在ServiceBroker中記錄你的配置信息。這樣就算大功告成了。Bind和其他的過程都有ServiceBroker完成,其實僅僅就是記錄信息,沒有實際操作。使用這個新的Service的時候和使用CloudFoundry的內部Service沒有兩樣,配置參數都會通過環境變量傳入。所以當App訪問Service的時候,就與ServiceBroker無關了。
五、DEA
DEA是App的運行環境,全稱是DropletExecution Agent。一臺虛擬機上會運行一個或多個DEA。一個DEA可以啟動多個App(又稱Droplet)。所以我們大家的App都會由DEA啟動并管理。
當CloudFoundry剛剛推出的時候, Droplet包含了應用運行時啟動,停止等簡單命令。用戶應用可以隨意訪問文件系統,也可以在內網暢通無阻,跑滿CPU,占盡內存,寫滿磁盤。你一切可以想到的破壞性操作都可以做到,太可怕了。CloudFoundry顯然不會放任這樣的情況太久,現在他們開發出了Warden,一個程序運行容器。這個容器提供了一個孤立的環境,Droplet只可以獲得受限的CPU,內存,磁盤訪問權限,網絡權限,再沒有辦法搞破壞了。
Warden在Linux上的實現是將Linux 內核的資源分成若干個namespace加以區分,底層的機制是CGROUP。這樣的設計比虛擬機性能好,啟動快,也能夠獲得足夠的安全性。在網絡方面,每一個Warden實例有一個虛擬網絡接口,每個接口有一個IP,而DEA內有一個子網,這些網絡接口就連在這個子網上。安全可以通過iptables來保證。在磁盤方面,每個warden實例有一個自己的filesystem。這些filesystem使用aufs實現的。Aufs可以共享warden之間的只讀內容,區分只寫的內容,提高了磁盤空間的利用率。因為aufs只能在固定大小的文件上讀寫,所以磁盤也沒有出現寫滿的可能性。
LXC是另一個Linux Container。那為什么不使用它,而開發了Warden呢。因為LXC的實現是和Linux綁死的,CloudFoundry希望warden能運轉在各個不同的平臺,而不只是Linux。另外Warden提供了一個Daemon和若干Api來操作,LXC提供的是系統工具。還有最重要的一點是LXC過于龐大,Warden只需要其中的一點點功能就可以了,更少的代碼便于調試。
六、結語
至此,我們已經全面的瀏覽了CloudFoundry的新功能,新設計。云計算的大潮浩浩湯湯,CloudFoundry作為第一個開源的PaaS平臺日臻成熟,實用。但未來還會有更多更好設計等著我們發現,屆時我們再一起分享。
關于作者
顏開,EMC中國研究院研究員,關注大數據,云計算等領域
博客: http://weibo.com/yankaycom
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/3625.html
續與回顧 本文第一部分介紹了CloudFoundry的整體架構,并在最后花了一點篇幅簡介CloudFoundry的代碼組織情況,以便于讀者自己去研究源代碼。筆者認為開源項目較大的好處在于:當你讀懂源代碼、理解總體架構后,能夠成竹在胸,并吸收為己用(有點類似武俠小說中的北冥神功)。為己用就是本篇要說的內容:我們使用CloudFoundry搭建自己的私有PaaS平臺。 在介紹CloudFoundry之...
引子 今年4月份,VMware突然發布了業內第一個開源的PaaS——CloudFoundry。幾個關鍵字:開源、PaaS、VMware,如果你對云計算感興趣,就沖著它的ApacheV2協議,如果不去GitHub拿它的代碼好好研讀一下,真有點對不起自己。筆者當時就是以這樣的心態去研究它的代碼,并把它部署在我們labs里面。發布至今的這幾個月里,筆者一直關注它的演進,并從它的架構設計中獲益良多,...
摘要:執行后,開始啟動,最終出現下圖就說明成功了共啟動了個模塊。需要兩個文件和一個文件夾我在我的機子上找到這些文件,分別拷貝到相應的目錄,就了。安裝完后,執行上面的步驟都執行下,出現圖中的信息,說明安裝成功了,現在就可以在上面部署應用了。 作者:egg博客:http://blog.csdn.net/zhangerqing(轉載請說明出處)一、環境需求官方系統環境要求:Setup?a?VM?with...
摘要:首先從我的下載我寫好的到本地。安裝,然后執行命令行,確保成功,在項目根目錄的文件夾內生成了。將放到本地的文件夾下面。啟動本地,確保該本地工作成功。然后切換回項目根目錄,執行部署到您的上。 首先從我的Github下載我寫好的hello world Servlet到本地。 安裝Maven,然后執行命令行mvn clean install,確保build成功,在項目根目錄的target文件夾...
閱讀 828·2023-04-25 19:40
閱讀 3488·2023-04-25 17:41
閱讀 3003·2021-11-11 11:01
閱讀 2612·2019-08-30 15:55
閱讀 3227·2019-08-30 15:44
閱讀 1358·2019-08-29 14:07
閱讀 484·2019-08-29 11:23
閱讀 1326·2019-08-27 10:54