團隊開發(fā)框架實戰(zhàn)—多租戶架構(gòu)

1 對多租戶的理解

多租戶定義:多租戶技術(shù)或稱多重租賃技術(shù)义屏,簡稱SaaS桥狡,是一種軟件架構(gòu)技術(shù)六水,是實現(xiàn)如何在多用戶環(huán)境下(此處的多用戶一般是面向企業(yè)用戶)共用相同的系統(tǒng)或程序組件喂柒,并且可確保各用戶間數(shù)據(jù)的隔離性。簡單講:在一臺服務器上運行單個應用實例檬输,它為多個租戶(客戶)提供服務。從定義中我們可以理解:多租戶是一種架構(gòu)匈棘,目的是為了讓多用戶環(huán)境下使用同一套程序丧慈,且保證用戶間數(shù)據(jù)隔離。那么重點就很淺顯易懂了主卫,多租戶的重點就是同一套程序下實現(xiàn)多用戶數(shù)據(jù)的隔離逃默。對于實現(xiàn)方式鹃愤,我們下面會討論到。
在了解詳細一點:在一個多租戶的結(jié)構(gòu)下笑旺,應用都是運行在同樣的或者是一組服務器下昼浦,這種結(jié)構(gòu)被稱為“單實例”架構(gòu)(Single Instance),單實例多租戶筒主。多個租戶的數(shù)據(jù)是保存在相同位置关噪,依靠對數(shù)據(jù)庫分區(qū)來實現(xiàn)隔離操作。既然用戶都在運行相同的應用實例乌妙,服務運行在服務供應商的服務器上使兔,用戶無法去進行定制化的操作,所以這對于對該產(chǎn)品有特殊需要定制化的客戶就無法適用藤韵,所以多租戶適合通用類需求的客戶虐沥。那么缺點來了,多租戶下無法實現(xiàn)用戶的定制化操作泽艘。
在翻閱多租戶的資料時欲险,還有一個名詞與之相對應,那就是單租戶SaaS架構(gòu)(也被稱作多實例架構(gòu)(Multiple Instance))匹涮。單租戶架構(gòu)與多租戶的區(qū)別在于天试,單租戶是為每個客戶單獨創(chuàng)建各自的軟件應用和支撐環(huán)境。單租戶SaaS被廣泛引用在客戶需要支持定制化的應用場合然低,而這種定制或者是因為地域喜每,抑或是他們需要更高的安全控制。通過單租戶的模式雳攘,每個客戶都有一份分別放在獨立的服務器上的數(shù)據(jù)庫和操作系統(tǒng)带兜,或者使用強的安全措施進行隔離的虛擬網(wǎng)絡(luò)環(huán)境中。因為本篇主要是討論多租戶吨灭,所以單租戶的相關(guān)知識就簡單了解一下刚照,不做過多的闡述了。

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

在當下云計算時代喧兄,多租戶技術(shù)在共用的數(shù)據(jù)中心以單一系統(tǒng)架構(gòu)與服務提供多數(shù)客戶端相同甚至可定制化的服務无畔,并且仍可以保障客戶的數(shù)據(jù)隔離。目前各種各樣的云計算服務就是這類技術(shù)范疇繁莹,例如阿里云數(shù)據(jù)庫服務(RDS)、阿里云服務器等等特幔。
多租戶在數(shù)據(jù)存儲上存在三種主要的方案咨演,分別是:

2.1 獨立數(shù)據(jù)庫

這是第一種方案,即一個租戶一個數(shù)據(jù)庫蚯斯,這種方案的用戶數(shù)據(jù)隔離級別最高薄风,安全性最好饵较,但成本較高

  • 優(yōu)點:為不同的租戶提供獨立的數(shù)據(jù)庫遭赂,有助于簡化數(shù)據(jù)模型的擴展設(shè)計循诉,滿足不同租戶的獨特需求;如果出現(xiàn)故障撇他,恢復數(shù)據(jù)比較簡單茄猫。
  • 缺點: 增多了數(shù)據(jù)庫的安裝數(shù)量,隨之帶來維護成本和購置成本的增加困肩。

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

2.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ù)漠秋,存在一定困難笙蒙。

2.3 共享數(shù)據(jù)庫,共享 Schema庆锦,共享數(shù)據(jù)表

這是第三種方案捅位,即租戶共享同一個Database、同一個Schema,但在表中增加TenantID多租戶的數(shù)據(jù)字段艇搀。這是共享程度最高尿扯、隔離級別最低的模式
即每插入一條數(shù)據(jù)時都需要有一個客戶的標識焰雕。這樣才能在同一張表中區(qū)分出不同客戶的數(shù)據(jù)衷笋。

  • 優(yōu)點:三種方案比較,第三種方案的維護和購置成本最低矩屁,允許每個數(shù)據(jù)庫支持的租戶數(shù)量最多辟宗。
  • 缺點: 隔離級別最低,安全性最低档插,需要在設(shè)計開發(fā)時加大對安全的開發(fā)量慢蜓; 數(shù)據(jù)備份和恢復最困難,需要逐表逐條備份和還原郭膛。如果希望以最少的服務器為最多的租戶提供服務晨抡,并且租戶接受犧牲隔離級別換取降低成本,這種方案最適合则剃。
        
    在SaaS實施過程中耘柱,有一個顯著的考量點,就是如何對應用數(shù)據(jù)進行設(shè)計棍现,以支持多租戶调煎,而這種設(shè)計的思路,是要在數(shù)據(jù)的共享己肮、安全隔離和性能間取得平衡士袄。

3 選擇合理的實現(xiàn)模式

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

  • 成本角度因素
    隔離性越好谎僻,設(shè)計和實現(xiàn)的難度和成本越高娄柳,初始成本越高。共享性越好艘绍,同一運營成本下支持的用戶越多赤拒,運營成本越低。
  • 安全因素
    要考慮業(yè)務和客戶的安全方面的要求诱鞠。安全性要求越高挎挖,越要傾向于隔離。
  • 從租戶數(shù)量上考慮
    主要考慮下面一些因素航夺。
    系統(tǒng)要支持多少租戶蕉朵?上百?上千還是上萬阳掐?可能的租戶越多始衅,越傾向于共享堪伍。
    平均每個租戶要存儲數(shù)據(jù)需要的空間大小。存貯的數(shù)據(jù)越多觅闽,越傾向于隔離。
    每個租戶的同時訪問系統(tǒng)的最終用戶數(shù)量涮俄。需要支持的越多蛉拙,越傾向于隔離。
    是否想針對每一租戶提供附加的服務彻亲,例如數(shù)據(jù)的備份和恢復等孕锄。這方面的需求越多, 越傾向于隔離苞尝。
  • 技術(shù)儲備
    共享性越高畸肆,對技術(shù)的要求越高。

4 團隊開發(fā)框架實戰(zhàn)—多租戶支持

多租戶技術(shù)的實現(xiàn)重點宙址,在于不同租戶間應用程序環(huán)境的隔離(application context isolation)以及數(shù)據(jù)的隔離(data isolation)轴脐,以維持不同租戶間應用程序不會相互干擾,同時數(shù)據(jù)的保密性也夠強抡砂。
多租戶數(shù)據(jù)庫構(gòu)架方式主要分為:獨立數(shù)據(jù)庫(私有表)大咱、共享數(shù)據(jù)庫隔離數(shù)據(jù)框架(擴展表)、共享數(shù)據(jù)庫共享數(shù)據(jù)框架(通用表)注益。
以上架構(gòu)模式中碴巾,數(shù)據(jù)隔離程度相對較差,數(shù)據(jù)共享程度越高丑搔,越能夠支持較多的租戶厦瓢,同時設(shè)備成本越低,但同時數(shù)據(jù)維護難度越大啤月。如敏感數(shù)據(jù)較多煮仇,則選擇共享數(shù)據(jù)庫隔離數(shù)據(jù)框架,否則可選擇共享數(shù)據(jù)庫共享數(shù)據(jù)框架的方式進行數(shù)據(jù)存儲構(gòu)架顽冶。
本項目系統(tǒng)可能出現(xiàn)數(shù)量較多的租戶欺抗,同時設(shè)備有限,所以選取共享數(shù)據(jù)庫共享數(shù)據(jù)框架(通用表)的數(shù)據(jù)存儲結(jié)構(gòu)强重。

多租戶結(jié)構(gòu)示意圖.png

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

多租戶表結(jié)構(gòu)示意圖.png

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

多通用表與鍵值對的數(shù)據(jù)存儲工作過程.png

在圖中秘血,多租戶數(shù)據(jù)管理系統(tǒng)主要進行的數(shù)據(jù)操作是開發(fā)視圖下進行的,主要操作有對租戶數(shù)據(jù)模型的定義和擴展评甜、租戶數(shù)據(jù)的持久化存儲和查詢讀取灰粮。在對租戶數(shù)據(jù)模型的定義和擴展過程中,需要將租戶的信息提取出來單獨存儲忍坷;對租戶所定義的數(shù)據(jù)表包含的數(shù)據(jù)表名稱粘舟、數(shù)據(jù)表中列名稱、列值的類型佩研、列值的數(shù)據(jù)長度蓖乘、數(shù)據(jù)表與其他表中的關(guān)系等元數(shù)據(jù)提取出來進行管理。租戶數(shù)據(jù)的持久化存儲和查詢讀取操作韧骗,先對租戶的身份進行驗證嘉抒,防止租戶對其他租戶數(shù)據(jù)進行操作。通過物理SQL 語句生成模塊將租戶數(shù)據(jù)查詢操作的邏輯SQL 與轉(zhuǎn)化成能夠直接在邏輯存儲層執(zhí)行的SQL 語句袍暴。

  • 租戶數(shù)據(jù)模型定義部件描述了租戶的定制信息些侍。這種定制信息描述了租戶定制的數(shù)據(jù)表的名稱、數(shù)據(jù)類型政模、約束關(guān)系等岗宣。
  • 邏輯SQL,是由租戶發(fā)起的數(shù)據(jù)查詢查詢請求淋样。在數(shù)據(jù)管理分層模型中耗式,開發(fā)視圖下,屏蔽了租戶無關(guān)的數(shù)據(jù)特性趁猴。租戶可以通過相關(guān)的接口進行數(shù)據(jù)查詢刊咳,因此邏輯SQL 與標準SQL 沒有區(qū)別。
  • 物理SQL是用于實際查詢數(shù)據(jù)的SQL語句儡司,它工作在邏輯存儲視圖層娱挨。物理SQL 是將邏輯SQL 語句邏輯數(shù)據(jù)表結(jié)構(gòu)轉(zhuǎn)換成底層數(shù)據(jù)的物理數(shù)據(jù)表結(jié)構(gòu)所形成的能夠在底層數(shù)據(jù)庫中執(zhí)行的SQL 語句。
  • 查詢重寫器的功能是將邏輯SQL 語句進行重新構(gòu)造將其轉(zhuǎn)換為能夠在通用表上執(zhí)行的物理SQL 語句捕犬。查詢重寫器獲取租戶發(fā)出的查詢請求跷坝,從數(shù)據(jù)庫中獲取租戶信息酵镜,根據(jù)租戶查詢的數(shù)據(jù)表對應的元數(shù)據(jù)信息,將租戶的查詢請求柴钻,轉(zhuǎn)換成為邏輯存儲層面上淮韭,數(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ù)產(chǎn)生影響。

當租戶進行數(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 語句硫眯,從中提取出查詢關(guān)鍵字蕴侧,需要查詢的邏輯數(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ù)酝碳,關(guān)系表元數(shù)據(jù)矾踱,并根據(jù)SQL 重寫算法,逐一生成物理SQL 語句疏哗,交予數(shù)據(jù)庫執(zhí)行呛讲,序列圖如下所示。

新建業(yè)務數(shù)據(jù)模型序列圖.png

當租戶查詢數(shù)據(jù)時返奉,SQL 查詢重寫器捕捉到租戶查詢的邏輯SQL 語句贝搁,訪問控制管理從邏輯SQL 語句中感知租戶身份,并根據(jù)租戶的權(quán)限芽偏,驗證數(shù)據(jù)查詢是否超出租戶權(quán)限雷逆,若超出則返回,并給出超出權(quán)限提示污尉。通過驗證則膀哲,將邏輯查詢請求發(fā)送給SQL 重寫器,重寫器從邏輯SQL 語句中抽取出查詢字段被碗,租戶虛擬表某宪,查詢條件。根據(jù)租戶虛擬表從元數(shù)據(jù)中查詢出對應的元數(shù)據(jù)锐朴,查詢重寫器根據(jù)元數(shù)據(jù)兴喂,將邏輯SQL 語句轉(zhuǎn)化為物理SQL 語句,并在數(shù)據(jù)庫中查詢執(zhí)行焚志。如圖所示瞻想。

數(shù)據(jù)查詢時序圖.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市娩嚼,隨后出現(xiàn)的幾起案子蘑险,更是在濱河造成了極大的恐慌,老刑警劉巖岳悟,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佃迄,死亡現(xiàn)場離奇詭異,居然都是意外死亡贵少,警方通過查閱死者的電腦和手機呵俏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滔灶,“玉大人普碎,你說我怎么就攤上這事÷计剑” “怎么了麻车?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵缀皱,是天一觀的道長。 經(jīng)常有香客問我动猬,道長啤斗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任赁咙,我火速辦了婚禮钮莲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彼水。我一直安慰自己崔拥,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布凤覆。 她就那樣靜靜地躺著链瓦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叛赚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天稽揭,我揣著相機與錄音俺附,去河邊找鬼。 笑死溪掀,一個胖子當著我的面吹牛事镣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揪胃,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼璃哟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喊递?” 一聲冷哼從身側(cè)響起随闪,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骚勘,沒想到半個月后铐伴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡俏讹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年当宴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泽疆。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡户矢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殉疼,到底是詐尸還是另有隱情梯浪,我是刑警寧澤捌年,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站驱证,受9級特大地震影響延窜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抹锄,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一逆瑞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧伙单,春花似錦获高、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至布疼,卻和暖如春摊趾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背游两。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工砾层, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贱案。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓肛炮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宝踪。 傳聞我的和親對象是個殘疾皇子侨糟,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容