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