隨著SaaS軟件日益流行,如何為企業用戶提供即統一又相互獨立的服務,成為很多基礎軟件商的課題,因而租戶能力正受到更多關注。另一方面,隨著分布式數據庫的流行,如何充分利用分布式環境的算力及存儲資源為不同業務服務,也同樣對租戶能力提出的要求。本文針對常用的租戶實現方法、技術路線進行說明,重點說明場景數據庫的租戶能力并加以對比。
1、多租戶能力概述
多租戶(Multi Tenancy/Tenant)是一種軟件架構,是實現如何在多用戶環境下共用相同的系統或程序組件,并且可確保各用戶間數據的隔離性。與之相對應的就是單租戶SaaS架構(也被稱作多實例架構(Multiple Instance))。兩者的區別在于,單租戶是為每個客戶單獨創建各自的軟件應用和支撐環境。后者通常被廣泛引用在客戶需要支持定制化的應用場合。
(1)多租戶業務訴求
很多平臺類應用或系統(如電商 CRM 平臺、倉庫訂單平臺等等),它們的服務模型是圍繞用戶維度(這里的用戶維度可以是一個賣家或品牌,可以是一個倉庫等)展開的。因此,這類型的平臺業務,為了支持業務系統的水平擴展性,業務的數據庫通常是按用戶維度進行水平切分。當平臺類應用的一些用戶慢慢成長為大用戶(比如大品牌、大賣家、大倉庫等)后,這些大用戶由于其數據量或流量明顯要比其它用戶多得多,容易出現如業務熱點瓶頸、資源使用不均、服務品質受損等問題。SaaS 多租戶模型作為一種應用的架構,常用來解決業務的上述問題。在SaaS多租戶模型中,業務系統會需要服務多個用戶,每個用戶(或每批用戶)可以被視為一個租戶。SaaS 多租戶解決業務系統穩定性問題以及租戶資源彈性定制的核心思路,就是租戶間的資源隔離及數據隔離。針對多租戶的問題,可以有多種解決思路。
(2)多租戶構建模式
針對多租戶需求,常見有三種構建模式:
- 獨立數據庫:一個租戶獨享一個數據庫實例,提供最強的分離度,租戶數據彼此物理不可見,備份恢復都很靈活;
- 共享數據庫、獨立 Schema:將每個租戶關聯到同一個數據庫的不同 Schema,租戶間數據彼此邏輯不可見,上層應用程序的實現和獨立數據庫一樣簡單,但備份恢復稍顯復雜;
- 共享數據庫、共享 Schema、共享數據表:租戶數據在數據表級別實現共享,提供最低成本,但引入了額外的編程復雜性,備份恢復也更復雜。
從上面多種構建模式對比可見,各方案有著鮮明的優缺點。在技術實現上,可分為兩種情況,一種是采用數據庫內置能力來支持租戶,一種是在應用側來解決。針對前者,后文將著重談談各數據庫的租戶能力;后者往往依賴于應用研發能力。特別是共享庫、Schema、表的模式,具有成本低的明顯優勢,通常在應用研發側來解決,但這一模式面臨諸多難點,在實際使用中常通過中間件策略增強這一模式能力,補齊短板。
(3)中間件策略解決難點
如上面所說,采用中間件策略可以解決第三種模式的短板,這其中需要著重解決以下問題:
- 開發復雜問題。原模式中通常需要引入租戶ID的概念,在行級增加標識來區分,這對于業務研發是不太友好的,需要在中間件層面最好屏蔽,讓業務研發回歸到租戶內,不用感知到租戶信息。
- 跨機分布式事務。有時是需要提供跨租戶的數據訪問,這意味著業務需要做很多額外的應用改造成本,才能盡量來避免跨機事務導致業務出現報錯。可通過中間件層提供強一致分布式事務能力來解決這一問題。
- 元數據一致性。當使用跨Schema或共享數據表的模式,都面臨操作所有租戶對象同時生效問題。比如在 MySQL 的建刪表、加減列、加減索引等常見的DDL操作,需要中間件能力來保證平臺所有租戶的表能同時生效,一旦執行中斷,可以自動回退,無需人工介入來訂正。
- 租戶數據遷移。當租戶發展壯大后會面臨資源不足需要遷移等情況,此時就需要針對租戶提供數據遷移能力,與底層資源層解耦,實現按需使用。這部分維護成本很高,中間件可提供此能力便于在租戶層面進行遷移。
2、數據庫租戶能力調研
有很多數據庫已經內置了多租戶能力,用戶可很方便地基于此快速開發 SaaS 類應用。下面簡單對比下:
(1)Oracle 租戶能力
Oracle 多租戶功能允許在一個數據庫實例中同時運行多個獨立的數據庫,這些數據庫被稱為插件數據庫(簡稱 PDB)。多租戶功能通過將不同的 PDB 分離在不同的存儲空間中,實現數據和應用程序的隔離,從而提高數據庫的利用率和靈活性。以下是 Oracle 多租戶功能的主要特點:
- 獨立性:每個 PDB 都是一個獨立的數據庫,具有自己的數據和配置。這使得您可以在同一個數據庫實例中運行多個獨立的應用程序,而不會相互干擾。
- 共享資源:多個 PDB 可以共享一些資源,如數據庫服務器、CPU 和內存。這有助于提高資源利用率,并降低硬件成本。
- 數據隔離:每個 PDB 都有自己獨立的數據存儲,確保數據安全性。此外,Oracle 多租戶還支持跨 PDB 數據復制和同步,便于數據在不同 PDB 之間共享和一致性。
- 權限管理:Oracle 多租戶功能允許您為每個 PDB 獨立設置用戶和權限。這有助于實現精細化的權限控制,提高數據安全性。
- 簡化管理:通過 Oracle 多租戶功能,您可以集中管理多個 PDB,從而簡化數據庫管理和維護工作。
- 高可用性:Oracle 多租戶支持 PDB 的自動故障轉移、數據備份和恢復,確保應用程序的高可用性。
(2)PostgreSQL 租戶能力
PostgreSQL 數據庫本身并沒有類似 Oracle 數據提供完善的租戶能力,但是可以結合多種開源技術和框架,實現廣義軟件架構上的多租戶模式。PostgreSQL 支持實例-庫-Schema三級,也支持行級安全策略,可通過上面技術能力,實現在庫、Schema和行級別的租戶能力。
(3)TiDB 租戶能力
TiDB 采用了雙層資源管控機制來實現更精確的管控。“流量控制”模塊控制資源限額,確保僅在限額內的操作才能得以執行;“調度控制”模塊則對隊列中的任務設置不同的優先級,以確保在負載劇烈變化或超負荷運行時,高優先級的任務能夠得到快速反饋。TiDB 資源管控特性提供了兩層資源管理能力,包括在 TiDB 層的流控能力和 TiKV 層的優先級調度的能力。將用戶綁定到某個資源組后,TiDB 層會根據用戶所綁定資源組設定的配額對用戶的讀寫請求做流控,TiKV 層會根據配額映射的優先級來對請求做調度。
- 資源組,是資源管理的邏輯單元。任意一個會話屬于唯一的資源組,而同一資源組的所有會話共享同一組資源限額。TiDB 支持數據庫用戶與資源組的映射關系,通過設置數據庫用戶的默認資源組,用戶會話可以分屬于不同的資源組。未指定默認資源組的用戶,與系統內置的 default 資源組相關聯。
- 資源限額,TiDB 首先支持為資源組配置用量 (RU)。RU (Request Unit) 是 TiDB 對 CPU、IO 等系統資源的統一抽象的單位,目前會考慮 CPU、IOPS 和 IO 帶寬三個指標,按照一定的比例統一到 RU 單位上。TiDB 支持設置資源組為 BURSTABLE 模式,BURSTABLE 模式允許資源組超額使用到集群的空閑資源。
- 調度優先級,默認情況下所有資源組的優先級 (PRIORITY)均為“中等(medium)”。當資源組在同一優先級下,調度優先級按照資源配額的比例分配,這已經能夠滿足絕大多數場景的需要。用戶仍舊可以顯式地指定資源組優先級為“高(high)”或者“低(low)”,從而完成更復雜的設定。
(4)OceanBase 租戶能力
OceanBase 數據庫采用了多租戶架構。多租戶架構適用于資源整合、SaaS 服務等場景,同時也降低了運維復雜度。集群偏向于部署層面的物理概念,是 Zone 和節點的集合,Zone 和節點具有部署地域(稱為 Region)等屬性;而租戶則偏向于資源層面的邏輯概念,是在物理節點上劃分的資源單元,可以指定其資源規格,包括 CPU、內存、日志盤空間、IOPS 等。租戶類似于傳統數據庫的數據庫實例,租戶通過資源池與資源關聯,從而獨占一定的資源配額,可以動態調整資源配額。在租戶下可以創建 Database、表、用戶等數據庫對象。
- 資源規格,定義常見物理資源項的大小,包括 CPU、內存、磁盤空間、IOPS 等。創建資源池時指定其資源規格,從而根據定義創建資源單元。
- 資源單元(Unit),Unit 是租戶管理中非常重要的概念。OceanBase 按照 Unit 來管理物理資源,是 CPU、內存、存儲空間、IOPS 等物理資源的集合。Unit 也是資源調度的基本單位,其具有節點、Zone、Region 等位置屬性,節點是服務器的抽象,Zone 是機房的抽象,Region 是地域的抽象,通過調整 Unit 的位置屬性從而調整租戶的部署方式。
- 資源池,每個 Unit 都歸屬于一個資源池,每個資源池由若干個 Unit 組成,資源池是資源分配的基本單位,同一個資源池內的各個 Unit 具有相同的資源規格,即該資源池內 Unit 的物理資源大小都相同。
通過 Unit 的概念,我們將 OceanBase 數據庫的物理概念和邏輯概念進行了關聯。每個租戶有若干 Unit ,分布于若干 Zone 的若干節點上。而每個節點上分布有若干個 Unit ,這些 Unit 歸屬于不同租戶。概括的講:集群由節點組成,節點是 Unit 的容器。租戶由 Unit 組成,Unit 是數據庫對象的容器。
(5)PolarDB-X 租戶能力
PolarDB-X 是阿里云旗下一款分布式數據庫產品。它通過結合非模板化二級分區與Locality兩項能力,來解決租戶場景問題。
- 非模塊化二級分區,是指 PolarDB-X 支持使用二級分區創建分區表。可在各個一級分區之下的二級分的分區數目及其邊界值定義允許不一致。通過這種方式可以將大小租戶的數據進行不同的數據存儲策略,例如大租戶可以將數據路由到一組數據分區中,小租戶可以按哈希算法自動均衡到不同分區,從而避免訪問熱點。
- Locality,PolarDB-X 通過這個關鍵字來指定數據庫分區的實際存儲資源位置(PolarDB分布式版中存儲資源由多個數據節點(DN節點)組成,可以通過DN的ID進行位置分配),以實現數據隔離或數據的均勻分布。