如何理解SaaS多租戶的設(shè)計(jì)?

0 評(píng)論 18898 瀏覽 94 收藏 16 分鐘

多租戶技術(shù)簡(jiǎn)稱SaaS,是一種軟件架構(gòu)技術(shù),是實(shí)現(xiàn)如何在多用戶環(huán)境下共用相同的系統(tǒng)或程序組件,并且可確保各用戶間數(shù)據(jù)的隔離性。本文對(duì)SaaS的多租戶設(shè)計(jì)進(jìn)行了分析闡述,一起來看一下吧。

多租戶定義:多租戶技術(shù)或稱多重租賃技術(shù),簡(jiǎn)稱SaaS,是一種軟件架構(gòu)技術(shù),是實(shí)現(xiàn)如何在多用戶環(huán)境下(此處的多用戶一般是面向企業(yè)用戶)共用相同的系統(tǒng)或程序組件,并且可確保各用戶間數(shù)據(jù)的隔離性。

簡(jiǎn)單講:在一臺(tái)服務(wù)器上運(yùn)行單個(gè)應(yīng)用實(shí)例,它為多個(gè)租戶(客戶)提供服務(wù)。

從定義中我們可以理解:多租戶是一種架構(gòu),目的是為了讓多用戶環(huán)境下使用同一套程序,且保證用戶間數(shù)據(jù)隔離。那么重點(diǎn)就很淺顯易懂了,多租戶的重點(diǎn)就是同一套程序下實(shí)現(xiàn)多用戶數(shù)據(jù)的隔離。對(duì)于實(shí)現(xiàn)方式,我們下面會(huì)討論到。

在了解詳細(xì)一點(diǎn):在一個(gè)多租戶的結(jié)構(gòu)下,應(yīng)用都是運(yùn)行在同樣的或者是一組服務(wù)器下,這種結(jié)構(gòu)被稱為“單實(shí)例”架構(gòu)(Single Instance),單實(shí)例多租戶。

多個(gè)租戶的數(shù)據(jù)是保存在相同位置,依靠對(duì)數(shù)據(jù)庫分區(qū)來實(shí)現(xiàn)隔離操作。既然用戶都在運(yùn)行相同的應(yīng)用實(shí)例,服務(wù)運(yùn)行在服務(wù)供應(yīng)商的服務(wù)器上,用戶無法去進(jìn)行定制化的操作,所以這對(duì)于對(duì)該產(chǎn)品有特殊需要定制化的客戶就無法適用,所以多租戶適合通用類需求的客戶。那么缺點(diǎn)來了,多租戶下無法實(shí)現(xiàn)用戶的定制化操作。

在翻閱多租戶的資料時(shí),還有一個(gè)名詞與之相對(duì)應(yīng),那就是單租戶SaaS架構(gòu)(也被稱作多實(shí)例架構(gòu)(Multiple Instance))。單租戶架構(gòu)與多租戶的區(qū)別在于,單租戶是為每個(gè)客戶單獨(dú)創(chuàng)建各自的軟件應(yīng)用和支撐環(huán)境。單租戶SaaS被廣泛引用在客戶需要支持定制化的應(yīng)用場(chǎng)合,而這種定制或者是因?yàn)榈赜?,抑或是他們需要更高的安全控制?/p>

通過單租戶的模式,每個(gè)客戶都有一份分別放在獨(dú)立的服務(wù)器上的數(shù)據(jù)庫和操作系統(tǒng),或者使用強(qiáng)的安全措施進(jìn)行隔離的虛擬網(wǎng)絡(luò)環(huán)境中。因?yàn)楸酒饕怯懻摱嘧鈶?,所以單租戶的相關(guān)知識(shí)就簡(jiǎn)單了解一下,不做過多的闡述了。

一、多租戶數(shù)據(jù)隔離的三種方案

在當(dāng)下云計(jì)算時(shí)代,多租戶技術(shù)在共用的數(shù)據(jù)中心以單一系統(tǒng)架構(gòu)與服務(wù)提供多數(shù)客戶端相同甚至可定制化的服務(wù),并且仍可以保障客戶的數(shù)據(jù)隔離。目前各種各樣的云計(jì)算服務(wù)就是這類技術(shù)范疇,例如阿里云數(shù)據(jù)庫服務(wù)(RDS)、阿里云服務(wù)器等等。

多租戶在數(shù)據(jù)存儲(chǔ)上存在三種主要的方案,分別是:

1. 獨(dú)立數(shù)據(jù)庫

這是第一種方案,即一個(gè)租戶一個(gè)數(shù)據(jù)庫,這種方案的用戶數(shù)據(jù)隔離級(jí)別最高,安全性最好,但成本較高。

  • 優(yōu)點(diǎn):為不同的租戶提供獨(dú)立的數(shù)據(jù)庫,有助于簡(jiǎn)化數(shù)據(jù)模型的擴(kuò)展設(shè)計(jì),滿足不同租戶的獨(dú)特需求;如果出現(xiàn)故障,恢復(fù)數(shù)據(jù)比較簡(jiǎn)單。
  • 缺點(diǎn): 增多了數(shù)據(jù)庫的安裝數(shù)量,隨之帶來維護(hù)成本和購置成本的增加。

這種方案與傳統(tǒng)的一個(gè)客戶、一套數(shù)據(jù)、一套部署類似,差別只在于軟件統(tǒng)一部署在運(yùn)營(yíng)商那里。如果面對(duì)的是銀行、醫(yī)院等需要非常高數(shù)據(jù)隔離級(jí)別的租戶,可以選擇這種模式,提高租用的定價(jià)。如果定價(jià)較低,產(chǎn)品走低價(jià)路線,這種方案一般對(duì)運(yùn)營(yíng)商來說是無法承受的。

2. 共享數(shù)據(jù)庫,獨(dú)立 Schema

這是第二種方案,即多個(gè)或所有租戶共享Database,但是每個(gè)租戶一個(gè)Schema(也可叫做一個(gè)user)。底層庫比如是:DB2、ORACLE等,一個(gè)數(shù)據(jù)庫下可以有多個(gè)SCHEMA。

  • 優(yōu)點(diǎn): 為安全性要求較高的租戶提供了一定程度的邏輯數(shù)據(jù)隔離,并不是完全隔離;每個(gè)數(shù)據(jù)庫可支持更多的租戶數(shù)量。
  • 缺點(diǎn): 如果出現(xiàn)故障,數(shù)據(jù)恢復(fù)比較困難,因?yàn)榛謴?fù)數(shù)據(jù)庫將牽涉到其他租戶的數(shù)據(jù); 如果需要跨租戶統(tǒng)計(jì)數(shù)據(jù),存在一定困難。

3. 共享數(shù)據(jù)庫,共享 Schema,共享數(shù)據(jù)表

這是第三種方案,即租戶共享同一個(gè)Database、同一個(gè)Schema,但在表中增加TenantID多租戶的數(shù)據(jù)字段。這是共享程度最高、隔離級(jí)別最低的模式。

即每插入一條數(shù)據(jù)時(shí)都需要有一個(gè)客戶的標(biāo)識(shí)。這樣才能在同一張表中區(qū)分出不同客戶的數(shù)據(jù)。

  • 優(yōu)點(diǎn):三種方案比較,第三種方案的維護(hù)和購置成本最低,允許每個(gè)數(shù)據(jù)庫支持的租戶數(shù)量最多。
  • 缺點(diǎn): 隔離級(jí)別最低,安全性最低,需要在設(shè)計(jì)開發(fā)時(shí)加大對(duì)安全的開發(fā)量; 數(shù)據(jù)備份和恢復(fù)最困難,需要逐表逐條備份和還原。如果希望以最少的服務(wù)器為最多的租戶提供服務(wù),并且租戶接受犧牲隔離級(jí)別換取降低成本,這種方案最適合。

在SaaS實(shí)施過程中,有一個(gè)顯著的考量點(diǎn),就是如何對(duì)應(yīng)用數(shù)據(jù)進(jìn)行設(shè)計(jì),以支持多租戶,而這種設(shè)計(jì)的思路,是要在數(shù)據(jù)的共享、安全隔離和性能間取得平衡。

二、選擇合理的實(shí)現(xiàn)模式

衡量三種模式主要考慮的因素是隔離還是共享。

1)成本角度因素

隔離性越好,設(shè)計(jì)和實(shí)現(xiàn)的難度和成本越高,初始成本越高。共享性越好,同一運(yùn)營(yíng)成本下支持的用戶越多,運(yùn)營(yíng)成本越低。

2)安全因素

要考慮業(yè)務(wù)和客戶的安全方面的要求。安全性要求越高,越要傾向于隔離。

3)從租戶數(shù)量上考慮

主要考慮下面一些因素:

系統(tǒng)要支持多少租戶?上百?上千還是上萬?可能的租戶越多,越傾向于共享。

平均每個(gè)租戶要存儲(chǔ)數(shù)據(jù)需要的空間大小。存貯的數(shù)據(jù)越多,越傾向于隔離。

每個(gè)租戶的同時(shí)訪問系統(tǒng)的最終用戶數(shù)量。需要支持的越多,越傾向于隔離。

是否想針對(duì)每一租戶提供附加的服務(wù),例如數(shù)據(jù)的備份和恢復(fù)等。這方面的需求越多, 越傾向于隔離。

4)技術(shù)儲(chǔ)備

共享性越高,對(duì)技術(shù)的要求越高。

三、團(tuán)隊(duì)開發(fā)框架實(shí)戰(zhàn)—多租戶支持

多租戶技術(shù)的實(shí)現(xiàn)重點(diǎn),在于不同租戶間應(yīng)用程序環(huán)境的隔離(application context isolation)以及數(shù)據(jù)的隔離(data isolation),以維持不同租戶間應(yīng)用程序不會(huì)相互干擾,同時(shí)數(shù)據(jù)的保密性也夠強(qiáng)。

多租戶數(shù)據(jù)庫構(gòu)架方式主要分為:獨(dú)立數(shù)據(jù)庫(私有表)、共享數(shù)據(jù)庫隔離數(shù)據(jù)框架(擴(kuò)展表)、共享數(shù)據(jù)庫共享數(shù)據(jù)框架(通用表)。

以上架構(gòu)模式中,數(shù)據(jù)隔離程度相對(duì)較差,數(shù)據(jù)共享程度越高,越能夠支持較多的租戶,同時(shí)設(shè)備成本越低,但同時(shí)數(shù)據(jù)維護(hù)難度越大。如敏感數(shù)據(jù)較多,則選擇共享數(shù)據(jù)庫隔離數(shù)據(jù)框架,否則可選擇共享數(shù)據(jù)庫共享數(shù)據(jù)框架的方式進(jìn)行數(shù)據(jù)存儲(chǔ)構(gòu)架。

本項(xiàng)目系統(tǒng)可能出現(xiàn)數(shù)量較多的租戶,同時(shí)設(shè)備有限,所以選取共享數(shù)據(jù)庫共享數(shù)據(jù)框架(通用表)的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)。

數(shù)據(jù)表結(jié)構(gòu)采用名稱值對(duì)的方式進(jìn)行設(shè)計(jì):將擴(kuò)展數(shù)據(jù)的保存和原數(shù)據(jù)表分離,另外用一個(gè)統(tǒng)一的擴(kuò)展數(shù)據(jù)表來保存。擴(kuò)展數(shù)據(jù)表將數(shù)據(jù)表的橫向擴(kuò)展列轉(zhuǎn)換為縱向的數(shù)據(jù)集,將每一條原始數(shù)據(jù)記錄的一個(gè)擴(kuò)展字段,都保存成一條擴(kuò)展數(shù)據(jù)行。將數(shù)據(jù)表中的數(shù)據(jù)記錄與配置元數(shù)據(jù)表中的配置記錄關(guān)聯(lián),構(gòu)成擴(kuò)展數(shù)據(jù)記錄。可以提供無限數(shù)量的自定義擴(kuò)展字段。但是其增加數(shù)據(jù)操作的復(fù)雜性,查詢時(shí)也要多次訪問數(shù)據(jù)庫才能得到完整的業(yè)務(wù)數(shù)據(jù)。

多通用表與鍵值對(duì)的數(shù)據(jù)存儲(chǔ)架構(gòu)存儲(chǔ)工作過程,上層應(yīng)用通過標(biāo)準(zhǔn)多租戶數(shù)據(jù)定義、存儲(chǔ)API 進(jìn)行交互,通過標(biāo)準(zhǔn)的API 接口將多租戶數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)空中;也可以通過查詢的方式來從統(tǒng)一存儲(chǔ)的數(shù)據(jù)庫中還原租戶的數(shù)據(jù)。

在圖中,多租戶數(shù)據(jù)管理系統(tǒng)主要進(jìn)行的數(shù)據(jù)操作是開發(fā)視圖下進(jìn)行的,主要操作有對(duì)租戶數(shù)據(jù)模型的定義和擴(kuò)展、租戶數(shù)據(jù)的持久化存儲(chǔ)和查詢讀取。

在對(duì)租戶數(shù)據(jù)模型的定義和擴(kuò)展過程中,需要將租戶的信息提取出來單獨(dú)存儲(chǔ);對(duì)租戶所定義的數(shù)據(jù)表包含的數(shù)據(jù)表名稱、數(shù)據(jù)表中列名稱、列值的類型、列值的數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)表與其他表中的關(guān)系等元數(shù)據(jù)提取出來進(jìn)行管理。租戶數(shù)據(jù)的持久化存儲(chǔ)和查詢讀取操作,先對(duì)租戶的身份進(jìn)行驗(yàn)證,防止租戶對(duì)其他租戶數(shù)據(jù)進(jìn)行操作。

通過物理SQL 語句生成模塊將租戶數(shù)據(jù)查詢操作的邏輯SQL 與轉(zhuǎn)化成能夠直接在邏輯存儲(chǔ)層執(zhí)行的SQL 語句。

  • 租戶數(shù)據(jù)模型定義部件描述了租戶的定制信息。這種定制信息描述了租戶定制的數(shù)據(jù)表的名稱、數(shù)據(jù)類型、約束關(guān)系等。
  • 邏輯SQL,是由租戶發(fā)起的數(shù)據(jù)查詢查詢請(qǐng)求。在數(shù)據(jù)管理分層模型中,開發(fā)視圖下,屏蔽了租戶無關(guān)的數(shù)據(jù)特性。租戶可以通過相關(guān)的接口進(jìn)行數(shù)據(jù)查詢,因此邏輯SQL 與標(biāo)準(zhǔn)SQL 沒有區(qū)別。
  • 物理SQL是用于實(shí)際查詢數(shù)據(jù)的SQL語句,它工作在邏輯存儲(chǔ)視圖層。物理SQL 是將邏輯SQL 語句邏輯數(shù)據(jù)表結(jié)構(gòu)轉(zhuǎn)換成底層數(shù)據(jù)的物理數(shù)據(jù)表結(jié)構(gòu)所形成的能夠在底層數(shù)據(jù)庫中執(zhí)行的SQL 語句。
  • 查詢重寫器的功能是將邏輯SQL 語句進(jìn)行重新構(gòu)造將其轉(zhuǎn)換為能夠在通用表上執(zhí)行的物理SQL 語句。查詢重寫器獲取租戶發(fā)出的查詢請(qǐng)求,從數(shù)據(jù)庫中獲取租戶信息,根據(jù)租戶查詢的數(shù)據(jù)表對(duì)應(yīng)的元數(shù)據(jù)信息,將租戶的查詢請(qǐng)求,轉(zhuǎn)換成為邏輯存儲(chǔ)層面上,數(shù)據(jù)庫系統(tǒng)能夠執(zhí)行的查詢語句。
  • 租戶管理模塊的功能是將租戶的信息、租戶所擁有的數(shù)據(jù)表信息進(jìn)行存儲(chǔ)和查詢,提供給數(shù)據(jù)管理系統(tǒng)中其他模塊獲取租戶數(shù)據(jù)的能力。
  • 租戶身份驗(yàn)證主要是針對(duì)某一租戶的數(shù)據(jù)進(jìn)行正確的存儲(chǔ),正確地映射到數(shù)據(jù)庫系統(tǒng)中;當(dāng)租戶對(duì)數(shù)據(jù)進(jìn)行查詢時(shí),能夠根據(jù)租戶信息正確地查找到租戶所需的數(shù)據(jù),并在查詢過程中不對(duì)其他租戶數(shù)據(jù)產(chǎn)生影響。

當(dāng)租戶進(jìn)行數(shù)據(jù)模式定制時(shí),租戶數(shù)據(jù)模式定制器獲取租戶所需定制的數(shù)據(jù)模式,并定制請(qǐng)求中分析出租戶對(duì)數(shù)據(jù)模型定制信息,并將這些信息寫入到元數(shù)據(jù)表中元數(shù)據(jù)表和,完成租戶數(shù)據(jù)模式的定制。

當(dāng)租戶中用戶發(fā)起數(shù)據(jù)查詢請(qǐng)求時(shí),查詢重寫部件查找用戶數(shù)據(jù)庫,獲取該用戶所對(duì)應(yīng)的租戶身份標(biāo)識(shí),根據(jù)查詢請(qǐng)求中的數(shù)據(jù)表模式信息,從元數(shù)據(jù)表中查詢出相應(yīng)的元數(shù)據(jù)信息,將租戶中用戶發(fā)起的數(shù)據(jù)查詢請(qǐng)求進(jìn)行重寫。

重寫過程如下,根據(jù)邏輯SQL 語句,從中提取出查詢關(guān)鍵字,需要查詢的邏輯數(shù)據(jù)表、數(shù)據(jù)列等信息,根據(jù)這些信息從元數(shù)據(jù)表中查找出相應(yīng)的邏輯存儲(chǔ)表信息,將實(shí)際存儲(chǔ)的信息替換邏輯SQL 語句中的信息,完成重寫。

通用表存儲(chǔ)模式下,當(dāng)租戶發(fā)起業(yè)務(wù)數(shù)據(jù)模式新建時(shí),邏輯數(shù)據(jù)管理提出租戶信息,其中包含了租戶新建的數(shù)據(jù)表的列數(shù)及各列的描述,根據(jù)新建的命令,生成邏輯SQL 語句,提交到SQL 重寫器,SQL 重寫從邏輯SQL 語句中抽取出元數(shù)據(jù),數(shù)據(jù)表元數(shù)據(jù),字段表元數(shù)據(jù),關(guān)系表元數(shù)據(jù),并根據(jù)SQL 重寫算法,逐一生成物理SQL 語句,交予數(shù)據(jù)庫執(zhí)行,序列圖如下所示。

當(dāng)租戶查詢數(shù)據(jù)時(shí),SQL 查詢重寫器捕捉到租戶查詢的邏輯SQL 語句,訪問控制管理從邏輯SQL 語句中感知租戶身份,并根據(jù)租戶的權(quán)限,驗(yàn)證數(shù)據(jù)查詢是否超出租戶權(quán)限,若超出則返回,并給出超出權(quán)限提示。

通過驗(yàn)證則將邏輯查詢請(qǐng)求發(fā)送給SQL 重寫器,重寫器從邏輯SQL 語句中抽取出查詢字段,租戶虛擬表,查詢條件。根據(jù)租戶虛擬表從元數(shù)據(jù)中查詢出對(duì)應(yīng)的元數(shù)據(jù),查詢重寫器根據(jù)元數(shù)據(jù),將邏輯SQL 語句轉(zhuǎn)化為物理SQL 語句,并在數(shù)據(jù)庫中查詢執(zhí)行。

本文由@劉同學(xué) 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載

題圖來自Unsplash,基于CC0協(xié)議

該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺(tái)僅提供信息存儲(chǔ)空間服務(wù)。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒評(píng)論,等你發(fā)揮!