目前對於到底什麼是雲計算,什麼樣的平臺屬於雲計算平臺,等等圍繞雲計算相關的問題,不同的軟硬體廠商對此都有自己不同的理解,有著自己不同的定義。 他們所提供的雲計算平臺也是千差萬別。 談到雲計算,大家總會聯想到這些方面的東西:比如說高伸縮性(High Scalability)、成本節約(Cost Saving)、按需使用(Use On Demand)等等。 我們姑且不論雲計算帶來的這些紛繁多樣的種種概念,如果僅僅從技術角度來講,雲計算本身並不是一個什麼新奇的概念,可以理解為一種新型的IT服務交付使用方式,而傳統的技術比如虛擬化、集群、 網格等等都可以用來作為雲計算平臺的支撐技術。 更詳盡的有關雲計算概念的介紹,請參考Wikipedia描述。
雲計算平臺架構
一般來講,雲計算平臺被解釋為如下的架構,圖1所示。
圖 1. 雲計算平臺架構
最下的一層是IaaS、提供CPU、網路,存儲等基礎硬體的雲服務。 在IaaS這一層,著名的雲計算產品有Amazon的S3(Simple Storage Service), 提供給使用者雲存儲服務。
再上一層是PaaS,提供類似于作業系統層次的服務與管理 ,比如Google GAE,你可以把自己寫 JAVA 應用(或者是Python)丟在Google的GAE裡運行,GAE就像一個」雲」作業系統,對你而言, 不用關心你的程式在那台機器上運行。
最後一層是SaaS,就是我們所熟悉的軟體即服務。 事實上SaaS的概念的出現要早于雲計算,只不過雲計算的出現讓原來的SaaS找到了自己更加合理的位置。 本質上,SaaS的理念是:有別的傳統的許可證付費方式(比如購買Windows Office),SaaS強調按需使用付費。 SaaS著名的產品很多,比如IBM的LotusLive、Salesforce.com等。
多租戶(Multi-Tenant)
多租戶的概念是伴隨雲計算而出現的,在這裡有必要介紹一下,我們後面的討論很大量涉及這個概念。
多租戶是一個軟體架構方面的概念,指的是一個軟體實例(Application Instance)可以供多個組織(Organization或者稱為Tenant)使用。 這裡可以理解為應用程式的虛擬化,也即:多個租戶共同使用同一個軟體實例,但是每一個租戶在資料集,配置等方面有自己的虛擬劃分。 實際上,在某種程度上,基於B/S架構的應用程式比如J2EE應用本身就是多租戶性質的,因為大家都是使用瀏覽器來訪問同一份部署在Application Server上的軟體實例。 這裡之所以說是」某種程度」,是因為對於我們談到的資料集按租戶虛擬劃分,現實的 J2EE 應用並沒有支援。 這個東西本文在後面會詳細談到。
接下來的章節,將以S3和GAE為例子,圍繞本文討論的主題:多租戶和資源管理, 簡單介紹一下在這些典型的雲計算平臺上,多租戶是怎麼樣進行部署的,以及在這些平臺上的資源是如何被管理的。
多租戶及資源管理在S3的支援
Amazon S3向使用者提供的線上的(基於Internet)雲存儲服務。 使用者可以在S3上存儲任何資料,這些資料可以是私有的亦或是可以被公共訪問的。 Amazon S3 支援 Web 瀏覽器或者BitTorrent來訪問這些資料。 一般來講,使用者使用S3:
作為Backup server:存儲你的私有資料到S3上去,這樣你就不需要自己購買維護自己的備份磁片,你只是付費從Amazon租賃磁碟空間。 作為Data host: 存儲資料到S3上,並且其他人有訪問這些資料的許可權。 這裡,你付費的物件不是傳統意義上的ISP,而是Amazon。 S3存儲涉及兩個核心的概念:S3 bucket和S3 object。 S3 object是對存在於Amazon S3上內容的抽象,其包括兩方面的內容:資料和中繼資料,資料指的是你存儲的真正的內容,比如一份PDF文檔,一個HTML檔等。 而中繼資料是對該資料的描述,比如可以用於指定當前存放的內容的Content-Type是text/html。 每一個S3 object有一個唯一的Key來標誌。 S3 bucket是存放S3 object的容器。 如果用個類比的話,S3 bucket相當於于磁片上的檔案系統,而S3 Object 則是這個檔案系統中的一個檔。
我們用一個簡單的例子來看,在S3上多租戶是怎麼做出來的?
假如想利用S3存儲example.com web網站,首先需要創建名為」example.com」的bucket,然後在這個bucket裡創建諸如:鍵值為 「」( 空串 ),」catalog」、「catalog/929339」 的objects,這些objects對應的URL分別為:「HTTP://example.com/」,「HTTP://example.com/catalog/」,「HTTP://example.com/catalog/ 929339」,而object的值就是相應的 HTML 頁面,中繼資料Content-Type被設置為 text/html(相應于標準的HTTP定義)。
如果多租戶的角度來看,我們可以把S3看作是線上的存儲伺服器,各個租戶可以把自己的資訊存儲在S3上,比如 : 甲租戶可以把 HTTP://tenantA.com網站放在S3上,乙租戶可以存儲的是HTTP:// tenantB.com網站,各個租戶共用S3的使用。
除了多租戶支援,S3還有資源的使用管理,計費等功能,如圖2所示:
圖 2. S3 存儲價格表
多租戶及資源管理在GAE上的支援
較之于IaaS、Google App Engine提供了更多的系統抽象能力。 如果做一個比喻的話,IaaS相當於你有了一台擁有存儲、網路、CPU等計算資源的電腦,而PaaS的Google App Engine則是裝在這台電腦上的作業系統。 設想一下,如果你開發一個傳統意義上的J2EE應用,你要關心的事情除了應用程式本身之外,還有:要部署在什麼樣的應用伺服器上,使用什麼樣的資料庫,應用的可伸縮性(Scalability)等等。 而有了GAE,這些東西你都不需要關心了,你只需要根據GAE規範開發J2EE應用,然後把它部署在GAE雲裡,GAE會説明你管理除了你的應用程式本身的所有事情。
GAE本身就是多租戶的架構,即:來自不同租戶的、任何一個符合GAE規範J2EE都可以部署在GAE上。
而且,部署在GAE上的應用實例,如果你想把它作為一個SaaS應用的話,本身也可以實現多租戶,也就是說:當你的一個部署在GAE上的J2EE應用需要被不同的租戶使用時,可以使用Google提供的Namespace API將其虛擬化為多個應用實例。 比如:該SaaS應用的不同的租戶使用了不同的子功能變數名稱(subdomain),tenantA 的子功能變數名稱是tenantA.example.com,tenantB的子功能變數名稱是tenantB.example.com等等,你可以使用下面的代碼把不同的租戶劃歸在不同的命名空間裡,它們可以在共用同一個Datastore實例的基礎上按照不同的租戶實現 相互的隔離。
清單 1. GAE App Multitenancy
以下是引用片段:
// Filter to set the namespace by different subdomain.
public class NamespaceFilter implements javax.servlet.Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
//Make sure set() is only called if the current namespace is not already set.
if (NamespaceManager.get() == null) {
NamespaceManager.set(req.getServerName());
}
Chain into the next request.
chain.doFilter(req, res);
}
// ... remaining Filter methods init() and destroy()
}
值得注意的是,GAE Namespace使用了Thread-local storage的技術。 也就是說,你在Filter設置的Namespace Manager,其存留期 ( 或者叫做有效範圍 ) 是存在於單個HTTP Request生命週期內 ( 即:當前執行緒服務該請求的期間內 ),而不是租戶登錄後的整個Session週期。
類似于Amazon S3,GAE也提供了資源的管理計費功能,如圖3所示。
圖 3. GAE資源管理
寫到這裡,總結一下:我們看到,無論是S3還是GAE,都對多租戶以及資源管理做了支援。 事實上,不只是S3和GAE,多租戶以及資源管理是任何一個雲計算平臺都必須具備的一個核心特質。
如何我們簡單的把S3和GAE看作是運行在JAVA平臺的上的應用程式 ( 底層運行的是 JRE ! ),那麼我們可以說:S3和GAE都在JAVA Application這個層次上對這兩個需求做了它們自己的實現。 進一步設想,如果我們要求底層的 JRE 本身就能對多租戶和資源管理提供支援,那麼有理由相信,這些部署在JRE上的JAVA應用,利用底層JRE的這些支援,應該能更高效、簡潔、方便地來做這方面的工作。 這也是本文接下來要談的JAVA平臺的兩個重要的JSR:JSR284和JSR121的原因。 一個是JAVA平臺的資源管理支援,一個是JAVA平臺的多租戶支援。
早在雲計算興起之前,Sun Lab就已經開始關注于JAVA平臺的資源的共用與管理。 比如:如果不借助作業系統的本地支援,我們沒辦法讓一個普通的JAVA應用程式受限於CPU的使用,受限於Disk IO或者網路頻寬的使用等等。 當我們在同一台機器上運行多個JVM實例時,它們都是獨立的使用者進程,每個JVM的啟動都需要具現化自己一份獨立的JDK類庫,其結果是:JVM啟動時間(Startup)、內容(Memory footprint) 等都消耗在重複的JVM初始化上。 我們要問的問題是:多個JVM可以最大化地共用JDK運行時嗎 ? 在共用的同時它們能夠互不影響嗎? 這就是Sun發起Barcelona研究專案,Multi-Tasking Virtual Machine(即MVM)的主要原因。
在雲計算大行其道的今天,我們回過頭再來審視一下Barcelona專案,MVM所有解決的兩個目標:資源的共用與管理,在雲計算的環境下顯得愈加的重要。 正如我們前面所講的那樣,作為雲計算環境兩個必備的兩個特性,多租戶和資源管理,前者要求最大化的共用軟體實例,後者要求我們在共用的基礎上如何對資源的使用進行隔離與控制。 這也正和MVM的目標不謀而合。 由MVM源生出了下面的兩個JSR:121和284,這也應該是JAVA平臺走向虛擬化的所必需的步驟。
(責任編輯:呂光)