多租戶(hù)SaaS平臺(tái)的數(shù)據(jù)庫(kù)方案詳解
圖片
1. 什么是多租戶(hù)
多租戶(hù)(Multi-Tenancy)是一種架構(gòu)模型,實(shí)現(xiàn)如何在多用戶(hù)環(huán)境下(此處的多用戶(hù)一般是面向企業(yè)用戶(hù))共用相同的系統(tǒng)或程序組件,并且可確保各用戶(hù)間數(shù)據(jù)的隔離性,使它們共享相同的系統(tǒng)資源,但又能夠在邏輯上彼此獨(dú)立。在多租戶(hù)架構(gòu)中,租戶(hù)可以是企業(yè)、組織或個(gè)人,它們之間共享同一應(yīng)用的實(shí)例,但其數(shù)據(jù)和配置是隔離的。那么重點(diǎn)就很淺顯易懂了,多租戶(hù)的重點(diǎn)就是同一套程序下實(shí)現(xiàn)多用戶(hù)數(shù)據(jù)的隔離
2. 傳統(tǒng)軟件模式和SaaS(Software as a Service)模式對(duì)比
傳統(tǒng)軟件模式:
- 買(mǎi)賣(mài)關(guān)系: 傳統(tǒng)軟件模式是一種買(mǎi)斷的交易模式,客戶(hù)通過(guò)購(gòu)買(mǎi)軟件的許可證或使用權(quán)來(lái)獲取軟件的所有權(quán),包括源碼。
- 部署到企業(yè)內(nèi)部: 在傳統(tǒng)軟件模式中,客戶(hù)通常需要將軟件部署在自己的服務(wù)器或計(jì)算機(jī)上,構(gòu)建和維護(hù)一套獨(dú)立的軟件系統(tǒng)。
- 定制和維護(hù): 客戶(hù)擁有軟件的源碼,因此可以對(duì)軟件進(jìn)行定制和修改以滿(mǎn)足特定需求。同時(shí),客戶(hù)需要負(fù)責(zé)軟件的定期維護(hù)、更新和管理。
- 獨(dú)立部署: 不同的企業(yè)之間通常各自部署獨(dú)立的軟件系統(tǒng),軟件的定制和運(yùn)行環(huán)境可能因企業(yè)而異。
SaaS模式:
- 服務(wù)提供商: 在SaaS模式中,軟件由服務(wù)提供商托管在云服務(wù)或自己的服務(wù)器上,客戶(hù)通過(guò)訂閱服務(wù)來(lái)使用軟件,而不是購(gòu)買(mǎi)軟件的使用權(quán)。
- 統(tǒng)一部署: 所有客戶(hù)共享同一套部署在服務(wù)提供商服務(wù)器上的軟件實(shí)例。這種集中式部署使得軟件的更新和維護(hù)更為方便。
- 按需付費(fèi): 客戶(hù)按照實(shí)際使用的服務(wù)量或功能付費(fèi),通常以訂閱的方式進(jìn)行計(jì)費(fèi),而不需要一次性支付較高的許可費(fèi)用。
- 基于WEB的軟件: SaaS模式通常提供基于WEB的軟件服務(wù),用戶(hù)可以通過(guò)瀏覽器或其他客戶(hù)端訪問(wèn),而不需要在本地安裝軟件。
- 無(wú)需定期維護(hù)與管理: 由服務(wù)提供商負(fù)責(zé)軟件的維護(hù)、更新和管理,客戶(hù)無(wú)需關(guān)心底層的技術(shù)細(xì)節(jié),可以更專(zhuān)注于業(yè)務(wù)
圖片
總的來(lái)說(shuō),傳統(tǒng)軟件模式注重客戶(hù)對(duì)軟件的購(gòu)買(mǎi)和所有權(quán),需要自行部署和維護(hù);而SaaS模式則強(qiáng)調(diào)服務(wù)提供商通過(guò)云服務(wù)為客戶(hù)提供方便、靈活的軟件使用方式,降低了客戶(hù)的部署和管理負(fù)擔(dān)。選擇使用哪種模式取決于企業(yè)的需求、預(yù)算和對(duì)定制化程度的要求。
在SaaS平臺(tái)里需要使用共用的數(shù)據(jù)中心以單一系統(tǒng)架構(gòu)與服務(wù)提供多數(shù)客戶(hù)端相同甚至可定制化的服務(wù),并且仍可以保障客戶(hù)的數(shù)據(jù)正常使用。由此帶來(lái)了新的挑戰(zhàn),就是如何對(duì)應(yīng)用數(shù)據(jù)進(jìn)行設(shè)計(jì),以支持多租戶(hù),而這種設(shè)計(jì)的 思路,是要在數(shù)據(jù)的共享、安全隔離和性能間取得平衡
3. 多租戶(hù)的數(shù)據(jù)庫(kù)方案分析
目前基于多租戶(hù)的數(shù)據(jù)庫(kù)設(shè)計(jì)方案通常有如下三種:
- 獨(dú)立數(shù)據(jù)庫(kù)
- 共享數(shù)據(jù)庫(kù)、獨(dú)立 Schema
- 共享數(shù)據(jù)庫(kù)、共享數(shù)據(jù)表
3.1. 獨(dú)立數(shù)據(jù)庫(kù)
在獨(dú)立數(shù)據(jù)庫(kù)方案中,每個(gè)租戶(hù)擁有一個(gè)獨(dú)立的數(shù)據(jù)庫(kù)。每個(gè)數(shù)據(jù)庫(kù)包含了相同的表結(jié)構(gòu),但是數(shù)據(jù)完全獨(dú)立。這是一種高度隔離方案。
優(yōu)點(diǎn):
- 數(shù)據(jù)高度隔離,確保租戶(hù)數(shù)據(jù)的完全獨(dú)立性,有助于簡(jiǎn)化數(shù)據(jù)模型的擴(kuò)展設(shè)計(jì),滿(mǎn)足不同租戶(hù)的獨(dú)特需求
- 易于管理和維護(hù),每個(gè)租戶(hù)有獨(dú)立的數(shù)據(jù)庫(kù),如果出現(xiàn)故障,恢復(fù)數(shù)據(jù)比較簡(jiǎn)單
缺點(diǎn):
- 需要大量的數(shù)據(jù)庫(kù)實(shí)例,增加了成本和維護(hù)復(fù)雜度
這種方案與傳統(tǒng)的一個(gè)客戶(hù)、一套數(shù)據(jù)、一套部署類(lèi)似,差別只在于軟件統(tǒng)一部署在運(yùn)營(yíng)商那里。由此可見(jiàn)此方案用戶(hù)數(shù)據(jù)隔離級(jí)別最高,安全性最好,但是成本較高
3.2. 共享數(shù)據(jù)庫(kù)、獨(dú)立 Schema(模式)
oracle數(shù)據(jù)庫(kù):在oracle中一個(gè)數(shù)據(jù)庫(kù)可以具有多個(gè)用戶(hù),那么一個(gè)用戶(hù)一般對(duì)應(yīng)一個(gè)Schema,表都是建立在Schema中的,(可以簡(jiǎn)單的理解:在oracle中一個(gè)用戶(hù)一套數(shù)據(jù)庫(kù)表)
圖片
在 MySQL 中,"Schema" 和 "Database" 可以認(rèn)為是相同的概念。在 SQL 語(yǔ)句中,"CREATE DATABASE" 和 "CREATE SCHEMA" 基本上是等效的。所以,當(dāng)你創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)時(shí),你也在事實(shí)上創(chuàng)建了一個(gè)模式。模式是一個(gè)邏輯上的容器,用于組織和管理數(shù)據(jù)庫(kù)對(duì)象,如表、視圖、存儲(chǔ)過(guò)程等。在 MySQL 中,模式和數(shù)據(jù)庫(kù)可以互換使用。
優(yōu)點(diǎn):
- 提供較高的數(shù)據(jù)隔離,每個(gè)租戶(hù)的表存在于獨(dú)立的schema中,每個(gè)數(shù)據(jù)庫(kù)可支持更多的租戶(hù)數(shù)量
- 相對(duì)容易管理和維護(hù),數(shù)據(jù)庫(kù)結(jié)構(gòu)相對(duì)簡(jiǎn)單
缺點(diǎn):
- 需要?jiǎng)討B(tài)創(chuàng)建和管理schema,增加了復(fù)雜性,如果出現(xiàn)故障,數(shù)據(jù)恢復(fù)比較困難,因?yàn)榛謴?fù)數(shù)據(jù)庫(kù)將牽涉到其他租戶(hù)的數(shù)據(jù); 如果需要跨租戶(hù)統(tǒng)計(jì)數(shù)據(jù),存在一定困難
- 一些數(shù)據(jù)庫(kù)系統(tǒng)對(duì)schema的支持不夠完善
共享數(shù)據(jù)庫(kù)、獨(dú)立 Schema方案其實(shí)就是假如我在服務(wù)器上安裝了一個(gè)mysql服務(wù)端,然后每一個(gè)用戶(hù)就給他創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)database,這樣多個(gè)用戶(hù)就只需要?jiǎng)?chuàng)建多個(gè)database數(shù)據(jù)庫(kù)即可,不需要像獨(dú)立數(shù)據(jù)庫(kù)方案一樣每一個(gè)用戶(hù)我就要去搭建一個(gè)mysql服務(wù)端
3.3. 共享數(shù)據(jù)庫(kù)、共享數(shù)據(jù)表
在共享數(shù)據(jù)庫(kù)方案中,所有租戶(hù)共享同一個(gè)數(shù)據(jù)庫(kù),但在每個(gè)表中添加一個(gè)租戶(hù)ID字段,以區(qū)分不同租戶(hù)的數(shù)據(jù)。這種方案需要確保所有查詢(xún)都帶上租戶(hù)ID。
優(yōu)點(diǎn):
- 節(jié)省數(shù)據(jù)庫(kù)實(shí)例和資源,減少了成本。
- 相對(duì)容易管理和維護(hù),數(shù)據(jù)庫(kù)結(jié)構(gòu)相對(duì)簡(jiǎn)單
缺點(diǎn):
- 數(shù)據(jù)隔離相對(duì)較弱,需要確保查詢(xún)時(shí)都帶上租戶(hù)ID,容易出現(xiàn)橫向越權(quán)。
- 在設(shè)計(jì)開(kāi)發(fā)時(shí)加大對(duì)安全的開(kāi)發(fā)量,數(shù)據(jù)備份和恢復(fù)最困難
共享數(shù)據(jù)庫(kù)、共享數(shù)據(jù)表和基于傳統(tǒng)應(yīng)用的數(shù)據(jù)庫(kù)設(shè)計(jì)并沒(méi)有任何區(qū)別,但是由于所有租戶(hù)使用相同的數(shù)據(jù)庫(kù)表,所以需要做好對(duì)每個(gè)租戶(hù)數(shù)據(jù)的隔離安全性處理,這就增加了系統(tǒng)設(shè)計(jì)和數(shù)據(jù)管理方面的復(fù)雜程度。