多租戶綜述
多租戶(Multi Tenancy/Tenant)是一種軟體架構,其定義是:
在一台伺服器上運行單個應 用執行個體,它為多個租戶提供服務。
在這種架構上,應用程式被設計成能將自己的資料、配置進行虛擬分區,以便 每個租戶都感覺到自己是在一個私人的、可定製化的應用執行個體上工作。
這背後代表的是資源的伸縮能力。即在同樣 硬體設定,不同租戶在資料分離的情況下,共用同樣的應用程式,還隨著租戶數量的提升,應用程式的水平擴充,並維持著 類似的效能指標(一致回應時間等)。這同時意味著資源使用效率的提升,以及節省 IT 資產的投入。
在共用與安 全之間取得平衡,是多租戶架構最主要的關注點。更多的資源共用有益於靈活性的上升和總體成本的下降,但單個租戶的安 全性需求要有額外的技術手段來保證。
多租戶的設計牽涉到兩層:
資料
應用 / 平台
資料層的多租戶能力是一個很大的主題,主要是指不同的租戶如何共用或分離資料,並滿足安全性。本文則主要關注的 是應用 / 平台層的多租戶規範與方案。
Java PaaS 的多租戶概況
Java 平台已經在 J2EE 中提供了部分多租 戶能力。作為 Oracle 要給 Java 平台提供 PaaS 的目標中的一部分,多租戶特性在 Java EE 7 最初的規範中有多處體現 ,見表 1。
表 1. Java EE 7 中涉及多租戶的 JSR
Java EE 7 對 PaaS 模型支援的規範要求:對 PaaS 環境中的同一個 PaaS 應用能夠被多個租戶使用,每個租戶使用不同的應用程式執行個體,同時又能共用資源。
PaaS 規範中要求每個租戶都有一個 tenantId,這個 ID 對於某個 PaaS 供應商的全部租戶來說,是唯一的。 sevlet 容器可以將外部請求正確映射到對應的租戶執行個體,並在隨後的所有商務程序中以 tenantId 為處理的依據,保證不 同租戶所使用資源的隔離。同時租戶的介面等是可以定製化的。
例如帶給 JPA 的影響就包括:
支援共用數 據庫、分離 schema:通過中繼資料可以對 schema/ 表映射進行重配置。
支援共用資料庫、共用 schema:廠商可以使用 tenantId 實現資料行層級的隔離。
編程模型的影響:將對本地查詢和直接 JDBC 訪問進行限制。
但在 2012 年 8 月 30 號,Oracle 的 Java EE 7 規範主管 Linda Demichiel 在部落格中宣布因為雲領域相關的應用方式不夠成熟,以及 Java EE 7 版本的發布壓力,將把 PaaS 和多租戶支援的部分延遲到 Java EE 8(以下翻譯引用自 InfoQ):
儘管 我們的願望很美好,但是在我們議程表中,雲相關的進展仍然很慢。一部分原因在於構建分配(provisioning)、多租戶( multi-tenancy)、彈性(elasticity)等領域以及應用部署部分仍然不成熟;一部分原因是我們保守的做事方式,我們盡 力把事情做‘正確’,但是在開展這項工作時,我們在雲領域仍然缺乏足夠的行業經驗。因此,我們認為,若要提供對標準 化的基於 PaaS 的編程方式和多租戶的完善的支援,就可能會將 Java EE 7 的發布延遲到 2014 年春天。該時間是兩年之 後,比規劃晚了一年。在我們看來,拖得時間太長了。
因此我們向 Java EE 7 專家組提議調整我們的計劃,堅持我 們當前的目標發布日期,而將我們議程表中 PaaS 和多租戶支援的部分延遲到 Java EE 8。”
那麼在 Java 8 中, 與雲相關的最重要的兩個特性就是多租戶與模組化。具體說就是:
多租戶:指的是在一個 JAVA 虛擬機器(JVM)中安 全運行多個應用的能力。
模組化:指的是把 JDK 重新組織為一套儘管互相依賴但卻是定義清晰的模組。Java 開發人員 的一個替代選擇是使用 OSGi。
來自 Red Hat 的 Mark Little 認為下一個 Java 版本支援這兩個特性將使得進行大 規模雲部署變得可行。
同時,Oracle 的規範領導 Linda Demichiel 提到,即使因為雲端應用還沒完全做好標準化 的準備而導致 Java EE 7 被迫放棄 PaaS 部分,但諸如 Oracle、Red Hat、IBM 和 CloudBees 等供應商已經開始提供在雲 上運行 Java EE 程式的能力。
因而本文的剩餘部分將試圖對幾種比較流行的 Java 平台解決方案中涉及多租戶的部 分做出闡述。