實戰saas系統多租戶數據隔離(一)數據隔離方案

目錄

0. 前言

1. 什麼是saas系統

2. 什麼是多租戶

3. 數據隔離方案

3.1 每個租戶提供獨立的數據庫系統

3.2 每個租戶提供獨立的表空間

3.3 按租戶id字段區分租戶

4. 三種數據隔離方案的優劣勢分析

5. 爲土豪準備的解決方案

總結

參考資料


 

0. 前言

前幾天跟朋友聚會的時候,朋友說他們公司準備自己搞一套saas系統,以實現多個第三方平臺的業務接入需求。聊完以後,實在手癢難耐,於是花了兩天時間自己實現了兩個saas系統多租戶數據隔離實現方案。俗話說“獨樂樂不如衆樂樂”,所以我把我的“研究成果”寫出來,讓大家樂呵樂呵。

在給大家分享我的研究成果之前,我們先來了解一下相關的概念。如果對這部分內容熟悉的同學,可以直接略過。

 

1. 什麼是saas系統

引用百度百科上面的描述, “SaaS平臺是運營saas軟件的平臺。SaaS提供商爲企業搭建信息化所需要的所有網絡基礎設施及軟件、硬件運作平臺,並負責所有前期的實施、後期的維護等一系列服務,企業無需購買軟硬件、建設機房、招聘IT人員,即可通過互聯網使用信息系統。SaaS 是一種軟件佈局模型,其應用專爲網絡交付而設計,便於用戶通過互聯網託管、部署及接入。”

也就是說,我只需要能連接上互聯網,並且給saas平臺交租金,我就能用saas平臺給我提供的服務。這方面最典型的例子就是各種雲平臺,例如阿里雲。既然我能通過互聯網使用saas平臺提供的服務,那麼其他人當然也是可以的。於是這就產生了一個多租戶的問題。

 

2. 什麼是多租戶

租戶可以簡單理解爲客戶,即租用saas系統資源的那一方。打個比方,如果saas系統是一棟辦公樓的話,那租用辦公樓寫字間的公司就是租戶。那很顯然,一棟辦公樓一般是會租個多個公司去使用的。這些公司就是saas系統的租戶。

多租戶問題,其是一種架構設計方式,就是在一臺或者一組服務器上運行的saas系統,可以爲多個租戶(客戶)提供服務,目的是爲了讓多個租戶在互聯網環境下使用同一套程序,且保證租戶間的數據隔離。從這種架構設計的模式上,不難看出來,多租戶架構的重點就是同一套程序下多個租戶數據的隔離。由於租戶數據是集中存儲的,所以要實現數據的安全性,就是看能否實現對租戶數據的隔離,防止租戶數據不經意或被他人惡意地獲取和篡改。

 

3. 數據隔離方案

目前saas多租戶系統的數據隔離有三種解決方案,即爲每個租戶提供獨立的數據庫、獨立的表空間、按字段區分租戶,每種方案都有其各自的適用情況。下面我們依次說明這3種方案。

3.1 每個租戶提供獨立的數據庫系統

這種方案的實現方式是所有租戶共享同一個應用,但應用後端會連接多個數據庫系統,一個租戶單獨使用一個數據庫系統。這種方案的用戶數據隔離級別最高,安全性最好,租戶間的數據能夠實現物理隔離。但成本較高。

 

3.2 每個租戶提供獨立的表空間

這種方案的實現方式,就是所有租戶共享同一個應用,應用後端只連接一個數據庫系統,所有租戶共享這個數據庫系統,每個租戶在數據庫系統中擁有一個獨立的表空間。

 

3.3 按租戶id字段區分租戶

這種方案是多租戶方案中最簡單的設計方式,即在每張表中都添加一個用於區分租戶的字段(如租戶id或租戶代碼)來標識每條數據屬於哪個租戶,其作用很像外鍵。當進行查詢的時候每條語句都要添加該字段作爲過濾條件,其特點是所有租戶的數據全都存放在同一個表中,數據的隔離性是最低的,完全是通過字段來區分的。

 

4. 三種數據隔離方案的優劣勢分析

隔離方案 成本 支持租戶數量 優點 不足

獨立數據庫系統

隔離級別最高,安全性最好,能夠滿足不同租戶的獨特需求,出現故障時恢復數據比較容易 數據庫需要獨立安裝,維護成本和購置成本高

共享數據庫,獨立表空間

較多 提供了一定程度的邏輯數據隔離,一個數據庫系統可支持多個租戶 出現故障的情況下,數據恢復相對而言比較複雜
按租戶id字段區分 非常多 維護和購置成本最低,每個數據庫能夠支持的租戶數量最多 隔離級別最低,安全性也最低,數據備份和恢復非常複雜,需要逐表逐條備份和還原

 

5. 爲土豪準備的解決方案

前面咱們說的那三種數據隔離解決方案,都是多個租戶共享一個應用實例的。如果你是土豪,非常的不差錢,那這裏就還有一種一個租戶一個應用實例的解決方案,直接爲土豪量身定製,純24k鈦合金的。

這種方案是在多實例系統的基礎上進行負載均衡,將租戶的訪問請求路由到其專屬的租戶系統上去。這種多實例的部署架構,可以爲每個租戶定製代碼,以及提供特色服務。當然,使用這種解決方案提供服務的租戶,那也肯定不差錢,能負擔高額租金的“大客戶”了。

 

總結

saas系統中需要解決的最核心的問題是租戶的數據隔離問題,我們看到解決這個問題有好幾種方式,這就需要我們在業務場景中去根據實際情況進行選擇。

下一篇文章,我們就來看一下,如何根據租戶id字段來實現同一張表中不同租戶的數據的crud(即增刪改查)。提前劇透一下,我們將使用 springboot + mybatis plus 來實現這種數據隔離方案。

 

參考資料

https://www.mingzhe.org/blog/2017/08/01/multiple-tenants-architecture-introduction/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章