如何理解SaaS多租戶的設計?
多租戶技術簡稱SaaS,是一種軟件架構技術,是實現如何在多用戶環境下共用相同的系統或程序組件,并且可確保各用戶間數據的隔離性。本文對SaaS的多租戶設計進行了分析闡述,一起來看一下吧。
多租戶定義:多租戶技術或稱多重租賃技術,簡稱SaaS,是一種軟件架構技術,是實現如何在多用戶環境下(此處的多用戶一般是面向企業用戶)共用相同的系統或程序組件,并且可確保各用戶間數據的隔離性。
簡單講:在一臺服務器上運行單個應用實例,它為多個租戶(客戶)提供服務。
從定義中我們可以理解:多租戶是一種架構,目的是為了讓多用戶環境下使用同一套程序,且保證用戶間數據隔離。那么重點就很淺顯易懂了,多租戶的重點就是同一套程序下實現多用戶數據的隔離。對于實現方式,我們下面會討論到。
在了解詳細一點:在一個多租戶的結構下,應用都是運行在同樣的或者是一組服務器下,這種結構被稱為“單實例”架構(Single Instance),單實例多租戶。
多個租戶的數據是保存在相同位置,依靠對數據庫分區來實現隔離操作。既然用戶都在運行相同的應用實例,服務運行在服務供應商的服務器上,用戶無法去進行定制化的操作,所以這對于對該產品有特殊需要定制化的客戶就無法適用,所以多租戶適合通用類需求的客戶。那么缺點來了,多租戶下無法實現用戶的定制化操作。
在翻閱多租戶的資料時,還有一個名詞與之相對應,那就是單租戶SaaS架構(也被稱作多實例架構(Multiple Instance))。單租戶架構與多租戶的區別在于,單租戶是為每個客戶單獨創建各自的軟件應用和支撐環境。單租戶SaaS被廣泛引用在客戶需要支持定制化的應用場合,而這種定制或者是因為地域,抑或是他們需要更高的安全控制。
通過單租戶的模式,每個客戶都有一份分別放在獨立的服務器上的數據庫和操作系統,或者使用強的安全措施進行隔離的虛擬網絡環境中。因為本篇主要是討論多租戶,所以單租戶的相關知識就簡單了解一下,不做過多的闡述了。
一、多租戶數據隔離的三種方案
在當下云計算時代,多租戶技術在共用的數據中心以單一系統架構與服務提供多數客戶端相同甚至可定制化的服務,并且仍可以保障客戶的數據隔離。目前各種各樣的云計算服務就是這類技術范疇,例如阿里云數據庫服務(RDS)、阿里云服務器等等。
多租戶在數據存儲上存在三種主要的方案,分別是:
1. 獨立數據庫
這是第一種方案,即一個租戶一個數據庫,這種方案的用戶數據隔離級別最高,安全性最好,但成本較高。
- 優點:為不同的租戶提供獨立的數據庫,有助于簡化數據模型的擴展設計,滿足不同租戶的獨特需求;如果出現故障,恢復數據比較簡單。
- 缺點: 增多了數據庫的安裝數量,隨之帶來維護成本和購置成本的增加。
這種方案與傳統的一個客戶、一套數據、一套部署類似,差別只在于軟件統一部署在運營商那里。如果面對的是銀行、醫院等需要非常高數據隔離級別的租戶,可以選擇這種模式,提高租用的定價。如果定價較低,產品走低價路線,這種方案一般對運營商來說是無法承受的。
2. 共享數據庫,獨立 Schema
這是第二種方案,即多個或所有租戶共享Database,但是每個租戶一個Schema(也可叫做一個user)。底層庫比如是:DB2、ORACLE等,一個數據庫下可以有多個SCHEMA。
- 優點: 為安全性要求較高的租戶提供了一定程度的邏輯數據隔離,并不是完全隔離;每個數據庫可支持更多的租戶數量。
- 缺點: 如果出現故障,數據恢復比較困難,因為恢復數據庫將牽涉到其他租戶的數據; 如果需要跨租戶統計數據,存在一定困難。
3. 共享數據庫,共享 Schema,共享數據表
這是第三種方案,即租戶共享同一個Database、同一個Schema,但在表中增加TenantID多租戶的數據字段。這是共享程度最高、隔離級別最低的模式。
即每插入一條數據時都需要有一個客戶的標識。這樣才能在同一張表中區分出不同客戶的數據。
- 優點:三種方案比較,第三種方案的維護和購置成本最低,允許每個數據庫支持的租戶數量最多。
- 缺點: 隔離級別最低,安全性最低,需要在設計開發時加大對安全的開發量; 數據備份和恢復最困難,需要逐表逐條備份和還原。如果希望以最少的服務器為最多的租戶提供服務,并且租戶接受犧牲隔離級別換取降低成本,這種方案最適合。
在SaaS實施過程中,有一個顯著的考量點,就是如何對應用數據進行設計,以支持多租戶,而這種設計的思路,是要在數據的共享、安全隔離和性能間取得平衡。
二、選擇合理的實現模式
衡量三種模式主要考慮的因素是隔離還是共享。
1)成本角度因素
隔離性越好,設計和實現的難度和成本越高,初始成本越高。共享性越好,同一運營成本下支持的用戶越多,運營成本越低。
2)安全因素
要考慮業務和客戶的安全方面的要求。安全性要求越高,越要傾向于隔離。
3)從租戶數量上考慮
主要考慮下面一些因素:
系統要支持多少租戶?上百?上千還是上萬?可能的租戶越多,越傾向于共享。
平均每個租戶要存儲數據需要的空間大小。存貯的數據越多,越傾向于隔離。
每個租戶的同時訪問系統的最終用戶數量。需要支持的越多,越傾向于隔離。
是否想針對每一租戶提供附加的服務,例如數據的備份和恢復等。這方面的需求越多, 越傾向于隔離。
4)技術儲備
共享性越高,對技術的要求越高。
三、團隊開發框架實戰—多租戶支持
多租戶技術的實現重點,在于不同租戶間應用程序環境的隔離(application context isolation)以及數據的隔離(data isolation),以維持不同租戶間應用程序不會相互干擾,同時數據的保密性也夠強。
多租戶數據庫構架方式主要分為:獨立數據庫(私有表)、共享數據庫隔離數據框架(擴展表)、共享數據庫共享數據框架(通用表)。
以上架構模式中,數據隔離程度相對較差,數據共享程度越高,越能夠支持較多的租戶,同時設備成本越低,但同時數據維護難度越大。如敏感數據較多,則選擇共享數據庫隔離數據框架,否則可選擇共享數據庫共享數據框架的方式進行數據存儲構架。
本項目系統可能出現數量較多的租戶,同時設備有限,所以選取共享數據庫共享數據框架(通用表)的數據存儲結構。
數據表結構采用名稱值對的方式進行設計:將擴展數據的保存和原數據表分離,另外用一個統一的擴展數據表來保存。擴展數據表將數據表的橫向擴展列轉換為縱向的數據集,將每一條原始數據記錄的一個擴展字段,都保存成一條擴展數據行。將數據表中的數據記錄與配置元數據表中的配置記錄關聯,構成擴展數據記錄??梢蕴峁o限數量的自定義擴展字段。但是其增加數據操作的復雜性,查詢時也要多次訪問數據庫才能得到完整的業務數據。
多通用表與鍵值對的數據存儲架構存儲工作過程,上層應用通過標準多租戶數據定義、存儲API 進行交互,通過標準的API 接口將多租戶數據存儲到數據空中;也可以通過查詢的方式來從統一存儲的數據庫中還原租戶的數據。
在圖中,多租戶數據管理系統主要進行的數據操作是開發視圖下進行的,主要操作有對租戶數據模型的定義和擴展、租戶數據的持久化存儲和查詢讀取。
在對租戶數據模型的定義和擴展過程中,需要將租戶的信息提取出來單獨存儲;對租戶所定義的數據表包含的數據表名稱、數據表中列名稱、列值的類型、列值的數據長度、數據表與其他表中的關系等元數據提取出來進行管理。租戶數據的持久化存儲和查詢讀取操作,先對租戶的身份進行驗證,防止租戶對其他租戶數據進行操作。
通過物理SQL 語句生成模塊將租戶數據查詢操作的邏輯SQL 與轉化成能夠直接在邏輯存儲層執行的SQL 語句。
- 租戶數據模型定義部件描述了租戶的定制信息。這種定制信息描述了租戶定制的數據表的名稱、數據類型、約束關系等。
- 邏輯SQL,是由租戶發起的數據查詢查詢請求。在數據管理分層模型中,開發視圖下,屏蔽了租戶無關的數據特性。租戶可以通過相關的接口進行數據查詢,因此邏輯SQL 與標準SQL 沒有區別。
- 物理SQL是用于實際查詢數據的SQL語句,它工作在邏輯存儲視圖層。物理SQL 是將邏輯SQL 語句邏輯數據表結構轉換成底層數據的物理數據表結構所形成的能夠在底層數據庫中執行的SQL 語句。
- 查詢重寫器的功能是將邏輯SQL 語句進行重新構造將其轉換為能夠在通用表上執行的物理SQL 語句。查詢重寫器獲取租戶發出的查詢請求,從數據庫中獲取租戶信息,根據租戶查詢的數據表對應的元數據信息,將租戶的查詢請求,轉換成為邏輯存儲層面上,數據庫系統能夠執行的查詢語句。
- 租戶管理模塊的功能是將租戶的信息、租戶所擁有的數據表信息進行存儲和查詢,提供給數據管理系統中其他模塊獲取租戶數據的能力。
- 租戶身份驗證主要是針對某一租戶的數據進行正確的存儲,正確地映射到數據庫系統中;當租戶對數據進行查詢時,能夠根據租戶信息正確地查找到租戶所需的數據,并在查詢過程中不對其他租戶數據產生影響。
當租戶進行數據模式定制時,租戶數據模式定制器獲取租戶所需定制的數據模式,并定制請求中分析出租戶對數據模型定制信息,并將這些信息寫入到元數據表中元數據表和,完成租戶數據模式的定制。
當租戶中用戶發起數據查詢請求時,查詢重寫部件查找用戶數據庫,獲取該用戶所對應的租戶身份標識,根據查詢請求中的數據表模式信息,從元數據表中查詢出相應的元數據信息,將租戶中用戶發起的數據查詢請求進行重寫。
重寫過程如下,根據邏輯SQL 語句,從中提取出查詢關鍵字,需要查詢的邏輯數據表、數據列等信息,根據這些信息從元數據表中查找出相應的邏輯存儲表信息,將實際存儲的信息替換邏輯SQL 語句中的信息,完成重寫。
通用表存儲模式下,當租戶發起業務數據模式新建時,邏輯數據管理提出租戶信息,其中包含了租戶新建的數據表的列數及各列的描述,根據新建的命令,生成邏輯SQL 語句,提交到SQL 重寫器,SQL 重寫從邏輯SQL 語句中抽取出元數據,數據表元數據,字段表元數據,關系表元數據,并根據SQL 重寫算法,逐一生成物理SQL 語句,交予數據庫執行,序列圖如下所示。
當租戶查詢數據時,SQL 查詢重寫器捕捉到租戶查詢的邏輯SQL 語句,訪問控制管理從邏輯SQL 語句中感知租戶身份,并根據租戶的權限,驗證數據查詢是否超出租戶權限,若超出則返回,并給出超出權限提示。
通過驗證則將邏輯查詢請求發送給SQL 重寫器,重寫器從邏輯SQL 語句中抽取出查詢字段,租戶虛擬表,查詢條件。根據租戶虛擬表從元數據中查詢出對應的元數據,查詢重寫器根據元數據,將邏輯SQL 語句轉化為物理SQL 語句,并在數據庫中查詢執行。
本文由@劉同學 原創發布于人人都是產品經理,未經許可,禁止轉載
題圖來自Unsplash,基于CC0協議
該文觀點僅代表作者本人,人人都是產品經理平臺僅提供信息存儲空間服務。
- 目前還沒評論,等你發揮!