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