多租戶
什么是多租戶
多租戶指一套系統(tǒng)能夠支撐多個(gè)租戶。一個(gè)租戶通常是具有相似訪問模式和權(quán)限的一組用戶,典型的租戶是同一個(gè)組織或者公司的若干用戶例证。
要實(shí)現(xiàn)多租戶,首先需要考慮的是數(shù)據(jù)層面的多租戶迷捧。數(shù)據(jù)層的多租戶模型對(duì)上層服務(wù)和應(yīng)用的多租戶實(shí)現(xiàn)有突出影響织咧。本文重點(diǎn)介紹數(shù)據(jù)層多租戶對(duì)各種多租戶模型的支持。
權(quán)衡不同的多租戶實(shí)現(xiàn)方式時(shí)漠秋,需要考慮如下因素:
擴(kuò)展性:租戶數(shù)量級(jí)別笙蒙,以及未來發(fā)展趨勢(shì)
安全性:租戶之間數(shù)據(jù)隔離級(jí)別要求
資源共享:多租戶通常有某種形式的資源共享,需要避免某個(gè)租戶的糟糕SQL吃掉系統(tǒng)資源庆锦,影響其他租戶的響應(yīng)時(shí)間
靈活性:不同租戶可能有不同的需求捅位,對(duì)特定租戶需求的擴(kuò)展能力
跨租戶分析和優(yōu)化:對(duì)全部租戶或者多個(gè)租戶的數(shù)據(jù)和行為進(jìn)行分析的能力
運(yùn)維和管理:運(yùn)維管理的復(fù)雜度和便宜性,包括監(jiān)控搂抒、修改數(shù)據(jù)庫模式艇搀、創(chuàng)建索引、收集統(tǒng)計(jì)數(shù)據(jù)求晶、數(shù)據(jù)加載等
成本:總體擁有成本颖变,包括方案實(shí)現(xiàn)成本誓军、運(yùn)維成本等
多租戶模型
多租戶模型描述了租戶和該租戶的數(shù)據(jù)之間的映射關(guān)系逸月。不同的多租戶模型會(huì)影響數(shù)據(jù)庫和應(yīng)用程序的設(shè)計(jì)氧卧、管理和維護(hù)。
一租戶一數(shù)據(jù)庫
最簡(jiǎn)單的多租戶實(shí)現(xiàn)方式是為每一個(gè)租戶創(chuàng)建一個(gè)數(shù)據(jù)庫蚜锨,如下圖所示档插。應(yīng)用程序?yàn)槊總€(gè)租戶分配一個(gè)租戶id,并為每個(gè)租戶配置相應(yīng)的數(shù)據(jù)庫連接信息(包括數(shù)據(jù)庫ip亚再、端口等)郭膛。應(yīng)用程序根據(jù)租戶id連接到為其分配的數(shù)據(jù)庫。
這種模型中不同租戶的數(shù)據(jù)物理隔離氛悬,安全級(jí)別高则剃。如果每個(gè)租戶的數(shù)據(jù)庫使用不同的硬件和數(shù)據(jù)庫類型耘柱,則他們之間的資源使用也是物理隔離的;如果租戶的數(shù)據(jù)庫共用同一套硬件棍现,則需要對(duì)資源進(jìn)行合理分配和管理调煎,避免相互影響。由于不同租戶使用獨(dú)立的數(shù)據(jù)庫己肮,靈活性好士袄,容易滿足不同租戶的特定需求(譬如需要額外的字段)。出現(xiàn)故障時(shí)影響面小谎僻。缺點(diǎn)是數(shù)據(jù)庫數(shù)量大娄柳,維護(hù)復(fù)雜,擁有成本高艘绍。適合租戶數(shù)目比較少的場(chǎng)景赤拒。
一租戶一名字空間(Schema/Namespace)
多個(gè)租戶共享同一個(gè)數(shù)據(jù)庫,每個(gè)租戶擁有獨(dú)立的名字空間(或模式)诱鞠。應(yīng)用程序?yàn)槊總€(gè)租戶分配一個(gè)id挎挖,并把每個(gè)租戶的所有操作限制在為其分配的名字空間/模式之中。如下圖所示航夺。
這種多租戶模型下蕉朵,不同租戶的數(shù)據(jù)邏輯上相互隔離,安全控制相對(duì)簡(jiǎn)單敷存。不同租戶有不同的模式墓造,可以簡(jiǎn)便的滿足不同租戶的特定需求堪伍,靈活性高锚烦。對(duì)資源管理能力要求高,以避免不同租戶競(jìng)爭(zhēng)資源帝雇′潭恚可以把不同租戶的數(shù)據(jù)存儲(chǔ)在不同的磁盤上,降低了對(duì)磁盤IO的競(jìng)爭(zhēng)尸闸。運(yùn)維和管理較復(fù)雜彻亲,不易實(shí)現(xiàn)大量租戶的跨租戶分析。適合租戶數(shù)目適中的場(chǎng)景吮廉。
全共享方式
不同租戶共享同一個(gè)數(shù)據(jù)庫苞尝、同一個(gè)名字空間。不同租戶的數(shù)據(jù)在同一組表中共存宦芦,通過租戶id標(biāo)記和訪問不同租戶的數(shù)據(jù)(應(yīng)用需要調(diào)整訪問數(shù)據(jù)的SQL以包含租戶id)宙址。如下圖所示。
這種多租戶模型中调卑,不同租戶的數(shù)據(jù)物理存儲(chǔ)在一起抡砂,對(duì)系統(tǒng)的資源隔離和安全隔離要求很高大咱。運(yùn)維相對(duì)簡(jiǎn)單。擴(kuò)展能力好注益,可以支持較多數(shù)量租戶碴巾。由于租戶數(shù)據(jù)存儲(chǔ)在一起,跨租戶數(shù)據(jù)分析和優(yōu)化非常簡(jiǎn)單丑搔。成本低厦瓢,可以較低的代價(jià)支持更多的租戶。
全共享模型中啤月,很多數(shù)據(jù)庫采用添加大量自定義字段的方式滿足不同租戶的特定需求旷痕,以提高靈活性。這種方式有諸多局限性顽冶,譬如字段數(shù)目不能太多欺抗、管理復(fù)雜等。支持更多半結(jié)構(gòu)化數(shù)據(jù)强重,包括JSON 等绞呈,通過這種半結(jié)構(gòu)化數(shù)據(jù),可以更靈活间景、高效佃声、便捷的滿足不同租戶的特定需求。
案例剖析
下面我通過用一個(gè)簡(jiǎn)單的全共享數(shù)據(jù)庫的多租戶模式的案例倘要,來對(duì)PaaS平臺(tái)型軟件進(jìn)行演示圾亏。
系統(tǒng)賬戶層級(jí)如下圖所示:
在上圖這個(gè)系統(tǒng)用戶的層級(jí)關(guān)系中,我們需要四張表:
ga_user:此表用于存儲(chǔ)PaaS平臺(tái)T1內(nèi)所有的賬戶相關(guān)信息封拧,如laowang@test.com,zhangshan@test.com,jingwa@test.com等賬戶和密碼志鹃。此表用于登錄平臺(tái)時(shí),系統(tǒng)認(rèn)證和權(quán)限控制時(shí)所用泽西。
tenant:用于存儲(chǔ)所有的租戶信息曹铃,如SaaS A, SaaS B,SaaS C。
customer:用于存儲(chǔ)所有的客戶信息捧杉,如消費(fèi)客戶/組織S1,消費(fèi)客戶/組織S2陕见。
device:用于存儲(chǔ)平臺(tái)內(nèi)所有客戶,租戶的設(shè)備相關(guān)信息味抖。
具體流程,可以概括為:
我們用PaaS平臺(tái)系統(tǒng)管理員帳號(hào)laowang@test.com登錄系統(tǒng)评甜。
在系統(tǒng)中,新建SaaS A, SaaS B,SaaS C三個(gè)組織或者客戶仔涩,并為這三個(gè)租戶分配各種租戶的租戶管理員賬戶忍坷,分別為zhangsan@test.com, lisi@test.com,wangwu@test.com。當(dāng)我們用這三個(gè)賬戶登錄系統(tǒng)時(shí),系統(tǒng)根據(jù)租戶id和相應(yīng)的權(quán)限顯示對(duì)應(yīng)的框架內(nèi)容和組織信息承匣。
這三個(gè)組織利用PaaS平臺(tái)上的服務(wù)框架和應(yīng)用為需要的客戶和組織提供一站式解決方案蓖乘,有點(diǎn)類似我們采用阿里云平臺(tái)上的服務(wù)框架來解決自己的企業(yè)需求。
當(dāng)SaaS B具體到實(shí)施項(xiàng)目時(shí)韧骗,為消費(fèi)客戶/組織S1或消費(fèi)客戶/組織S2分配帳號(hào)進(jìn)行公有云訂閱服務(wù)嘉抒,進(jìn)行項(xiàng)目迭代交付或者本地化實(shí)施。
UML實(shí)體圖如下: